[llvm-commits] [llvm] r111061 - in /llvm/trunk: lib/Transforms/Utils/LoopSimplify.cpp test/Transforms/LoopSimplify/indirectbr-backedge.ll

Dan Gohman gohman at apple.com
Fri Aug 13 17:43:09 PDT 2010


Author: djg
Date: Fri Aug 13 19:43:09 2010
New Revision: 111061

URL: http://llvm.org/viewvc/llvm-project?rev=111061&view=rev
Log:
LoopSimplify shouldn't split loop backedges that use indirectbr. PR7867.

Added:
    llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp

Modified: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp?rev=111061&r1=111060&r2=111061&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Fri Aug 13 19:43:09 2010
@@ -622,6 +622,11 @@
   std::vector<BasicBlock*> BackedgeBlocks;
   for (pred_iterator I = pred_begin(Header), E = pred_end(Header); I != E; ++I){
     BasicBlock *P = *I;
+
+    // Indirectbr edges cannot be split, so we must fail if we find one.
+    if (isa<IndirectBrInst>(P->getTerminator()))
+      return 0;
+
     if (P != Preheader) BackedgeBlocks.push_back(P);
   }
 

Added: llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll?rev=111061&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll (added)
+++ llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll Fri Aug 13 19:43:09 2010
@@ -0,0 +1,35 @@
+; RUN: opt -loopsimplify -S < %s | FileCheck %s
+
+; LoopSimplify shouldn't split loop backedges that use indirectbr.
+
+; CHECK: bb1:                                              ; preds = %bb5, %bb
+; CHECK-NEXT: indirectbr
+
+; CHECK: bb5:                                              ; preds = %bb1
+; CHECK-NEXT: br label %bb1{{$}}
+
+define void @foo(i8* %p) nounwind {
+bb:
+  br label %bb1
+
+bb1:                                              ; preds = %bb5, %bb1, %bb
+  indirectbr i8* %p, [label %bb6, label %bb7, label %bb1, label %bb2, label %bb3, label %bb5, label %bb4]
+
+bb2:                                              ; preds = %bb1
+  ret void
+
+bb3:                                              ; preds = %bb1
+  ret void
+
+bb4:                                              ; preds = %bb1
+  ret void
+
+bb5:                                              ; preds = %bb1
+  br label %bb1
+
+bb6:                                              ; preds = %bb1
+  ret void
+
+bb7:                                              ; preds = %bb1
+  ret void
+}





More information about the llvm-commits mailing list