mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Currently, codegen may spent some time in SDISel passes even if an entire
function is successfully handled by fast-isel. That's because function arguments are *always* handled by SDISel. Introduce FastLowerArguments to allow each target to provide hook to handle formal argument lowering. As a proof-of-concept, add ARMFastIsel::FastLowerArguments to handle functions with 4 or fewer scalar integer (i8, i16, or i32) arguments. It completely eliminates the need for SDISel for trivial functions. rdar://13163905 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174855 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -87,6 +87,27 @@ void FastISel::startNewBlock() {
|
||||
LastLocalValue = EmitStartPt;
|
||||
}
|
||||
|
||||
bool FastISel::LowerArguments() {
|
||||
if (!FuncInfo.CanLowerReturn)
|
||||
// Fallback to SDISel argument lowering code to deal with sret pointer
|
||||
// parameter.
|
||||
return false;
|
||||
|
||||
if (!FastLowerArguments())
|
||||
return false;
|
||||
|
||||
// Enter non-dead arguments into ValueMap for uses in non-entry BBs.
|
||||
for (Function::const_arg_iterator I = FuncInfo.Fn->arg_begin(),
|
||||
E = FuncInfo.Fn->arg_end(); I != E; ++I) {
|
||||
if (!I->use_empty()) {
|
||||
DenseMap<const Value *, unsigned>::iterator VI = LocalValueMap.find(I);
|
||||
assert(VI != LocalValueMap.end() && "Missed an argument?");
|
||||
FuncInfo.ValueMap[I] = VI->second;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void FastISel::flushLocalValueMap() {
|
||||
LocalValueMap.clear();
|
||||
LastLocalValue = EmitStartPt;
|
||||
@@ -836,7 +857,8 @@ FastISel::SelectInstruction(const Instruction *I) {
|
||||
void
|
||||
FastISel::FastEmitBranch(MachineBasicBlock *MSucc, DebugLoc DL) {
|
||||
|
||||
if (FuncInfo.MBB->getBasicBlock()->size() > 1 && FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
|
||||
if (FuncInfo.MBB->getBasicBlock()->size() > 1 &&
|
||||
FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
|
||||
// For more accurate line information if this is the only instruction
|
||||
// in the block then emit it, otherwise we have the unconditional
|
||||
// fall-through case, which needs no instructions.
|
||||
@@ -1067,6 +1089,10 @@ FastISel::FastISel(FunctionLoweringInfo &funcInfo,
|
||||
|
||||
FastISel::~FastISel() {}
|
||||
|
||||
bool FastISel::FastLowerArguments() {
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned FastISel::FastEmit_(MVT, MVT,
|
||||
unsigned) {
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user