forked from OSchip/llvm-project
Revert "[IndVars] Break backedge and replace PHIs if loop exits on 1st iteration"
This reverts commit d9ca444835
. See review for why.
This commit is contained in:
parent
1a56a291c5
commit
5746c76f3f
|
@ -1465,15 +1465,8 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) {
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
bool SkipLastIter = false;
|
bool SkipLastIter = false;
|
||||||
bool ExitsOnFirstIter = false;
|
|
||||||
SmallSet<const SCEV*, 8> DominatingExitCounts;
|
SmallSet<const SCEV*, 8> DominatingExitCounts;
|
||||||
for (BasicBlock *ExitingBB : ExitingBlocks) {
|
for (BasicBlock *ExitingBB : ExitingBlocks) {
|
||||||
if (ExitsOnFirstIter) {
|
|
||||||
// If proved that some earlier exit is taken
|
|
||||||
// on 1st iteration, then fold this one.
|
|
||||||
foldExit(L, ExitingBB, true, DeadInsts);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const SCEV *ExitCount = SE->getExitCount(L, ExitingBB);
|
const SCEV *ExitCount = SE->getExitCount(L, ExitingBB);
|
||||||
if (isa<SCEVCouldNotCompute>(ExitCount)) {
|
if (isa<SCEVCouldNotCompute>(ExitCount)) {
|
||||||
// Okay, we do not know the exit count here. Can we at least prove that it
|
// Okay, we do not know the exit count here. Can we at least prove that it
|
||||||
|
@ -1523,7 +1516,6 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) {
|
||||||
foldExit(L, ExitingBB, true, DeadInsts);
|
foldExit(L, ExitingBB, true, DeadInsts);
|
||||||
replaceLoopPHINodesWithPreheaderValues(L, DeadInsts);
|
replaceLoopPHINodesWithPreheaderValues(L, DeadInsts);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
ExitsOnFirstIter = true;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ define i1 @kill_backedge_and_phis(i8* align 1 %lhs, i8* align 1 %rhs, i32 %len)
|
||||||
; CHECK: loop_preheader:
|
; CHECK: loop_preheader:
|
||||||
; CHECK-NEXT: br label %loop
|
; CHECK-NEXT: br label %loop
|
||||||
; CHECK: loop:
|
; CHECK: loop:
|
||||||
|
; CHECK-NEXT: %iv.next = add nuw nsw i32 0, 1
|
||||||
; CHECK-NEXT: %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 0
|
; CHECK-NEXT: %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 0
|
||||||
; CHECK-NEXT: %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 0
|
; CHECK-NEXT: %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 0
|
||||||
; CHECK-NEXT: %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr)
|
; CHECK-NEXT: %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr)
|
||||||
|
@ -24,10 +25,12 @@ define i1 @kill_backedge_and_phis(i8* align 1 %lhs, i8* align 1 %rhs, i32 %len)
|
||||||
; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit
|
; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit
|
||||||
; CHECK: exiting_2:
|
; CHECK: exiting_2:
|
||||||
; CHECK-NEXT: %bar_ret = call i1 @bar()
|
; CHECK-NEXT: %bar_ret = call i1 @bar()
|
||||||
; CHECK-NEXT: br i1 true, label %exit.loopexit, label %exiting_3
|
; CHECK-NEXT: br i1 %bar_ret, label %exit.loopexit, label %exiting_3
|
||||||
; CHECK: exiting_3:
|
; CHECK: exiting_3:
|
||||||
; CHECK-NEXT: %baz_ret = call i1 @baz()
|
; CHECK-NEXT: %baz_ret = call i1 @baz()
|
||||||
; CHECK-NEXT: br i1 false, label %loop, label %exit.loopexit
|
; CHECK-NEXT: %continue = icmp ne i32 %iv.next, %len
|
||||||
|
; CHECK-NEXT: %or.cond = select i1 %baz_ret, i1 %continue, i1 false
|
||||||
|
; CHECK-NEXT: br i1 %or.cond, label %loop, label %exit.loopexit
|
||||||
; CHECK: exit.loopexit:
|
; CHECK: exit.loopexit:
|
||||||
; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ %iv.wide.is_not_zero, %exiting_1 ], [ %result, %loop ]
|
; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ %iv.wide.is_not_zero, %exiting_1 ], [ %result, %loop ]
|
||||||
; CHECK-NEXT: br label %exit
|
; CHECK-NEXT: br label %exit
|
||||||
|
|
Loading…
Reference in New Issue