mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Add llvm patch corresponding to r279161.
This commit is contained in:
parent
a6d980a99e
commit
680ef382a2
1 changed files with 55 additions and 0 deletions
|
|
@ -0,0 +1,55 @@
|
|||
Pull in r230058 from upstream llvm trunk (by Benjamin Kramer):
|
||||
|
||||
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
|
||||
|
||||
This fixes a "Cannot split critical edge from IndirectBrInst" assertion
|
||||
failure when building the devel/radare2 port.
|
||||
|
||||
Introduced here: https://svnweb.freebsd.org/changeset/base/279161
|
||||
|
||||
Index: lib/Transforms/Scalar/LoopRotation.cpp
|
||||
===================================================================
|
||||
--- lib/Transforms/Scalar/LoopRotation.cpp
|
||||
+++ lib/Transforms/Scalar/LoopRotation.cpp
|
||||
@@ -498,6 +498,8 @@ bool LoopRotate::rotateLoop(Loop *L, bool Simplifi
|
||||
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);
|
||||
Index: test/Transforms/LoopRotate/crash.ll
|
||||
===================================================================
|
||||
--- test/Transforms/LoopRotate/crash.ll
|
||||
+++ test/Transforms/LoopRotate/crash.ll
|
||||
@@ -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 a new issue