1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s
3
4; Test the localizer did something and we don't materialize all
5; constants in SGPRs in the entry block.
6
7define amdgpu_kernel void @localize_constants(i1 %cond) {
8; GFX9-LABEL: localize_constants:
9; GFX9:       ; %bb.0: ; %entry
10; GFX9-NEXT:    s_load_dword s1, s[4:5], 0x0
11; GFX9-NEXT:    s_mov_b32 s0, 1
12; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
13; GFX9-NEXT:    s_xor_b32 s1, s1, 1
14; GFX9-NEXT:    s_and_b32 s1, s1, 1
15; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
16; GFX9-NEXT:    s_cbranch_scc0 BB0_2
17; GFX9-NEXT:  ; %bb.1: ; %bb1
18; GFX9-NEXT:    v_mov_b32_e32 v0, 0x5be6
19; GFX9-NEXT:    global_store_dword v[0:1], v0, off
20; GFX9-NEXT:    v_mov_b32_e32 v0, 0x1c7
21; GFX9-NEXT:    global_store_dword v[0:1], v0, off
22; GFX9-NEXT:    v_mov_b32_e32 v0, 0x3e8
23; GFX9-NEXT:    global_store_dword v[0:1], v0, off
24; GFX9-NEXT:    v_mov_b32_e32 v0, 0x1c8
25; GFX9-NEXT:    global_store_dword v[0:1], v0, off
26; GFX9-NEXT:    v_mov_b32_e32 v0, 0x3e7
27; GFX9-NEXT:    global_store_dword v[0:1], v0, off
28; GFX9-NEXT:    v_mov_b32_e32 v0, 0x7b
29; GFX9-NEXT:    s_mov_b32 s0, 0
30; GFX9-NEXT:    global_store_dword v[0:1], v0, off
31; GFX9-NEXT:  BB0_2: ; %Flow
32; GFX9-NEXT:    s_and_b32 s0, s0, 1
33; GFX9-NEXT:    s_cmp_lg_u32 s0, 0
34; GFX9-NEXT:    s_cbranch_scc0 BB0_4
35; GFX9-NEXT:  ; %bb.3: ; %bb0
36; GFX9-NEXT:    v_mov_b32_e32 v0, 0x7b
37; GFX9-NEXT:    global_store_dword v[0:1], v0, off
38; GFX9-NEXT:    v_mov_b32_e32 v0, 0x1c8
39; GFX9-NEXT:    global_store_dword v[0:1], v0, off
40; GFX9-NEXT:    v_mov_b32_e32 v0, 0x3e7
41; GFX9-NEXT:    global_store_dword v[0:1], v0, off
42; GFX9-NEXT:    v_mov_b32_e32 v0, 0x3e8
43; GFX9-NEXT:    global_store_dword v[0:1], v0, off
44; GFX9-NEXT:    v_mov_b32_e32 v0, 0x1c7
45; GFX9-NEXT:    global_store_dword v[0:1], v0, off
46; GFX9-NEXT:    v_mov_b32_e32 v0, 0x5be6
47; GFX9-NEXT:    global_store_dword v[0:1], v0, off
48; GFX9-NEXT:  BB0_4: ; %bb2
49; GFX9-NEXT:    s_endpgm
50entry:
51  br i1 %cond, label %bb0, label %bb1
52
53bb0:
54  store volatile i32 123, i32 addrspace(1)* undef
55  store volatile i32 456, i32 addrspace(1)* undef
56  store volatile i32 999, i32 addrspace(1)* undef
57  store volatile i32 1000, i32 addrspace(1)* undef
58  store volatile i32 455, i32 addrspace(1)* undef
59  store volatile i32 23526, i32 addrspace(1)* undef
60  br label %bb2
61
62bb1:
63  store volatile i32 23526, i32 addrspace(1)* undef
64  store volatile i32 455, i32 addrspace(1)* undef
65  store volatile i32 1000, i32 addrspace(1)* undef
66  store volatile i32 456, i32 addrspace(1)* undef
67  store volatile i32 999, i32 addrspace(1)* undef
68  store volatile i32 123, i32 addrspace(1)* undef
69  br label %bb2
70
71bb2:
72  ret void
73}
74
75; FIXME: These aren't localized because thesee were legalized before
76; the localizer, and are no longer G_GLOBAL_VALUE.
77@gv0 = addrspace(1) global i32 undef, align 4
78@gv1 = addrspace(1) global i32 undef, align 4
79@gv2 = addrspace(1) global i32 undef, align 4
80@gv3 = addrspace(1) global i32 undef, align 4
81
82define amdgpu_kernel void @localize_globals(i1 %cond) {
83; GFX9-LABEL: localize_globals:
84; GFX9:       ; %bb.0: ; %entry
85; GFX9-NEXT:    s_load_dword s1, s[4:5], 0x0
86; GFX9-NEXT:    s_mov_b32 s0, 1
87; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
88; GFX9-NEXT:    s_xor_b32 s1, s1, 1
89; GFX9-NEXT:    s_and_b32 s1, s1, 1
90; GFX9-NEXT:    s_cmp_lg_u32 s1, 0
91; GFX9-NEXT:    s_cbranch_scc0 BB1_2
92; GFX9-NEXT:  ; %bb.1: ; %bb1
93; GFX9-NEXT:    s_getpc_b64 s[2:3]
94; GFX9-NEXT:    s_add_u32 s2, s2, gv2@gotpcrel32@lo+4
95; GFX9-NEXT:    s_addc_u32 s3, s3, gv2@gotpcrel32@hi+4
96; GFX9-NEXT:    s_getpc_b64 s[4:5]
97; GFX9-NEXT:    s_add_u32 s4, s4, gv3@gotpcrel32@lo+4
98; GFX9-NEXT:    s_addc_u32 s5, s5, gv3@gotpcrel32@hi+4
99; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
100; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
101; GFX9-NEXT:    v_mov_b32_e32 v2, 0
102; GFX9-NEXT:    s_mov_b32 s0, 0
103; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
104; GFX9-NEXT:    v_mov_b32_e32 v0, s2
105; GFX9-NEXT:    v_mov_b32_e32 v1, s3
106; GFX9-NEXT:    global_store_dword v[0:1], v2, off
107; GFX9-NEXT:    v_mov_b32_e32 v0, s4
108; GFX9-NEXT:    v_mov_b32_e32 v2, 1
109; GFX9-NEXT:    v_mov_b32_e32 v1, s5
110; GFX9-NEXT:    global_store_dword v[0:1], v2, off
111; GFX9-NEXT:  BB1_2: ; %Flow
112; GFX9-NEXT:    s_and_b32 s0, s0, 1
113; GFX9-NEXT:    s_cmp_lg_u32 s0, 0
114; GFX9-NEXT:    s_cbranch_scc0 BB1_4
115; GFX9-NEXT:  ; %bb.3: ; %bb0
116; GFX9-NEXT:    s_getpc_b64 s[0:1]
117; GFX9-NEXT:    s_add_u32 s0, s0, gv0@gotpcrel32@lo+4
118; GFX9-NEXT:    s_addc_u32 s1, s1, gv0@gotpcrel32@hi+4
119; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
120; GFX9-NEXT:    s_getpc_b64 s[2:3]
121; GFX9-NEXT:    s_add_u32 s2, s2, gv1@gotpcrel32@lo+4
122; GFX9-NEXT:    s_addc_u32 s3, s3, gv1@gotpcrel32@hi+4
123; GFX9-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
124; GFX9-NEXT:    v_mov_b32_e32 v2, 0
125; GFX9-NEXT:    v_mov_b32_e32 v3, 1
126; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
127; GFX9-NEXT:    v_mov_b32_e32 v0, s0
128; GFX9-NEXT:    v_mov_b32_e32 v1, s1
129; GFX9-NEXT:    global_store_dword v[0:1], v2, off
130; GFX9-NEXT:    v_mov_b32_e32 v0, s2
131; GFX9-NEXT:    v_mov_b32_e32 v1, s3
132; GFX9-NEXT:    global_store_dword v[0:1], v3, off
133; GFX9-NEXT:  BB1_4: ; %bb2
134; GFX9-NEXT:    s_endpgm
135entry:
136  br i1 %cond, label %bb0, label %bb1
137
138bb0:
139  store volatile i32 0, i32 addrspace(1)* @gv0
140  store volatile i32 1, i32 addrspace(1)* @gv1
141  br label %bb2
142
143bb1:
144  store volatile i32 0, i32 addrspace(1)* @gv2
145  store volatile i32 1, i32 addrspace(1)* @gv3
146  br label %bb2
147
148bb2:
149  ret void
150}
151
152@static.gv0 = internal addrspace(1) global i32 undef, align 4
153@static.gv1 = internal addrspace(1) global i32 undef, align 4
154@static.gv2 = internal addrspace(1) global i32 undef, align 4
155@static.gv3 = internal addrspace(1) global i32 undef, align 4
156
157define void @localize_internal_globals(i1 %cond) {
158; GFX9-LABEL: localize_internal_globals:
159; GFX9:       ; %bb.0: ; %entry
160; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
161; GFX9-NEXT:    v_and_b32_e32 v0, 1, v0
162; GFX9-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
163; GFX9-NEXT:    v_cmp_ne_u32_e64 s[4:5], 0, 1
164; GFX9-NEXT:    s_xor_b64 s[4:5], vcc, s[4:5]
165; GFX9-NEXT:    s_and_saveexec_b64 s[6:7], s[4:5]
166; GFX9-NEXT:    s_xor_b64 s[4:5], exec, s[6:7]
167; GFX9-NEXT:    s_cbranch_execnz BB2_2
168; GFX9-NEXT:  ; %bb.1: ; %bb1
169; GFX9-NEXT:    s_getpc_b64 s[6:7]
170; GFX9-NEXT:    s_add_u32 s6, s6, static.gv2@rel32@lo+4
171; GFX9-NEXT:    s_addc_u32 s7, s7, static.gv2@rel32@hi+4
172; GFX9-NEXT:    v_mov_b32_e32 v0, s6
173; GFX9-NEXT:    v_mov_b32_e32 v1, s7
174; GFX9-NEXT:    v_mov_b32_e32 v2, 0
175; GFX9-NEXT:    s_getpc_b64 s[6:7]
176; GFX9-NEXT:    s_add_u32 s6, s6, static.gv3@rel32@lo+4
177; GFX9-NEXT:    s_addc_u32 s7, s7, static.gv3@rel32@hi+4
178; GFX9-NEXT:    global_store_dword v[0:1], v2, off
179; GFX9-NEXT:    v_mov_b32_e32 v0, s6
180; GFX9-NEXT:    v_mov_b32_e32 v2, 1
181; GFX9-NEXT:    v_mov_b32_e32 v1, s7
182; GFX9-NEXT:    global_store_dword v[0:1], v2, off
183; GFX9-NEXT:  BB2_2: ; %Flow
184; GFX9-NEXT:    s_or_saveexec_b64 s[4:5], s[4:5]
185; GFX9-NEXT:    s_xor_b64 exec, exec, s[4:5]
186; GFX9-NEXT:    s_cbranch_execz BB2_4
187; GFX9-NEXT:  ; %bb.3: ; %bb0
188; GFX9-NEXT:    s_getpc_b64 s[6:7]
189; GFX9-NEXT:    s_add_u32 s6, s6, static.gv0@rel32@lo+4
190; GFX9-NEXT:    s_addc_u32 s7, s7, static.gv0@rel32@hi+4
191; GFX9-NEXT:    v_mov_b32_e32 v0, s6
192; GFX9-NEXT:    v_mov_b32_e32 v1, s7
193; GFX9-NEXT:    v_mov_b32_e32 v2, 0
194; GFX9-NEXT:    s_getpc_b64 s[6:7]
195; GFX9-NEXT:    s_add_u32 s6, s6, static.gv1@rel32@lo+4
196; GFX9-NEXT:    s_addc_u32 s7, s7, static.gv1@rel32@hi+4
197; GFX9-NEXT:    global_store_dword v[0:1], v2, off
198; GFX9-NEXT:    v_mov_b32_e32 v0, s6
199; GFX9-NEXT:    v_mov_b32_e32 v2, 1
200; GFX9-NEXT:    v_mov_b32_e32 v1, s7
201; GFX9-NEXT:    global_store_dword v[0:1], v2, off
202; GFX9-NEXT:  BB2_4: ; %bb2
203; GFX9-NEXT:    s_or_b64 exec, exec, s[4:5]
204; GFX9-NEXT:    s_waitcnt vmcnt(0)
205; GFX9-NEXT:    s_setpc_b64 s[30:31]
206entry:
207  br i1 %cond, label %bb0, label %bb1
208
209bb0:
210  store volatile i32 0, i32 addrspace(1)* @static.gv0
211  store volatile i32 1, i32 addrspace(1)* @static.gv1
212  br label %bb2
213
214bb1:
215  store volatile i32 0, i32 addrspace(1)* @static.gv2
216  store volatile i32 1, i32 addrspace(1)* @static.gv3
217  br label %bb2
218
219bb2:
220  ret void
221}
222