blob: 89c1eeb8381eabf1b0f939fe9fecc7590570d128 [file] [log] [blame]
Matt Arsenault701c21e2016-04-29 21:52:13 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
2
3; GCN-LABEL: {{^}}lower_control_flow_unreachable_terminator:
Matt Arsenault5d8eb252016-09-30 01:50:20 +00004; GCN: v_cmp_eq_u32
Matt Arsenault701c21e2016-04-29 21:52:13 +00005; GCN: s_and_saveexec_b64
6; GCN: s_xor_b64
Matt Arsenault6bc43d82016-10-06 16:20:41 +00007; GCN: ; mask branch [[RET:BB[0-9]+]]
8; GCN: s_branch [[UNREACHABLE:BB[0-9]+_[0-9]+]]
Matt Arsenault701c21e2016-04-29 21:52:13 +00009
Matt Arsenault6bc43d82016-10-06 16:20:41 +000010; GCN: [[RET]]
Matt Arsenault701c21e2016-04-29 21:52:13 +000011; GCN: s_or_b64 exec, exec
12; GCN: s_endpgm
13
Matt Arsenault6bc43d82016-10-06 16:20:41 +000014; GCN: [[UNREACHABLE]]:
Matt Arsenault701c21e2016-04-29 21:52:13 +000015; GCN: ds_write_b32
16; GCN: s_waitcnt
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000017define amdgpu_kernel void @lower_control_flow_unreachable_terminator() #0 {
Matt Arsenault701c21e2016-04-29 21:52:13 +000018bb:
19 %tmp15 = tail call i32 @llvm.amdgcn.workitem.id.y()
20 %tmp63 = icmp eq i32 %tmp15, 32
Matt Arsenault6bc43d82016-10-06 16:20:41 +000021 br i1 %tmp63, label %unreachable, label %ret
Matt Arsenault701c21e2016-04-29 21:52:13 +000022
Matt Arsenault6bc43d82016-10-06 16:20:41 +000023unreachable:
Matt Arsenault701c21e2016-04-29 21:52:13 +000024 store volatile i32 0, i32 addrspace(3)* undef, align 4
25 unreachable
26
Matt Arsenault6bc43d82016-10-06 16:20:41 +000027ret:
Matt Arsenault701c21e2016-04-29 21:52:13 +000028 ret void
29}
30
31; GCN-LABEL: {{^}}lower_control_flow_unreachable_terminator_swap_block_order:
Matt Arsenault5d8eb252016-09-30 01:50:20 +000032; GCN: v_cmp_eq_u32
Matt Arsenault701c21e2016-04-29 21:52:13 +000033; GCN: s_and_saveexec_b64
34; GCN: s_xor_b64
Matt Arsenault6bc43d82016-10-06 16:20:41 +000035; GCN: ; mask branch [[UNREACHABLE:BB[0-9]+_[0-9]+]]
Matt Arsenault701c21e2016-04-29 21:52:13 +000036
Matt Arsenault6bc43d82016-10-06 16:20:41 +000037; GCN-NEXT: ; %ret
38; GCN-NEXT: s_endpgm
39
40; GCN-NEXT: [[UNREACHABLE]]:
41; GCN-NEXT: s_or_b64 exec, exec
Matt Arsenault701c21e2016-04-29 21:52:13 +000042; GCN: ds_write_b32
43; GCN: s_waitcnt
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000044define amdgpu_kernel void @lower_control_flow_unreachable_terminator_swap_block_order() #0 {
Matt Arsenault701c21e2016-04-29 21:52:13 +000045bb:
46 %tmp15 = tail call i32 @llvm.amdgcn.workitem.id.y()
47 %tmp63 = icmp eq i32 %tmp15, 32
Matt Arsenault6bc43d82016-10-06 16:20:41 +000048 br i1 %tmp63, label %ret, label %unreachable
Matt Arsenault701c21e2016-04-29 21:52:13 +000049
Matt Arsenault6bc43d82016-10-06 16:20:41 +000050ret:
Matt Arsenault701c21e2016-04-29 21:52:13 +000051 ret void
52
Matt Arsenault6bc43d82016-10-06 16:20:41 +000053unreachable:
Matt Arsenault701c21e2016-04-29 21:52:13 +000054 store volatile i32 0, i32 addrspace(3)* undef, align 4
55 unreachable
56}
57
58; Function Attrs: nounwind readnone
59declare i32 @llvm.amdgcn.workitem.id.y() #1
60
61attributes #0 = { nounwind }
62attributes #1 = { nounwind readnone }
63attributes #2 = { nounwind }