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 | b5b6ec64889b6ee1f75c9a21efb99570e58a517f (patch) | |
tree | 6102433e9e146a3fff45591419fb15940cb64978 /lib/Target | |
parent | 91aac1015e6714d959801dd8d60f55a72827dc4d (diff) | |
download | llvm-b5b6ec64889b6ee1f75c9a21efb99570e58a517f.tar.gz llvm-b5b6ec64889b6ee1f75c9a21efb99570e58a517f.tar.bz2 llvm-b5b6ec64889b6ee1f75c9a21efb99570e58a517f.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/X86/X86FastISel.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp index 63444ca7e2..6e23fe738b 100644 --- a/lib/Target/X86/X86FastISel.cpp +++ b/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) { |