From: Dan Gohman Date: Wed, 17 Sep 2008 21:18:49 +0000 (+0000) Subject: FastISel: For calls, prefer using the callee's address as a constant X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=b5b6ec64889b6ee1f75c9a21efb99570e58a517f;p=oota-llvm.git 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 --- diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp index 63444ca7e25..6e23fe738b2 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(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(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) {