summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/InlineFunction.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-04 21:33:42 +0000
committerChris Lattner <sabre@nondot.org>2004-02-04 21:33:42 +0000
commit6f8865bf9fc2bda3279c48169598245babdc3e3b (patch)
tree57bcd37471f3437fb61fae60199d0ad45c14a2ac /llvm/lib/Transforms/Utils/InlineFunction.cpp
parentdbf4b42fdecb1c760e80da8038081fbd7bfc963f (diff)
downloadbcm5719-llvm-6f8865bf9fc2bda3279c48169598245babdc3e3b.tar.gz
bcm5719-llvm-6f8865bf9fc2bda3279c48169598245babdc3e3b.zip
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
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/InlineFunction.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 5c1564b0ed8..8edf9d071b1 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -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);
}
}
OpenPOWER on IntegriCloud