Merging r230058 by d0k:

LoopRotate: When reconstructing loop simplify form don't split edges
from indirectbrs.

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/branches/release_36@231698 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Joerg Sonnenberger
2015-03-09 20:26:36 +00:00
parent c583e8421f
commit f9ec3cff53
2 changed files with 20 additions and 0 deletions

View 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, this);
ExitSplit->moveBefore(Exit);

View 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
}