summaryrefslogtreecommitdiff
path: root/lib/Target
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-09-17 21:18:49 +0000
committerDan Gohman <gohman@apple.com>2008-09-17 21:18:49 +0000
commitb5b6ec64889b6ee1f75c9a21efb99570e58a517f (patch)
tree6102433e9e146a3fff45591419fb15940cb64978 /lib/Target
parent91aac1015e6714d959801dd8d60f55a72827dc4d (diff)
downloadllvm-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.cpp23
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) {