Skip to content

Commit 60c0663

Browse files
committed
[StructurizeCFG] Add nested_if tests
Added nested-if tests for hoisitng zero cost instructions in StructurizeCFG pass. This is a patch with precommited tests for #155408
1 parent 6a8c205 commit 60c0663

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed

llvm/test/CodeGen/AMDGPU/structurize-hoist.ll

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,96 @@ latch:
178178
end:
179179
ret void
180180
}
181+
182+
define void @test_nested_if(ptr %ptr, i32 %val, i1 %cond) {
183+
; GFX900-LABEL: test_nested_if:
184+
; GFX900: ; %bb.0: ; %entry
185+
; GFX900-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
186+
; GFX900-NEXT: flat_load_dword v4, v[0:1]
187+
; GFX900-NEXT: v_and_b32_e32 v3, 1, v3
188+
; GFX900-NEXT: v_cmp_eq_u32_e64 s[6:7], 1, v3
189+
; GFX900-NEXT: s_mov_b64 s[10:11], -1
190+
; GFX900-NEXT: s_xor_b64 s[4:5], s[6:7], -1
191+
; GFX900-NEXT: s_mov_b64 s[12:13], s[6:7]
192+
; GFX900-NEXT: ; implicit-def: $vgpr3
193+
; GFX900-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]
194+
; GFX900-NEXT: s_cbranch_execz .LBB3_4
195+
; GFX900-NEXT: ; %bb.1: ; %if
196+
; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
197+
; GFX900-NEXT: v_mov_b32_e32 v3, v4
198+
; GFX900-NEXT: s_and_saveexec_b64 s[12:13], s[4:5]
199+
; GFX900-NEXT: s_cbranch_execz .LBB3_3
200+
; GFX900-NEXT: ; %bb.2: ; %if_2
201+
; GFX900-NEXT: flat_load_dword v3, v[0:1]
202+
; GFX900-NEXT: s_xor_b64 s[10:11], exec, -1
203+
; GFX900-NEXT: .LBB3_3: ; %Flow3
204+
; GFX900-NEXT: s_or_b64 exec, exec, s[12:13]
205+
; GFX900-NEXT: s_andn2_b64 s[12:13], s[6:7], exec
206+
; GFX900-NEXT: s_and_b64 s[10:11], s[10:11], exec
207+
; GFX900-NEXT: s_or_b64 s[12:13], s[12:13], s[10:11]
208+
; GFX900-NEXT: .LBB3_4: ; %Flow2
209+
; GFX900-NEXT: s_or_b64 exec, exec, s[8:9]
210+
; GFX900-NEXT: s_and_saveexec_b64 s[8:9], s[12:13]
211+
; GFX900-NEXT: s_or_b64 exec, exec, s[8:9]
212+
; GFX900-NEXT: s_and_saveexec_b64 s[8:9], s[6:7]
213+
; GFX900-NEXT: s_cbranch_execz .LBB3_8
214+
; GFX900-NEXT: ; %bb.5: ; %if_3
215+
; GFX900-NEXT: s_movk_i32 s6, 0xfe
216+
; GFX900-NEXT: v_cmp_lt_i32_e32 vcc, s6, v2
217+
; GFX900-NEXT: s_mov_b64 s[6:7], -1
218+
; GFX900-NEXT: s_and_saveexec_b64 s[10:11], vcc
219+
; GFX900-NEXT: s_cbranch_execz .LBB3_7
220+
; GFX900-NEXT: ; %bb.6: ; %if_4
221+
; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
222+
; GFX900-NEXT: v_add_u32_e32 v4, 1, v3
223+
; GFX900-NEXT: s_xor_b64 s[6:7], exec, -1
224+
; GFX900-NEXT: .LBB3_7: ; %Flow1
225+
; GFX900-NEXT: s_or_b64 exec, exec, s[10:11]
226+
; GFX900-NEXT: s_andn2_b64 s[4:5], s[4:5], exec
227+
; GFX900-NEXT: s_and_b64 s[6:7], s[6:7], exec
228+
; GFX900-NEXT: s_or_b64 s[4:5], s[4:5], s[6:7]
229+
; GFX900-NEXT: .LBB3_8: ; %Flow
230+
; GFX900-NEXT: s_or_b64 exec, exec, s[8:9]
231+
; GFX900-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]
232+
; GFX900-NEXT: s_or_b64 exec, exec, s[6:7]
233+
; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
234+
; GFX900-NEXT: flat_store_dword v[0:1], v4
235+
; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
236+
; GFX900-NEXT: s_setpc_b64 s[30:31]
237+
entry:
238+
%load = load %pair, ptr %ptr
239+
br i1 %cond, label %else, label %if
240+
241+
if:
242+
%a16 = icmp slt i32 %val, 255
243+
br i1 %cond, label %else, label %if_2
244+
245+
if_2:
246+
%loaded = load i32, ptr %ptr
247+
br label %merge
248+
249+
else:
250+
%a_else = extractvalue %pair %load, 0
251+
br label %merge
252+
253+
merge:
254+
%phi = phi i32 [ %loaded, %if_2 ], [ %a_else, %else ]
255+
br i1 %cond, label %if_3, label %else_2
256+
257+
if_3:
258+
%a17 = icmp slt i32 %val, 255
259+
br i1 %a17, label %else_2, label %if_4
260+
261+
if_4:
262+
%sum_load = add i32 %phi, 1
263+
br label %merge_2
264+
265+
else_2:
266+
%a_else_2 = extractvalue %pair %load, 0
267+
br label %merge_2
268+
269+
merge_2:
270+
%phi_2 = phi i32 [ %sum_load, %if_4 ], [ %a_else_2, %else_2 ]
271+
store i32 %phi_2, ptr %ptr
272+
ret void
273+
}

