mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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/trunk@230058 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
99f12691dd
commit
d889ad2ab8
@ -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());
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user