Fix Inline/2004-04-15-InlineDeletesCall.ll

Basically we were using SimplifyCFG as a huge sledgehammer for a simple
optimization.  Because simplifycfg does so many things, we can't use it
for this purpose.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12977 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2004-04-16 05:17:59 +00:00
parent 180e8af758
commit cd01ae5c70

View File

@ -22,7 +22,6 @@
#include "llvm/Instructions.h"
#include "llvm/Intrinsics.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Transforms/Utils/Local.h"
using namespace llvm;
bool llvm::InlineFunction(CallInst *CI) { return InlineFunction(CallSite(CI)); }
@ -302,11 +301,17 @@ bool llvm::InlineFunction(CallSite CS) {
if (!TheCall->use_empty())
TheCall->replaceAllUsesWith(Returns[0]->getReturnValue());
// Add a branch to the merge point where the PHI node lives if it exists.
new BranchInst(AfterCallBB, Returns[0]);
// Splice the code from the return block into the block that it will return
// to, which contains the code that was after the call.
BasicBlock *ReturnBB = Returns[0]->getParent();
ReturnBB->getInstList().splice(Returns[0], AfterCallBB->getInstList());
// Update PHI nodes that use the AfterCallBB to use the ReturnBB.
AfterCallBB->replaceAllUsesWith(ReturnBB);
// Delete the return instruction now
// Delete the return instruction now and empty AfterCallBB now.
Returns[0]->getParent()->getInstList().erase(Returns[0]);
Caller->getBasicBlockList().erase(AfterCallBB);
}
// Since we are now done with the Call/Invoke, we can delete it.
@ -314,15 +319,18 @@ bool llvm::InlineFunction(CallSite CS) {
// We should always be able to fold the entry block of the function into the
// single predecessor of the block...
assert(cast<BranchInst>(Br)->isUnconditional() &&"splitBasicBlock broken!");
assert(cast<BranchInst>(Br)->isUnconditional() && "splitBasicBlock broken!");
BasicBlock *CalleeEntry = cast<BranchInst>(Br)->getSuccessor(0);
SimplifyCFG(CalleeEntry);
// Okay, continue the CFG cleanup. It's often the case that there is only a
// single return instruction in the callee function. If this is the case,
// then we have an unconditional branch from the return block to the
// 'AfterCallBB'. Check for this case, and eliminate the branch is possible.
SimplifyCFG(AfterCallBB);
// Splice the code entry block into calling block, right before the
// unconditional branch.
OrigBB->getInstList().splice(Br, CalleeEntry->getInstList());
CalleeEntry->replaceAllUsesWith(OrigBB); // Update PHI nodes
// Remove the unconditional branch.
OrigBB->getInstList().erase(Br);
// Now we can remove the CalleeEntry block, which is now empty.
Caller->getBasicBlockList().erase(CalleeEntry);
return true;
}