Readonly/readnone functions are allowed to throw
authorDuncan Sands <baldrick@free.fr>
Thu, 22 Nov 2007 21:40:06 +0000 (21:40 +0000)
committerDuncan Sands <baldrick@free.fr>
Thu, 22 Nov 2007 21:40:06 +0000 (21:40 +0000)
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
test/Transforms/ADCE/dce_pure_invoke.ll

index d5201b870fcd3074fe8e8fdd4c6a582ec6546289..e3bd3623ce281fa041697eccb6ad37449bf2f3bf 100644 (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
index 9604defb3bb6e23f20252131c97119ee8829c3bc..bd28df2b5e75104036cd2939218b47b8c9d3ea99 100644 (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
+}