Readonly/readnone functions are allowed to throw

exceptions, so don't turn invokes of them into
calls.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands
2007-11-22 21:40:06 +00:00
parent 5d81486413
commit 5ef7be79e0
2 changed files with 13 additions and 37 deletions

View File

@@ -34,7 +34,7 @@ using namespace llvm;
STATISTIC(NumBlockRemoved, "Number of basic blocks removed");
STATISTIC(NumInstRemoved , "Number of instructions removed");
STATISTIC(NumCallRemoved , "Number of calls and invokes removed");
STATISTIC(NumCallRemoved , "Number of calls removed");
namespace {
//===----------------------------------------------------------------------===//
@@ -184,32 +184,6 @@ bool ADCE::doADCE() {
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
// Iterate over all invokes in the function, turning invokes into calls if
// they cannot throw.
for (Function::iterator BB = Func->begin(), E = Func->end(); BB != E; ++BB)
if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator()))
if (Function *F = II->getCalledFunction())
if (AA.onlyReadsMemory(F)) {
// The function cannot unwind. Convert it to a call with a branch
// after it to the normal destination.
SmallVector<Value*, 8> Args(II->op_begin()+3, II->op_end());
CallInst *NewCall = new CallInst(F, Args.begin(), Args.end(), "", II);
NewCall->takeName(II);
NewCall->setCallingConv(II->getCallingConv());
II->replaceAllUsesWith(NewCall);
new BranchInst(II->getNormalDest(), II);
// Update PHI nodes in the unwind destination
II->getUnwindDest()->removePredecessor(BB);
BB->getInstList().erase(II);
if (NewCall->use_empty()) {
BB->getInstList().erase(NewCall);
++NumCallRemoved;
}
}
// Iterate over all of the instructions in the function, eliminating trivially
// dead instructions, and marking instructions live that are known to be
// needed. Perform the walk in depth first order so that we avoid marking any