LoopRotate: When reconstructing loop simplify form don't split edges from indirectbrs.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 20 Feb 2015 20:49:25 +0000 (20:49 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 20 Feb 2015 20:49:25 +0000 (20:49 +0000)
Yet another chapter in the endless story. While this looks like we leave
the loop in a non-canonical state this replicates the logic in
LoopSimplify so it doesn't diverge from the canonical form in any way.

PR21968

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230058 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopRotation.cpp
test/Transforms/LoopRotate/crash.ll

index 2606805400fdce8774e022e497d9f28001000d2c..4d1234905370bb11ef7ec2734c3f5d4b23e1f462 100644 (file)
@@ -535,6 +535,8 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
       Loop *PredLoop = LI->getLoopFor(*PI);
       if (!PredLoop || PredLoop->contains(Exit))
         continue;
+      if (isa<IndirectBrInst>((*PI)->getTerminator()))
+        continue;
       SplitLatchEdge |= L->getLoopLatch() == *PI;
       BasicBlock *ExitSplit = SplitCriticalEdge(
           *PI, Exit, CriticalEdgeSplittingOptions(DT, LI).setPreserveLCSSA());
index fd922cb5569eb78ac68725eb0a18419f184aeaf5..e95f9a1f350f823100f43826df28882da1182d33 100644 (file)
@@ -153,3 +153,21 @@ entry:
 "5":                                              ; preds = %"3", %entry
   ret void
 }
+
+; PR21968
+define void @test8(i1 %C, i8* %P) #0 {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  br i1 %C, label %l_bad, label %for.body
+
+for.body:                                         ; preds = %for.cond
+  indirectbr i8* %P, [label %for.inc, label %l_bad]
+
+for.inc:                                          ; preds = %for.body
+  br label %for.cond
+
+l_bad:                                            ; preds = %for.body, %for.cond
+  ret void
+}