OSDN Git Service

FastISel: For calls, prefer using the callee's address as a constant
authorDan Gohman <gohman@apple.com>
Wed, 17 Sep 2008 21:18:49 +0000 (21:18 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 17 Sep 2008 21:18:49 +0000 (21:18 +0000)
over having it in a register. And wait until after checking type
legality before requesting that the callee address be placed in a
register. Also, fix support for calls with void return type.

This speeds up fast-isel isel time by about 15% and reduces
instruction counts by about 3% overall on certain testcases. It also
changes many indirect calls to direct calls.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56292 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FastISel.cpp

index 63444ca..6e23fe7 100644 (file)
@@ -748,15 +748,6 @@ bool X86FastISel::X86SelectCall(Instruction *I) {
       return false;
   }
 
-  // Materialize callee address in a register. FIXME: GV address can be
-  // handled with a CALLpcrel32 instead.
-  unsigned CalleeOp = getRegForValue(Callee);
-  if (CalleeOp == 0) {
-    if (!isa<Constant>(Callee) || !X86SelectConstAddr(Callee, CalleeOp, true))
-      // Unhandled operand. Halt "fast" selection and bail.
-      return false;    
-  }
-
   // Handle only C and fastcc calling conventions for now.
   CallSite CS(CI);
   unsigned CC = CS.getCallingConv();
@@ -774,9 +765,21 @@ bool X86FastISel::X86SelectCall(Instruction *I) {
   // Handle *simple* calls for now.
   const Type *RetTy = CS.getType();
   MVT RetVT;
-  if (!isTypeLegal(RetTy, TLI, RetVT, true))
+  if (RetTy == Type::VoidTy)
+    RetVT = MVT::isVoid;
+  else if (!isTypeLegal(RetTy, TLI, RetVT, true))
     return false;
 
+  // Materialize callee address in a register. FIXME: GV address can be
+  // handled with a CALLpcrel32 instead.
+  unsigned CalleeOp = 0;
+  if (!isa<Constant>(Callee) || !X86SelectConstAddr(Callee, CalleeOp, true)) {
+    CalleeOp = getRegForValue(Callee);
+    if (CalleeOp == 0)
+      // Unhandled operand. Halt "fast" selection and bail.
+      return false;    
+  }
+
   // Allow calls which produce i1 results.
   bool AndToI1 = false;
   if (RetVT == MVT::i1) {