[llvm-commits] [llvm] r44278 - in /llvm/trunk: lib/Transforms/Scalar/ADCE.cpp test/Transforms/ADCE/dce_pure_invoke.ll
Duncan Sands
baldrick at free.fr
Thu Nov 22 13:40:06 PST 2007
Author: baldrick
Date: Thu Nov 22 15:40:06 2007
New Revision: 44278
URL: http://llvm.org/viewvc/llvm-project?rev=44278&view=rev
Log:
Readonly/readnone functions are allowed to throw
exceptions, so don't turn invokes of them into
calls.
Modified:
llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll
Modified: llvm/trunk/lib/Transforms/Scalar/ADCE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ADCE.cpp?rev=44278&r1=44277&r2=44278&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/ADCE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/ADCE.cpp Thu Nov 22 15:40:06 2007
@@ -34,7 +34,7 @@
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 @@
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
Modified: llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll?rev=44278&r1=44277&r2=44278&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll (original)
+++ llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll Thu Nov 22 15:40:06 2007
@@ -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
+}
More information about the llvm-commits
mailing list