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