Skip to content

Commit 8437038

Browse files
committed
[LoopIdiom] Add test where LCSSA needs preserving when re-using PHI (NFC)
1 parent 1ab04fc commit 8437038

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,67 @@ loop.3:
9696
exit:
9797
ret void
9898
}
99+
100+
declare i1 @cond()
101+
102+
define ptr @test_lcssa_reuse_preserve_lcssa() {
103+
; CHECK-LABEL: define ptr @test_lcssa_reuse_preserve_lcssa() {
104+
; CHECK-NEXT: [[ENTRY:.*:]]
105+
; CHECK-NEXT: br label %[[LOOP_0_HEADER:.*]]
106+
; CHECK: [[LOOP_0_HEADER]]:
107+
; CHECK-NEXT: br label %[[LOOP_1:.*]]
108+
; CHECK: [[LOOP_1]]:
109+
; CHECK-NEXT: [[IV_1:%.*]] = phi ptr [ null, %[[LOOP_0_HEADER]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP_1]] ]
110+
; CHECK-NEXT: [[IV_1_NEXT]] = getelementptr i8, ptr [[IV_1]], i64 1
111+
; CHECK-NEXT: [[EC_1:%.*]] = call i1 @cond()
112+
; CHECK-NEXT: br i1 [[EC_1]], label %[[THEN:.*]], label %[[LOOP_1]]
113+
; CHECK: [[THEN]]:
114+
; CHECK-NEXT: [[IV_1_LCSSA:%.*]] = phi ptr [ [[IV_1]], %[[LOOP_1]] ]
115+
; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()
116+
; CHECK-NEXT: br i1 [[C_2]], label %[[LOOP_2_PREHEADER:.*]], label %[[LOOP_0_LATCH:.*]]
117+
; CHECK: [[LOOP_2_PREHEADER]]:
118+
; CHECK-NEXT: [[IV_1_LCSSA_LCSSA:%.*]] = phi ptr [ [[IV_1_LCSSA]], %[[THEN]] ]
119+
; CHECK-NEXT: [[STRLEN:%.*]] = call i64 @strlen(ptr null)
120+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[IV_1_LCSSA]], i64 1
121+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[STRLEN]]
122+
; CHECK-NEXT: br label %[[LOOP_2:.*]]
123+
; CHECK: [[LOOP_2]]:
124+
; CHECK-NEXT: [[IV_2:%.*]] = phi ptr [ [[RES:%.*]], %[[LOOP_2]] ], [ [[IV_1_LCSSA_LCSSA]], %[[LOOP_2_PREHEADER]] ]
125+
; CHECK-NEXT: [[RES]] = getelementptr i8, ptr [[IV_2]], i64 1
126+
; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[IV_1_LCSSA_LCSSA]], align 1
127+
; CHECK-NEXT: [[EC_2:%.*]] = icmp eq i8 [[L]], 0
128+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[LOOP_2]]
129+
; CHECK: [[LOOP_0_LATCH]]:
130+
; CHECK-NEXT: br label %[[LOOP_0_HEADER]]
131+
; CHECK: [[EXIT]]:
132+
; CHECK-NEXT: ret ptr [[SCEVGEP]]
133+
;
134+
entry:
135+
br label %loop.0.header
136+
137+
loop.0.header:
138+
br label %loop.1
139+
140+
loop.1:
141+
%iv.1 = phi ptr [ null, %loop.0.header ], [ %iv.1.next, %loop.1 ]
142+
%iv.1.next = getelementptr i8, ptr %iv.1, i64 1
143+
%ec.1 = call i1 @cond()
144+
br i1 %ec.1, label %then, label %loop.1
145+
146+
then:
147+
%c.2 = call i1 @cond()
148+
br i1 %c.2, label %loop.2, label %loop.0.latch
149+
150+
loop.2:
151+
%iv.2 = phi ptr [ %res, %loop.2 ], [ %iv.1, %then ]
152+
%res = getelementptr i8, ptr %iv.2, i64 1
153+
%l = load i8, ptr %iv.1, align 1
154+
%ec.2 = icmp eq i8 %l, 0
155+
br i1 %ec.2, label %exit, label %loop.2
156+
157+
loop.0.latch:
158+
br label %loop.0.header
159+
160+
exit:
161+
ret ptr %res
162+
}

0 commit comments

Comments
 (0)