Skip to content

Commit e9d34c5

Browse files
committed
[NFC] Add assert and test showing that revert of D109596 wasn't justified
All transforms of IndVars have prerequisite requirement of LCSSA and LoopSimplify form and rely on it. Added test that shows that this actually stands.
1 parent 471217c commit e9d34c5

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,7 @@ static void foldExit(const Loop *L, BasicBlock *ExitingBB, bool IsTaken,
13111311

13121312
static void replaceLoopPHINodesWithPreheaderValues(
13131313
Loop *L, SmallVectorImpl<WeakTrackingVH> &DeadInsts) {
1314+
assert(L->isLoopSimplifyForm() && "Should only do it in simplify form!");
13141315
auto *LoopPreheader = L->getLoopPreheader();
13151316
auto *LoopHeader = L->getHeader();
13161317
for (auto &PN : LoopHeader->phis()) {

llvm/test/Transforms/IndVarSimplify/eliminate-backedge.ll

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,88 @@ exit:
7777
[ %baz_ret, %latch ], [ 0, %entry ]
7878
ret i1 %val
7979
}
80+
81+
define i1 @siblings(i8* align 1 %lhs, i8* align 1 %rhs, i32 %len) {
82+
; CHECK-LABEL: @siblings(
83+
; CHECK-NEXT: entry:
84+
; CHECK-NEXT: %length_not_zero = icmp ne i32 %len, 0
85+
; CHECK-NEXT: br i1 %length_not_zero, label %weird_loop.preheader, label %exit
86+
; CHECK: weird_loop.preheader:
87+
; CHECK-NEXT: br label %weird_loop
88+
; CHECK: weird_loop:
89+
; CHECK-NEXT: %weird.iv = phi i32 [ %weird.iv.next, %weird_loop ], [ 0, %weird_loop.preheader ]
90+
; CHECK-NEXT: %weird.iv.next = add i32 %weird.iv, 1
91+
; CHECK-NEXT: %weird.iv.wide = zext i32 %weird.iv to i64
92+
; CHECK-NEXT: %weird.cond = call i1 @bar()
93+
; CHECK-NEXT: br i1 %weird.cond, label %weird_loop, label %loop.preheader
94+
; CHECK: loop.preheader:
95+
; CHECK-NEXT: %weird.iv.lcssa = phi i32 [ %weird.iv, %weird_loop ]
96+
; CHECK-NEXT: %weird.iv.wide.lcssa = phi i64 [ %weird.iv.wide, %weird_loop ]
97+
; CHECK-NEXT: br label %loop
98+
; CHECK: loop:
99+
; CHECK-NEXT: %iv.next = add i32 %weird.iv.lcssa, 1
100+
; CHECK-NEXT: %left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %weird.iv.lcssa
101+
; CHECK-NEXT: %right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %weird.iv.lcssa
102+
; CHECK-NEXT: %result = call i1 @foo(i8* %left_ptr, i8* %right_ptr)
103+
; CHECK-NEXT: br i1 %result, label %exiting_1, label %exit.loopexit
104+
; CHECK: exiting_1:
105+
; CHECK-NEXT: %iv.wide.is_not_zero = icmp ne i64 %weird.iv.wide.lcssa, %weird.iv.wide.lcssa
106+
; CHECK-NEXT: br i1 false, label %exiting_2, label %exit.loopexit
107+
; CHECK: exiting_2:
108+
; CHECK-NEXT: %bar_ret = call i1 @bar()
109+
; CHECK-NEXT: br i1 %bar_ret, label %exit.loopexit, label %exiting_3
110+
; CHECK: exiting_3:
111+
; CHECK-NEXT: %baz_ret = call i1 @baz()
112+
; CHECK-NEXT: %continue = icmp ne i32 %iv.next, %len
113+
; CHECK-NEXT: %or.cond = select i1 %baz_ret, i1 %continue, i1 false
114+
; CHECK-NEXT: br i1 %or.cond, label %loop, label %exit.loopexit
115+
; CHECK: exit.loopexit:
116+
; CHECK-NEXT: %val.ph = phi i1 [ %baz_ret, %exiting_3 ], [ %bar_ret, %exiting_2 ], [ %iv.wide.is_not_zero, %exiting_1 ], [ %result, %loop ]
117+
; CHECK-NEXT: br label %exit
118+
; CHECK: exit:
119+
; CHECK-NEXT: %val = phi i1 [ false, %entry ], [ %val.ph, %exit.loopexit ]
120+
; CHECK-NEXT: ret i1 %val
121+
;
122+
entry:
123+
%length_not_zero = icmp ne i32 %len, 0
124+
br i1 %length_not_zero, label %weird_loop, label %exit
125+
126+
weird_loop:
127+
%weird.iv = phi i32 [ 0, %entry ], [ %weird.iv.next, %weird_loop ]
128+
%weird.iv.next = add i32 %weird.iv, 1
129+
%weird.iv.wide = zext i32 %weird.iv to i64
130+
%weird.cond = call i1 @bar()
131+
br i1 %weird.cond, label %weird_loop, label %loop
132+
133+
loop:
134+
%iv = phi i32 [ %weird.iv, %weird_loop ], [ %iv.next, %latch ]
135+
%iv.wide = phi i64 [ %weird.iv.wide, %weird_loop ], [ %iv.wide.next, %latch ]
136+
%iv.next = add i32 %iv, 1
137+
%iv.wide.next = add i64 %iv.wide, 1
138+
%left_ptr = getelementptr inbounds i8, i8* %lhs, i32 %iv
139+
%right_ptr = getelementptr inbounds i8, i8* %rhs, i32 %iv
140+
%result = call i1 @foo(i8* %left_ptr, i8* %right_ptr)
141+
br i1 %result, label %exiting_1, label %exit
142+
143+
exiting_1:
144+
%iv.wide.is_not_zero = icmp ne i64 %iv.wide, %weird.iv.wide
145+
br i1 %iv.wide.is_not_zero, label %exiting_2, label %exit
146+
147+
exiting_2:
148+
%bar_ret = call i1 @bar()
149+
br i1 %bar_ret, label %exit, label %exiting_3
150+
151+
exiting_3:
152+
%baz_ret = call i1 @baz()
153+
br i1 %baz_ret, label %latch, label %exit
154+
155+
latch:
156+
%continue = icmp ne i32 %iv.next, %len
157+
br i1 %continue, label %loop, label %exit
158+
159+
exit:
160+
%val = phi i1 [ %result, %loop ], [ %iv.wide.is_not_zero, %exiting_1 ],
161+
[ %bar_ret, %exiting_2 ], [ %baz_ret, %exiting_3 ],
162+
[ %baz_ret, %latch ], [ 0, %entry ]
163+
ret i1 %val
164+
}

0 commit comments

Comments
 (0)