diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 5c1564b0ed8..8edf9d071b1 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/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(FirstNewBlock->begin())) { BasicBlock::iterator InsertPoint = Caller->begin()->begin(); - while (isa(InsertPoint)) ++InsertPoint; - for (BasicBlock::iterator I = FirstNewBlock->begin(), E = FirstNewBlock->end(); I != E; ) if (AllocaInst *AI = dyn_cast(I++)) if (isa(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(I) && + isa(cast(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); } }