From 5ef7be79e0a9e2c05f84e2a98b6969dcabebf15d Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Thu, 22 Nov 2007 21:40:06 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/ADCE.cpp | 28 +------------------------ test/Transforms/ADCE/dce_pure_invoke.ll | 22 ++++++++++--------- 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index d5201b870fc..e3bd3623ce2 100644 --- a/lib/Transforms/Scalar/ADCE.cpp +++ b/lib/Transforms/Scalar/ADCE.cpp @@ -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(); - - // 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(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 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 diff --git a/test/Transforms/ADCE/dce_pure_invoke.ll b/test/Transforms/ADCE/dce_pure_invoke.ll index 9604defb3bb..bd28df2b5e7 100644 --- a/test/Transforms/ADCE/dce_pure_invoke.ll +++ b/test/Transforms/ADCE/dce_pure_invoke.ll @@ -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 ; :1 [#uses=0] + +Cont: ; preds = %0 + ret i32 0 +Other: ; preds = %0 + ret i32 1 +} -- 2.34.1