llvm/test/Transforms/StructurizeCFG/hoist-zerocost.ll

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,53 @@ latch:
159159
end:
160160
ret void
161161
}
162+
163+
define void @test_nested_if(ptr %ptr, i32 %val, i1 %cond) {
164+
; CHECK-LABEL: define void @test_nested_if(
165+
; CHECK-SAME: ptr [[PTR:%.*]], i32 [[VAL:%.*]], i1 [[COND:%.*]]) {
166+
; CHECK-NEXT: [[ENTRY:.*]]:
167+
; CHECK-NEXT: [[COND_INV:%.*]] = xor i1 [[COND]], true
168+
; CHECK-NEXT: [[LOAD_THEN:%.*]] = load [[PAIR:%.*]], ptr [[PTR]], align 4
169+
; CHECK-NEXT: [[A_ELSE:%.*]] = extractvalue [[PAIR]] [[LOAD_THEN]], 0
170+
; CHECK-NEXT: br i1 [[COND_INV]], label %[[THEN:.*]], label %[[FLOW:.*]]
171+
; CHECK: [[THEN]]:
172+
; CHECK-NEXT: [[A16:%.*]] = icmp slt i32 [[VAL]], 255
173+
; CHECK-NEXT: br i1 [[COND_INV]], label %[[THEN_2:.*]], label %[[FLOW1:.*]]
174+
; CHECK: [[FLOW]]:
175+
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[TMP2:%.*]], %[[FLOW1]] ], [ poison, %[[ENTRY]] ]
176+
; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ [[TMP3:%.*]], %[[FLOW1]] ], [ [[COND]], %[[ENTRY]] ]
177+
; CHECK-NEXT: br i1 [[TMP1]], label %[[ELSE:.*]], label %[[MERGE:.*]]
178+
; CHECK: [[THEN_2]]:
179+
; CHECK-NEXT: [[LOADED:%.*]] = load i32, ptr [[PTR]], align 4
180+
; CHECK-NEXT: br label %[[FLOW1]]
181+
; CHECK: [[FLOW1]]:
182+
; CHECK-NEXT: [[TMP2]] = phi i32 [ [[LOADED]], %[[THEN_2]] ], [ [[A_ELSE]], %[[THEN]] ]
183+
; CHECK-NEXT: [[TMP3]] = phi i1 [ false, %[[THEN_2]] ], [ true, %[[THEN]] ]
184+
; CHECK-NEXT: br label %[[FLOW]]
185+
; CHECK: [[ELSE]]:
186+
; CHECK-NEXT: br label %[[MERGE]]
187+
; CHECK: [[MERGE]]:
188+
; CHECK-NEXT: store i32 [[TMP0]], ptr [[PTR]], align 4
189+
; CHECK-NEXT: ret void
190+
;
191+
entry:
192+
%load_then = load %pair, ptr %ptr
193+
br i1 %cond, label %else, label %then
194+
195+
then:
196+
%a16 = icmp slt i32 %val, 255
197+
br i1 %cond, label %else, label %then_2
198+
199+
then_2:
200+
%loaded = load i32, ptr %ptr
201+
br label %merge
202+
203+
else:
204+
%a_else = extractvalue %pair %load_then, 0
205+
br label %merge
206+
207+
merge:
208+
%phi = phi i32 [ %loaded, %then_2 ], [ %a_else, %else ]
209+
store i32 %phi, ptr %ptr
210+
ret void
211+
}

0 commit comments

Comments
 (0)