xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/br-constant-invalid-sgpr-copy.ll (revision f2c164c8150548d983565c4ddc0fde790f9e2a5b)
1*6454391bSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*6454391bSMatt Arsenault; RUN: llc -global-isel -O0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=WAVE64 %s
3*6454391bSMatt Arsenault; RUN: llc -global-isel -O0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1031 < %s | FileCheck -check-prefix=WAVE32 %s
4*6454391bSMatt Arsenault
5*6454391bSMatt Arsenault; This was mishandling the constant true and false values used as a
6*6454391bSMatt Arsenault; scalar branch condition.
7*6454391bSMatt Arsenault
8*6454391bSMatt Arsenaultdefine void @br_false() {
9*6454391bSMatt Arsenault; WAVE64-LABEL: br_false:
10*6454391bSMatt Arsenault; WAVE64:       ; %bb.0: ; %.exit
11*6454391bSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
12*6454391bSMatt Arsenault; WAVE64-NEXT:  .LBB0_1: ; %bb0
13*6454391bSMatt Arsenault; WAVE64-NEXT:    ; =>This Inner Loop Header: Depth=1
14*6454391bSMatt Arsenault; WAVE64-NEXT:    s_mov_b32 s4, 1
15*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cmp_lg_u32 s4, 0
16*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cbranch_scc1 .LBB0_1
17*6454391bSMatt Arsenault; WAVE64-NEXT:  ; %bb.2: ; %.exit5
18*6454391bSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
19*6454391bSMatt Arsenault;
20*6454391bSMatt Arsenault; WAVE32-LABEL: br_false:
21*6454391bSMatt Arsenault; WAVE32:       ; %bb.0: ; %.exit
22*6454391bSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
23*6454391bSMatt Arsenault; WAVE32-NEXT:  .LBB0_1: ; %bb0
24*6454391bSMatt Arsenault; WAVE32-NEXT:    ; =>This Inner Loop Header: Depth=1
25*6454391bSMatt Arsenault; WAVE32-NEXT:    s_mov_b32 s4, 1
26*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cmp_lg_u32 s4, 0
27*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cbranch_scc1 .LBB0_1
28*6454391bSMatt Arsenault; WAVE32-NEXT:  ; %bb.2: ; %.exit5
29*6454391bSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
30*6454391bSMatt Arsenault.exit:
31*6454391bSMatt Arsenault  br label %bb0
32*6454391bSMatt Arsenault
33*6454391bSMatt Arsenaultbb0:
34*6454391bSMatt Arsenault  br i1 false, label %.exit5, label %bb0
35*6454391bSMatt Arsenault
36*6454391bSMatt Arsenault.exit5:
37*6454391bSMatt Arsenault  ret void
38*6454391bSMatt Arsenault}
39*6454391bSMatt Arsenault
40*6454391bSMatt Arsenaultdefine void @br_true() {
41*6454391bSMatt Arsenault; WAVE64-LABEL: br_true:
42*6454391bSMatt Arsenault; WAVE64:       ; %bb.0: ; %.exit
43*6454391bSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
44*6454391bSMatt Arsenault; WAVE64-NEXT:  .LBB1_1: ; %bb0
45*6454391bSMatt Arsenault; WAVE64-NEXT:    ; =>This Inner Loop Header: Depth=1
46*6454391bSMatt Arsenault; WAVE64-NEXT:    s_mov_b32 s4, 0
47*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cmp_lg_u32 s4, 0
48*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cbranch_scc1 .LBB1_1
49*6454391bSMatt Arsenault; WAVE64-NEXT:  ; %bb.2: ; %.exit5
50*6454391bSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
51*6454391bSMatt Arsenault;
52*6454391bSMatt Arsenault; WAVE32-LABEL: br_true:
53*6454391bSMatt Arsenault; WAVE32:       ; %bb.0: ; %.exit
54*6454391bSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
55*6454391bSMatt Arsenault; WAVE32-NEXT:  .LBB1_1: ; %bb0
56*6454391bSMatt Arsenault; WAVE32-NEXT:    ; =>This Inner Loop Header: Depth=1
57*6454391bSMatt Arsenault; WAVE32-NEXT:    s_mov_b32 s4, 0
58*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cmp_lg_u32 s4, 0
59*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cbranch_scc1 .LBB1_1
60*6454391bSMatt Arsenault; WAVE32-NEXT:  ; %bb.2: ; %.exit5
61*6454391bSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
62*6454391bSMatt Arsenault.exit:
63*6454391bSMatt Arsenault  br label %bb0
64*6454391bSMatt Arsenault
65*6454391bSMatt Arsenaultbb0:
66*6454391bSMatt Arsenault  br i1 true, label %.exit5, label %bb0
67*6454391bSMatt Arsenault
68*6454391bSMatt Arsenault.exit5:
69*6454391bSMatt Arsenault  ret void
70*6454391bSMatt Arsenault}
71*6454391bSMatt Arsenault
72*6454391bSMatt Arsenaultdefine void @br_undef() {
73*6454391bSMatt Arsenault; WAVE64-LABEL: br_undef:
74*6454391bSMatt Arsenault; WAVE64:       ; %bb.0: ; %.exit
75*6454391bSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
76*6454391bSMatt Arsenault; WAVE64-NEXT:  .LBB2_1: ; %bb0
77*6454391bSMatt Arsenault; WAVE64-NEXT:    ; =>This Inner Loop Header: Depth=1
78*6454391bSMatt Arsenault; WAVE64-NEXT:    ; implicit-def: $sgpr4
79*6454391bSMatt Arsenault; WAVE64-NEXT:    s_and_b32 s4, s4, 1
80*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cmp_lg_u32 s4, 0
81*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cbranch_scc1 .LBB2_1
82*6454391bSMatt Arsenault; WAVE64-NEXT:  ; %bb.2: ; %.exit5
83*6454391bSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
84*6454391bSMatt Arsenault;
85*6454391bSMatt Arsenault; WAVE32-LABEL: br_undef:
86*6454391bSMatt Arsenault; WAVE32:       ; %bb.0: ; %.exit
87*6454391bSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
88*6454391bSMatt Arsenault; WAVE32-NEXT:  .LBB2_1: ; %bb0
89*6454391bSMatt Arsenault; WAVE32-NEXT:    ; =>This Inner Loop Header: Depth=1
90*6454391bSMatt Arsenault; WAVE32-NEXT:    ; implicit-def: $sgpr4
91*6454391bSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s4, 1
92*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cmp_lg_u32 s4, 0
93*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cbranch_scc1 .LBB2_1
94*6454391bSMatt Arsenault; WAVE32-NEXT:  ; %bb.2: ; %.exit5
95*6454391bSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
96*6454391bSMatt Arsenault.exit:
97*6454391bSMatt Arsenault  br label %bb0
98*6454391bSMatt Arsenault
99*6454391bSMatt Arsenaultbb0:
100*6454391bSMatt Arsenault  br i1 undef, label %.exit5, label %bb0
101*6454391bSMatt Arsenault
102*6454391bSMatt Arsenault.exit5:
103*6454391bSMatt Arsenault  ret void
104*6454391bSMatt Arsenault}
105*6454391bSMatt Arsenault
106*6454391bSMatt Arsenaultdefine void @br_poison() {
107*6454391bSMatt Arsenault; WAVE64-LABEL: br_poison:
108*6454391bSMatt Arsenault; WAVE64:       ; %bb.0: ; %.exit
109*6454391bSMatt Arsenault; WAVE64-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
110*6454391bSMatt Arsenault; WAVE64-NEXT:  .LBB3_1: ; %bb0
111*6454391bSMatt Arsenault; WAVE64-NEXT:    ; =>This Inner Loop Header: Depth=1
112*6454391bSMatt Arsenault; WAVE64-NEXT:    ; implicit-def: $sgpr4
113*6454391bSMatt Arsenault; WAVE64-NEXT:    s_and_b32 s4, s4, 1
114*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cmp_lg_u32 s4, 0
115*6454391bSMatt Arsenault; WAVE64-NEXT:    s_cbranch_scc1 .LBB3_1
116*6454391bSMatt Arsenault; WAVE64-NEXT:  ; %bb.2: ; %.exit5
117*6454391bSMatt Arsenault; WAVE64-NEXT:    s_setpc_b64 s[30:31]
118*6454391bSMatt Arsenault;
119*6454391bSMatt Arsenault; WAVE32-LABEL: br_poison:
120*6454391bSMatt Arsenault; WAVE32:       ; %bb.0: ; %.exit
121*6454391bSMatt Arsenault; WAVE32-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
122*6454391bSMatt Arsenault; WAVE32-NEXT:  .LBB3_1: ; %bb0
123*6454391bSMatt Arsenault; WAVE32-NEXT:    ; =>This Inner Loop Header: Depth=1
124*6454391bSMatt Arsenault; WAVE32-NEXT:    ; implicit-def: $sgpr4
125*6454391bSMatt Arsenault; WAVE32-NEXT:    s_and_b32 s4, s4, 1
126*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cmp_lg_u32 s4, 0
127*6454391bSMatt Arsenault; WAVE32-NEXT:    s_cbranch_scc1 .LBB3_1
128*6454391bSMatt Arsenault; WAVE32-NEXT:  ; %bb.2: ; %.exit5
129*6454391bSMatt Arsenault; WAVE32-NEXT:    s_setpc_b64 s[30:31]
130*6454391bSMatt Arsenault.exit:
131*6454391bSMatt Arsenault  br label %bb0
132*6454391bSMatt Arsenault
133*6454391bSMatt Arsenaultbb0:
134*6454391bSMatt Arsenault  br i1 poison, label %.exit5, label %bb0
135*6454391bSMatt Arsenault
136*6454391bSMatt Arsenault.exit5:
137*6454391bSMatt Arsenault  ret void
138*6454391bSMatt Arsenault}
139