[llvm-commits] [llvm] r127299 - in /llvm/trunk: lib/Transforms/Utils/SimplifyCFG.cpp test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll

Eli Friedman eli.friedman at gmail.com
Tue Mar 8 16:48:33 PST 2011


Author: efriedma
Date: Tue Mar  8 18:48:33 2011
New Revision: 127299

URL: http://llvm.org/viewvc/llvm-project?rev=127299&view=rev
Log:
PR9420; an instruction before an unreachable is guaranteed not to have any
reachable uses, but there still might be uses in dead blocks.  Use the
standard solution of replacing all the uses with undef.  This is
a rare case because it's very sensitive to phase ordering in SimplifyCFG.


Added:
    llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=127299&r1=127298&r2=127299&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Tue Mar  8 18:48:33 2011
@@ -2168,7 +2168,9 @@
       if (LI->isVolatile())
         break;
     
-    // Delete this instruction
+    // Delete this instruction (any uses are guaranteed to be dead)
+    if (!BBI->use_empty())
+      BBI->replaceAllUsesWith(UndefValue::get(BBI->getType()));
     BBI->eraseFromParent();
     Changed = true;
   }

Added: llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll?rev=127299&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll Tue Mar  8 18:48:33 2011
@@ -0,0 +1,31 @@
+; RUN: opt < %s -simplifycfg -S | FileCheck %s
+; PR9420
+
+; Note that the crash in PR9420 test is sensitive to the ordering of
+; the transformations done by SimplifyCFG, so this test is likely to rot
+; quickly.
+
+define noalias i8* @func_29() nounwind {
+; CHECK: entry:
+; CHECK-NEXT: unreachable
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc38, %entry
+  %p_34.addr.0 = phi i16 [ 1, %entry ], [ %conv40, %for.inc38 ]
+  br label %for.cond1
+
+for.cond1:                                        ; preds = %for.inc29, %for.cond
+  %p_32.addr.0 = phi i1 [ true, %for.cond ], [ true, %for.inc29 ]
+  br i1 %p_32.addr.0, label %for.body8, label %for.inc38
+
+for.body8:                                        ; preds = %for.cond1
+  unreachable
+
+for.inc29:                                        ; preds = %for.cond17
+  br label %for.cond1
+
+for.inc38:                                        ; preds = %for.end32
+  %conv40 = add i16 %p_34.addr.0, 1
+  br label %for.cond
+}





More information about the llvm-commits mailing list