Skip to content

Commit 9c51e51

Browse files
authored
[Tests] Copy while-break test to StructurizeCFG (#102118)
Copied from AMDGPU tests to show IR changes in later PR.
1 parent eb7da59 commit 9c51e51

File tree

1 file changed

+213
-0
lines changed

1 file changed

+213
-0
lines changed
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes='structurizecfg' %s -o - | FileCheck %s
3+
4+
define float @while_break(i32 %z, float %v, i32 %x, i32 %y) #0 {
5+
; CHECK-LABEL: define float @while_break(
6+
; CHECK-SAME: i32 [[Z:%.*]], float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR0:[0-9]+]] {
7+
; CHECK-NEXT: [[ENTRY:.*]]:
8+
; CHECK-NEXT: br label %[[HEADER:.*]]
9+
; CHECK: [[HEADER]]:
10+
; CHECK-NEXT: [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP7:%.*]], %[[FLOW2:.*]] ]
11+
; CHECK-NEXT: [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP6:%.*]], %[[FLOW2]] ]
12+
; CHECK-NEXT: [[CC:%.*]] = icmp sge i32 [[IND]], [[X]]
13+
; CHECK-NEXT: br i1 [[CC]], label %[[ELSE:.*]], label %[[FLOW:.*]]
14+
; CHECK: [[FLOW]]:
15+
; CHECK-NEXT: [[TMP0:%.*]] = phi float [ [[V_1]], %[[ELSE]] ], [ undef, %[[HEADER]] ]
16+
; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ [[CC2:%.*]], %[[ELSE]] ], [ false, %[[HEADER]] ]
17+
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, %[[ELSE]] ], [ true, %[[HEADER]] ]
18+
; CHECK-NEXT: br i1 [[TMP2]], label %[[IF:.*]], label %[[FLOW1:.*]]
19+
; CHECK: [[IF]]:
20+
; CHECK-NEXT: [[V_IF:%.*]] = fadd float [[V_1]], 1.000000e+00
21+
; CHECK-NEXT: br label %[[FLOW1]]
22+
; CHECK: [[ELSE]]:
23+
; CHECK-NEXT: [[CC2]] = icmp slt i32 [[IND]], [[Y]]
24+
; CHECK-NEXT: br label %[[FLOW]]
25+
; CHECK: [[FLOW1]]:
26+
; CHECK-NEXT: [[TMP3:%.*]] = phi float [ undef, %[[IF]] ], [ [[TMP0]], %[[FLOW]] ]
27+
; CHECK-NEXT: [[TMP4:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ [[TMP0]], %[[FLOW]] ]
28+
; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ true, %[[IF]] ], [ [[TMP1]], %[[FLOW]] ]
29+
; CHECK-NEXT: br i1 [[TMP5]], label %[[LATCH:.*]], label %[[FLOW2]]
30+
; CHECK: [[LATCH]]:
31+
; CHECK-NEXT: [[IND_INC:%.*]] = add i32 [[IND]], 1
32+
; CHECK-NEXT: [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
33+
; CHECK-NEXT: br label %[[FLOW2]]
34+
; CHECK: [[FLOW2]]:
35+
; CHECK-NEXT: [[TMP6]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
36+
; CHECK-NEXT: [[TMP7]] = phi float [ [[TMP4]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
37+
; CHECK-NEXT: [[TMP8:%.*]] = phi float [ [[TMP4]], %[[LATCH]] ], [ [[TMP3]], %[[FLOW1]] ]
38+
; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW1]] ]
39+
; CHECK-NEXT: br i1 [[TMP9]], label %[[END:.*]], label %[[HEADER]]
40+
; CHECK: [[END]]:
41+
; CHECK-NEXT: ret float [[TMP8]]
42+
;
43+
entry:
44+
br label %header
45+
46+
header:
47+
%v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
48+
%ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
49+
%cc = icmp slt i32 %ind, %x
50+
br i1 %cc, label %if, label %else
51+
52+
if:
53+
%v.if = fadd float %v.1, 1.0
54+
br label %latch
55+
56+
else:
57+
%cc2 = icmp slt i32 %ind, %y
58+
br i1 %cc2, label %latch, label %end
59+
60+
latch:
61+
%v.2 = phi float [ %v.if, %if ], [ %v.1, %else ]
62+
%ind.inc = add i32 %ind, 1
63+
%cc3 = icmp slt i32 %ind, %z
64+
br i1 %cc3, label %end, label %header
65+
66+
end:
67+
%r = phi float [ %v.2, %latch ], [ %v.1, %else ]
68+
ret float %r
69+
}
70+
71+
; Just different dfs order from while_break.
72+
define float @while_break2(i32 %z, float %v, i32 %x, i32 %y) #0 {
73+
; CHECK-LABEL: define float @while_break2(
74+
; CHECK-SAME: i32 [[Z:%.*]], float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]]) #[[ATTR0]] {
75+
; CHECK-NEXT: [[ENTRY:.*]]:
76+
; CHECK-NEXT: br label %[[HEADER:.*]]
77+
; CHECK: [[HEADER]]:
78+
; CHECK-NEXT: [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP7:%.*]], %[[FLOW2:.*]] ]
79+
; CHECK-NEXT: [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP6:%.*]], %[[FLOW2]] ]
80+
; CHECK-NEXT: [[CC:%.*]] = icmp sge i32 [[IND]], [[X]]
81+
; CHECK-NEXT: br i1 [[CC]], label %[[IF:.*]], label %[[FLOW:.*]]
82+
; CHECK: [[IF]]:
83+
; CHECK-NEXT: [[V_IF:%.*]] = fadd float [[V_1]], 1.000000e+00
84+
; CHECK-NEXT: br label %[[FLOW]]
85+
; CHECK: [[FLOW]]:
86+
; CHECK-NEXT: [[TMP0:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ undef, %[[HEADER]] ]
87+
; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ true, %[[IF]] ], [ false, %[[HEADER]] ]
88+
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, %[[IF]] ], [ true, %[[HEADER]] ]
89+
; CHECK-NEXT: br i1 [[TMP2]], label %[[ELSE:.*]], label %[[FLOW1:.*]]
90+
; CHECK: [[ELSE]]:
91+
; CHECK-NEXT: [[CC2:%.*]] = icmp slt i32 [[IND]], [[Y]]
92+
; CHECK-NEXT: br label %[[FLOW1]]
93+
; CHECK: [[FLOW1]]:
94+
; CHECK-NEXT: [[TMP3:%.*]] = phi float [ [[V_1]], %[[ELSE]] ], [ undef, %[[FLOW]] ]
95+
; CHECK-NEXT: [[TMP4:%.*]] = phi float [ [[V_1]], %[[ELSE]] ], [ [[TMP0]], %[[FLOW]] ]
96+
; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ [[CC2]], %[[ELSE]] ], [ [[TMP1]], %[[FLOW]] ]
97+
; CHECK-NEXT: br i1 [[TMP5]], label %[[LATCH:.*]], label %[[FLOW2]]
98+
; CHECK: [[LATCH]]:
99+
; CHECK-NEXT: [[IND_INC:%.*]] = add i32 [[IND]], 1
100+
; CHECK-NEXT: [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
101+
; CHECK-NEXT: br label %[[FLOW2]]
102+
; CHECK: [[FLOW2]]:
103+
; CHECK-NEXT: [[TMP6]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
104+
; CHECK-NEXT: [[TMP7]] = phi float [ [[TMP4]], %[[LATCH]] ], [ undef, %[[FLOW1]] ]
105+
; CHECK-NEXT: [[TMP8:%.*]] = phi float [ [[TMP4]], %[[LATCH]] ], [ [[TMP3]], %[[FLOW1]] ]
106+
; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW1]] ]
107+
; CHECK-NEXT: br i1 [[TMP9]], label %[[END:.*]], label %[[HEADER]]
108+
; CHECK: [[END]]:
109+
; CHECK-NEXT: ret float [[TMP8]]
110+
;
111+
entry:
112+
br label %header
113+
114+
header:
115+
%v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
116+
%ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
117+
%cc = icmp slt i32 %ind, %x
118+
br i1 %cc, label %else, label %if
119+
120+
if:
121+
%v.if = fadd float %v.1, 1.0
122+
br label %latch
123+
124+
else:
125+
%cc2 = icmp slt i32 %ind, %y
126+
br i1 %cc2, label %latch, label %end
127+
128+
latch:
129+
%v.2 = phi float [ %v.if, %if ], [ %v.1, %else ]
130+
%ind.inc = add i32 %ind, 1
131+
%cc3 = icmp slt i32 %ind, %z
132+
br i1 %cc3, label %end, label %header
133+
134+
end:
135+
%r = phi float [ %v.2, %latch ], [ %v.1, %else ]
136+
ret float %r
137+
}
138+
139+
; Two chains of phi network that have the same value from %if block.
140+
define < 2 x float> @while_break_two_chains_of_phi(float %v, i32 %x, i32 %y, i32 %z, ptr addrspace(1) %p) #0 {
141+
; CHECK-LABEL: define <2 x float> @while_break_two_chains_of_phi(
142+
; CHECK-SAME: float [[V:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]], ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] {
143+
; CHECK-NEXT: [[ENTRY:.*]]:
144+
; CHECK-NEXT: br label %[[HEADER:.*]]
145+
; CHECK: [[HEADER]]:
146+
; CHECK-NEXT: [[V_1:%.*]] = phi float [ [[V]], %[[ENTRY]] ], [ [[TMP6:%.*]], %[[FLOW1:.*]] ]
147+
; CHECK-NEXT: [[V_COPY:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[TMP5:%.*]], %[[FLOW1]] ]
148+
; CHECK-NEXT: [[IND:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[TMP4:%.*]], %[[FLOW1]] ]
149+
; CHECK-NEXT: [[CC:%.*]] = icmp slt i32 [[IND]], [[X]]
150+
; CHECK-NEXT: [[CC_INV:%.*]] = xor i1 [[CC]], true
151+
; CHECK-NEXT: br i1 [[CC]], label %[[IF:.*]], label %[[FLOW:.*]]
152+
; CHECK: [[IF]]:
153+
; CHECK-NEXT: [[V_PTR:%.*]] = getelementptr float, ptr addrspace(1) [[P]], i32 [[IND]]
154+
; CHECK-NEXT: [[V_LOAD:%.*]] = load float, ptr addrspace(1) [[V_PTR]], align 4
155+
; CHECK-NEXT: [[V_IF:%.*]] = fadd float [[V_LOAD]], 1.000000e+00
156+
; CHECK-NEXT: [[CC2:%.*]] = icmp slt i32 [[IND]], [[Y]]
157+
; CHECK-NEXT: br label %[[FLOW]]
158+
; CHECK: [[FLOW]]:
159+
; CHECK-NEXT: [[TMP0:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ undef, %[[HEADER]] ]
160+
; CHECK-NEXT: [[TMP1:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ [[V_COPY]], %[[HEADER]] ]
161+
; CHECK-NEXT: [[TMP2:%.*]] = phi float [ [[V_IF]], %[[IF]] ], [ [[V_1]], %[[HEADER]] ]
162+
; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ [[CC2]], %[[IF]] ], [ [[CC_INV]], %[[HEADER]] ]
163+
; CHECK-NEXT: br i1 [[TMP3]], label %[[LATCH:.*]], label %[[FLOW1]]
164+
; CHECK: [[LATCH]]:
165+
; CHECK-NEXT: [[IND_INC:%.*]] = add i32 [[IND]], 1
166+
; CHECK-NEXT: [[CC3:%.*]] = icmp slt i32 [[IND]], [[Z]]
167+
; CHECK-NEXT: br label %[[FLOW1]]
168+
; CHECK: [[FLOW1]]:
169+
; CHECK-NEXT: [[TMP4]] = phi i32 [ [[IND_INC]], %[[LATCH]] ], [ undef, %[[FLOW]] ]
170+
; CHECK-NEXT: [[TMP5]] = phi float [ [[TMP1]], %[[LATCH]] ], [ undef, %[[FLOW]] ]
171+
; CHECK-NEXT: [[TMP6]] = phi float [ [[TMP2]], %[[LATCH]] ], [ undef, %[[FLOW]] ]
172+
; CHECK-NEXT: [[TMP7:%.*]] = phi float [ [[TMP1]], %[[LATCH]] ], [ [[TMP0]], %[[FLOW]] ]
173+
; CHECK-NEXT: [[TMP8:%.*]] = phi float [ [[TMP2]], %[[LATCH]] ], [ [[TMP0]], %[[FLOW]] ]
174+
; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ [[CC3]], %[[LATCH]] ], [ true, %[[FLOW]] ]
175+
; CHECK-NEXT: br i1 [[TMP9]], label %[[END:.*]], label %[[HEADER]]
176+
; CHECK: [[END]]:
177+
; CHECK-NEXT: [[PACKED0:%.*]] = insertelement <2 x float> poison, float [[TMP8]], i32 0
178+
; CHECK-NEXT: [[PACKED1:%.*]] = insertelement <2 x float> [[PACKED0]], float [[TMP7]], i32 1
179+
; CHECK-NEXT: ret <2 x float> [[PACKED1]]
180+
;
181+
entry:
182+
br label %header
183+
184+
header:
185+
%v.1 = phi float [ %v, %entry ], [ %v.2, %latch ]
186+
%v.copy = phi float [ 0.0, %entry ], [ %v.copy.2, %latch ]
187+
%ind = phi i32 [ 0, %entry], [ %ind.inc, %latch ]
188+
%cc = icmp slt i32 %ind, %x
189+
br i1 %cc, label %if, label %latch
190+
191+
if:
192+
%v.ptr = getelementptr float, ptr addrspace(1) %p, i32 %ind
193+
%v.load = load float, ptr addrspace(1) %v.ptr
194+
%v.if = fadd float %v.load, 1.0
195+
%cc2 = icmp slt i32 %ind, %y
196+
br i1 %cc2, label %latch, label %end
197+
198+
latch:
199+
%v.2 = phi float [ %v.1, %header ], [ %v.if, %if ]
200+
%v.copy.2 = phi float [ %v.copy, %header ], [ %v.if, %if ]
201+
%ind.inc = add i32 %ind, 1
202+
%cc3 = icmp slt i32 %ind, %z
203+
br i1 %cc3, label %end, label %header
204+
205+
end:
206+
%r = phi float [ %v.2, %latch ], [ %v.if, %if ]
207+
%r2 = phi float [ %v.copy.2, %latch ], [ %v.if, %if ]
208+
%packed0 = insertelement < 2 x float > poison, float %r, i32 0
209+
%packed1 = insertelement < 2 x float > %packed0, float %r2, i32 1
210+
ret < 2 x float> %packed1
211+
}
212+
213+
attributes #0 = { nounwind }

0 commit comments

Comments
 (0)