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

View File

@ -1,13 +1,15 @@
; RUN: llvm-upgrade < %s | llvm-as | opt -adce | llvm-dis | not grep null
; RUN: llvm-as < %s | opt -adce | llvm-dis | grep null
declare int %strlen(sbyte*)
declare i32 @strlen(i8*) readnone
int %test() {
;; Dead call should be deleted!
invoke int %strlen(sbyte *null) to label %Cont unwind label %Other
Cont:
ret int 0
Other:
ret int 1
define i32 @test() {
; invoke of pure function should not be deleted!
invoke i32 @strlen( i8* null ) readnone
to label %Cont unwind label %Other ; <i32>:1 [#uses=0]
Cont: ; preds = %0
ret i32 0
Other: ; preds = %0
ret i32 1
}