forked from OSchip/llvm-project
Two changes:
1. Don't scan to the end of alloca instructions in the caller function to insert inlined allocas, just insert at the top. This saves a lot of time inlining into functions with a lot of allocas. 2. Use splice to move the alloca instructions over, instead of remove/insert. This allows us to transfer a block at a time, and eliminates a bunch of silly symbol table manipulations. This speeds up the inliner on the testcase in PR209 from 1.73s -> 1.04s (67%) llvm-svn: 11118
This commit is contained in:
parent
dbf4b42fde
commit
6f8865bf9f
|
@ -73,7 +73,7 @@ bool llvm::InlineFunction(CallSite CS) {
|
|||
// Clone the entire body of the callee into the caller.
|
||||
CloneFunctionInto(Caller, CalledFunc, ValueMap, Returns, ".i");
|
||||
}
|
||||
|
||||
|
||||
// Remember the first block that is newly cloned over.
|
||||
Function::iterator FirstNewBlock = LastBlock; ++FirstNewBlock;
|
||||
|
||||
|
@ -84,14 +84,21 @@ bool llvm::InlineFunction(CallSite CS) {
|
|||
//
|
||||
if (isa<AllocaInst>(FirstNewBlock->begin())) {
|
||||
BasicBlock::iterator InsertPoint = Caller->begin()->begin();
|
||||
while (isa<AllocaInst>(InsertPoint)) ++InsertPoint;
|
||||
|
||||
for (BasicBlock::iterator I = FirstNewBlock->begin(),
|
||||
E = FirstNewBlock->end(); I != E; )
|
||||
if (AllocaInst *AI = dyn_cast<AllocaInst>(I++))
|
||||
if (isa<Constant>(AI->getArraySize())) {
|
||||
FirstNewBlock->getInstList().remove(AI);
|
||||
Caller->front().getInstList().insert(InsertPoint, AI);
|
||||
// Scan for the block of allocas that we can move over.
|
||||
while (isa<AllocaInst>(I) &&
|
||||
isa<Constant>(cast<AllocaInst>(I)->getArraySize()))
|
||||
++I;
|
||||
|
||||
// Transfer all of the allocas over in a block. Using splice means
|
||||
// that they instructions aren't removed from the symbol table, then
|
||||
// reinserted.
|
||||
Caller->front().getInstList().splice(InsertPoint,
|
||||
FirstNewBlock->getInstList(),
|
||||
AI, I);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue