diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-04 21:33:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-04 21:33:42 +0000 |
commit | 6f8865bf9fc2bda3279c48169598245babdc3e3b (patch) | |
tree | 57bcd37471f3437fb61fae60199d0ad45c14a2ac /llvm/lib/Transforms/Utils/InlineFunction.cpp | |
parent | dbf4b42fdecb1c760e80da8038081fbd7bfc963f (diff) | |
download | bcm5719-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.cpp | 17 |
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); } } |