diff options
| author | Dan Gohman <gohman@apple.com> | 2008-09-17 21:18:49 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2008-09-17 21:18:49 +0000 |
| commit | af13bf1ebdae2a23db2bb60569e1ab722e9f8b14 (patch) | |
| tree | 30b90c0102a597fa5f124df809bac78663c30a81 | |
| parent | d9d1f5f52213d3646fc931993272e8c55f13ff16 (diff) | |
| download | bcm5719-llvm-af13bf1ebdae2a23db2bb60569e1ab722e9f8b14.tar.gz bcm5719-llvm-af13bf1ebdae2a23db2bb60569e1ab722e9f8b14.zip | |
FastISel: For calls, prefer using the callee's address as a constant
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.
llvm-svn: 56292
| -rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 63444ca7e25..6e23fe738b2 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -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) { |

