blob: cb010cf153001668fc07f29c0ab551d16b1ee04d [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 Arsenaultb8f8dbc2017-03-24 19:52:05 +00007; GCN: ; mask branch [[RET:BB[0-9]+_[0-9]+]]
Matt Arsenault701c21e2016-04-29 21:52:13 +00008
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +00009; GCN-NEXT: BB{{[0-9]+_[0-9]+}}: ; %unreachable
10; GCN: ds_write_b32
11; GCN: ; divergent unreachable
12; GCN: s_waitcnt
13
14; GCN-NEXT: [[RET]]: ; %UnifiedReturnBlock
15; GCN-NEXT: s_or_b64 exec, exec
Matt Arsenault701c21e2016-04-29 21:52:13 +000016; GCN: s_endpgm
17
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000018define amdgpu_kernel void @lower_control_flow_unreachable_terminator() #0 {
Matt Arsenault701c21e2016-04-29 21:52:13 +000019bb:
20 %tmp15 = tail call i32 @llvm.amdgcn.workitem.id.y()
21 %tmp63 = icmp eq i32 %tmp15, 32
Matt Arsenault6bc43d82016-10-06 16:20:41 +000022 br i1 %tmp63, label %unreachable, label %ret
Matt Arsenault701c21e2016-04-29 21:52:13 +000023
Matt Arsenault6bc43d82016-10-06 16:20:41 +000024unreachable:
Matt Arsenault701c21e2016-04-29 21:52:13 +000025 store volatile i32 0, i32 addrspace(3)* undef, align 4
26 unreachable
27
Matt Arsenault6bc43d82016-10-06 16:20:41 +000028ret:
Matt Arsenault701c21e2016-04-29 21:52:13 +000029 ret void
30}
31
32; GCN-LABEL: {{^}}lower_control_flow_unreachable_terminator_swap_block_order:
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000033; GCN: v_cmp_ne_u32
Matt Arsenault701c21e2016-04-29 21:52:13 +000034; GCN: s_and_saveexec_b64
35; GCN: s_xor_b64
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000036; GCN: ; mask branch [[RETURN:BB[0-9]+_[0-9]+]]
Matt Arsenault701c21e2016-04-29 21:52:13 +000037
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000038; GCN-NEXT: {{^BB[0-9]+_[0-9]+}}: ; %unreachable
Matt Arsenault701c21e2016-04-29 21:52:13 +000039; GCN: ds_write_b32
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000040; GCN: ; divergent unreachable
Matt Arsenault701c21e2016-04-29 21:52:13 +000041; GCN: s_waitcnt
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000042
43; GCN: [[RETURN]]:
44; GCN-NEXT: s_or_b64 exec, exec
45; GCN-NEXT: s_endpgm
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000046define amdgpu_kernel void @lower_control_flow_unreachable_terminator_swap_block_order() #0 {
Matt Arsenault701c21e2016-04-29 21:52:13 +000047bb:
48 %tmp15 = tail call i32 @llvm.amdgcn.workitem.id.y()
49 %tmp63 = icmp eq i32 %tmp15, 32
Matt Arsenault6bc43d82016-10-06 16:20:41 +000050 br i1 %tmp63, label %ret, label %unreachable
Matt Arsenault701c21e2016-04-29 21:52:13 +000051
Matt Arsenault6bc43d82016-10-06 16:20:41 +000052ret:
Matt Arsenault701c21e2016-04-29 21:52:13 +000053 ret void
54
Matt Arsenault6bc43d82016-10-06 16:20:41 +000055unreachable:
Matt Arsenault701c21e2016-04-29 21:52:13 +000056 store volatile i32 0, i32 addrspace(3)* undef, align 4
57 unreachable
58}
59
Matt Arsenaultb8f8dbc2017-03-24 19:52:05 +000060; GCN-LABEL: {{^}}uniform_lower_control_flow_unreachable_terminator:
61; GCN: s_cmp_lg_u32
62; GCN: s_cbranch_scc0 [[UNREACHABLE:BB[0-9]+_[0-9]+]]
63
64; GCN-NEXT: BB#{{[0-9]+}}: ; %ret
65; GCN-NEXT: s_endpgm
66
67; GCN: [[UNREACHABLE]]:
68; GCN: ds_write_b32
69; GCN: s_waitcnt
70define amdgpu_kernel void @uniform_lower_control_flow_unreachable_terminator(i32 %arg0) #0 {
71bb:
72 %tmp63 = icmp eq i32 %arg0, 32
73 br i1 %tmp63, label %unreachable, label %ret
74
75unreachable:
76 store volatile i32 0, i32 addrspace(3)* undef, align 4
77 unreachable
78
79ret:
80 ret void
81}
82
Matt Arsenault701c21e2016-04-29 21:52:13 +000083declare i32 @llvm.amdgcn.workitem.id.y() #1
84
85attributes #0 = { nounwind }
86attributes #1 = { nounwind readnone }
87attributes #2 = { nounwind }