[llvm-commits] [llvm] r105950 - in /llvm/trunk: lib/Transforms/Scalar/JumpThreading.cpp test/Transforms/JumpThreading/crash.ll

Chris Lattner sabre at nondot.org
Mon Jun 14 12:45:43 PDT 2010


Author: lattner
Date: Mon Jun 14 14:45:43 2010
New Revision: 105950

URL: http://llvm.org/viewvc/llvm-project?rev=105950&view=rev
Log:
jump threading can't split a critical edge from an indirectbr.  This
fixes PR7356.

Modified:
    llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
    llvm/trunk/test/Transforms/JumpThreading/crash.ll

Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=105950&r1=105949&r2=105950&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Mon Jun 14 14:45:43 2010
@@ -870,9 +870,14 @@
 
     // Add all the unavailable predecessors to the PredsToSplit list.
     for (pred_iterator PI = pred_begin(LoadBB), PE = pred_end(LoadBB);
-         PI != PE; ++PI)
+         PI != PE; ++PI) {
+      // If the predecessor is an indirect goto, we can't split the edge.
+      if (isa<IndirectBrInst>((*PI)->getTerminator()))
+        return false;
+      
       if (!AvailablePredSet.count(*PI))
         PredsToSplit.push_back(*PI);
+    }
     
     // Split them out to their own block.
     UnavailablePred =

Modified: llvm/trunk/test/Transforms/JumpThreading/crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/crash.ll?rev=105950&r1=105949&r2=105950&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/JumpThreading/crash.ll (original)
+++ llvm/trunk/test/Transforms/JumpThreading/crash.ll Mon Jun 14 14:45:43 2010
@@ -341,3 +341,25 @@
   ret void
 }
 
+
+
+; PR7356
+define i32 @test13(i32* %P, i8* %Ptr) {
+entry:
+  indirectbr i8* %Ptr, [label %BrBlock, label %B2]
+  
+B2:
+  store i32 4, i32 *%P
+  br label %BrBlock
+
+BrBlock:
+  %L = load i32* %P
+  %C = icmp eq i32 %L, 42
+  br i1 %C, label %T, label %F
+  
+T:
+  ret i32 123
+F:
+  ret i32 1422
+}
+





More information about the llvm-commits mailing list