mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-13 10:32:06 +00:00
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:
parent
91aac1015e
commit
b5b6ec6488
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user