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
This commit is contained in:
Dan Gohman 2008-09-17 21:18:49 +00:00
parent 91aac1015e
commit b5b6ec6488

View 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) {