• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GCN,MUBUF
2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 -amdgpu-enable-flat-scratch < %s | FileCheck %s -check-prefixes=GCN,FLATSCR
3
4; GCN-LABEL: spill_v2i32:
5; MUBUF-DAG: buffer_store_dword v{{.*}} offset:16 ; 4-byte Folded Spill
6; MUBUF-DAG: buffer_store_dword v{{.*}} offset:20 ; 4-byte Folded Spill
7; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:16 ; 4-byte Folded Spill
8; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:20 ; 4-byte Folded Spill
9; GCN: ;;#ASMSTART
10; GCN-NEXT: ;;#ASMEND
11; MUBUF-DAG: buffer_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload
12; MUBUF-DAG: buffer_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload
13; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload
14; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload
15
16define void @spill_v2i32() {
17entry:
18  %alloca = alloca <2 x i32>, i32 2, align 4, addrspace(5)
19
20  %aptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1
21  %a = load volatile <2 x i32>, <2 x i32> addrspace(5)* %aptr
22
23  ; Force %a to spill.
24  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
25
26  %outptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1
27  store volatile <2 x i32> %a, <2 x i32> addrspace(5)* %outptr
28
29  ret void
30}
31
32; GCN-LABEL: spill_v2f32:
33; MUBUF-DAG: buffer_store_dword v{{.*}} offset:16 ; 4-byte Folded Spill
34; MUBUF-DAG: buffer_store_dword v{{.*}} offset:20 ; 4-byte Folded Spill
35; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:16 ; 4-byte Folded Spill
36; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:20 ; 4-byte Folded Spill
37; GCN: ;;#ASMSTART
38; GCN-NEXT: ;;#ASMEND
39; MUBUF-DAG: buffer_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload
40; MUBUF-DAG: buffer_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload
41; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload
42; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload
43
44define void @spill_v2f32() {
45entry:
46  %alloca = alloca <2 x i32>, i32 2, align 4, addrspace(5)
47
48  %aptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1
49  %a = load volatile <2 x i32>, <2 x i32> addrspace(5)* %aptr
50
51  ; Force %a to spill.
52  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
53
54  %outptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1
55  store volatile <2 x i32> %a, <2 x i32> addrspace(5)* %outptr
56
57  ret void
58}
59
60; GCN-LABEL: spill_v3i32:
61; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill
62; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill
63; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill
64; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill
65; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill
66; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill
67; GCN: ;;#ASMSTART
68; GCN-NEXT: ;;#ASMEND
69; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
70; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
71; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
72; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
73; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
74; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
75
76define void @spill_v3i32() {
77entry:
78  %alloca = alloca <3 x i32>, i32 2, align 4, addrspace(5)
79
80  %aptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1
81  %a = load volatile <3 x i32>, <3 x i32> addrspace(5)* %aptr
82
83  ; Force %a to spill.
84  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
85
86  %outptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1
87  store volatile <3 x i32> %a, <3 x i32> addrspace(5)* %outptr
88
89  ret void
90}
91
92; GCN-LABEL: spill_v3f32:
93; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill
94; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill
95; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill
96; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill
97; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill
98; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill
99; GCN: ;;#ASMSTART
100; GCN-NEXT: ;;#ASMEND
101; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
102; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
103; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
104; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
105; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
106; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
107
108define void @spill_v3f32() {
109entry:
110  %alloca = alloca <3 x i32>, i32 2, align 4, addrspace(5)
111
112  %aptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1
113  %a = load volatile <3 x i32>, <3 x i32> addrspace(5)* %aptr
114
115  ; Force %a to spill.
116  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
117
118  %outptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1
119  store volatile <3 x i32> %a, <3 x i32> addrspace(5)* %outptr
120
121  ret void
122}
123
124; GCN-LABEL: spill_v4i32:
125; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill
126; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill
127; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill
128; MUBUF-DAG: buffer_store_dword v{{.*}} offset:44 ; 4-byte Folded Spill
129; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill
130; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill
131; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill
132; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:44 ; 4-byte Folded Spill
133; GCN: ;;#ASMSTART
134; GCN-NEXT: ;;#ASMEND
135; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
136; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
137; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
138; MUBUF-DAG: buffer_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload
139; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
140; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
141; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
142; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload
143
144define void @spill_v4i32() {
145entry:
146  %alloca = alloca <4 x i32>, i32 2, align 4, addrspace(5)
147
148  %aptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1
149  %a = load volatile <4 x i32>, <4 x i32> addrspace(5)* %aptr
150
151  ; Force %a to spill.
152  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
153
154  %outptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1
155  store volatile <4 x i32> %a, <4 x i32> addrspace(5)* %outptr
156
157  ret void
158}
159
160; GCN-LABEL: spill_v4f32:
161; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill
162; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill
163; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill
164; MUBUF-DAG: buffer_store_dword v{{.*}} offset:44 ; 4-byte Folded Spill
165; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill
166; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill
167; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill
168; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:44 ; 4-byte Folded Spill
169; GCN: ;;#ASMSTART
170; GCN-NEXT: ;;#ASMEND
171; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
172; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
173; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
174; MUBUF-DAG: buffer_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload
175; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload
176; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload
177; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload
178; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload
179
180define void @spill_v4f32() {
181entry:
182  %alloca = alloca <4 x i32>, i32 2, align 4, addrspace(5)
183
184  %aptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1
185  %a = load volatile <4 x i32>, <4 x i32> addrspace(5)* %aptr
186
187  ; Force %a to spill.
188  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
189
190  %outptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1
191  store volatile <4 x i32> %a, <4 x i32> addrspace(5)* %outptr
192
193  ret void
194}
195
196; GCN-LABEL: spill_v5i32:
197; MUBUF-DAG: buffer_store_dword v{{.*}} offset:64 ; 4-byte Folded Spill
198; MUBUF-DAG: buffer_store_dword v{{.*}} offset:68 ; 4-byte Folded Spill
199; MUBUF-DAG: buffer_store_dword v{{.*}} offset:72 ; 4-byte Folded Spill
200; MUBUF-DAG: buffer_store_dword v{{.*}} offset:76 ; 4-byte Folded Spill
201; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:64 ; 4-byte Folded Spill
202; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:68 ; 4-byte Folded Spill
203; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:72 ; 4-byte Folded Spill
204; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:76 ; 4-byte Folded Spill
205; GCN: ;;#ASMSTART
206; GCN-NEXT: ;;#ASMEND
207; MUBUF-DAG: buffer_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload
208; MUBUF-DAG: buffer_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload
209; MUBUF-DAG: buffer_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload
210; MUBUF-DAG: buffer_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload
211; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload
212; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload
213; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload
214; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload
215define void @spill_v5i32() {
216entry:
217  %alloca = alloca <5 x i32>, i32 2, align 4, addrspace(5)
218
219  %aptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1
220  %a = load volatile <5 x i32>, <5 x i32> addrspace(5)* %aptr
221
222  ; Force %a to spill.
223  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
224
225  %outptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1
226  store volatile <5 x i32> %a, <5 x i32> addrspace(5)* %outptr
227
228  ret void
229}
230
231; GCN-LABEL: spill_v5f32:
232; MUBUF-DAG: buffer_store_dword v{{.*}} offset:64 ; 4-byte Folded Spill
233; MUBUF-DAG: buffer_store_dword v{{.*}} offset:68 ; 4-byte Folded Spill
234; MUBUF-DAG: buffer_store_dword v{{.*}} offset:72 ; 4-byte Folded Spill
235; MUBUF-DAG: buffer_store_dword v{{.*}} offset:76 ; 4-byte Folded Spill
236; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:64 ; 4-byte Folded Spill
237; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:68 ; 4-byte Folded Spill
238; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:72 ; 4-byte Folded Spill
239; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:76 ; 4-byte Folded Spill
240; GCN: ;;#ASMSTART
241; GCN-NEXT: ;;#ASMEND
242; MUBUF-DAG: buffer_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload
243; MUBUF-DAG: buffer_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload
244; MUBUF-DAG: buffer_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload
245; MUBUF-DAG: buffer_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload
246; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload
247; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload
248; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload
249; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload
250define void @spill_v5f32() {
251entry:
252  %alloca = alloca <5 x i32>, i32 2, align 4, addrspace(5)
253
254  %aptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1
255  %a = load volatile <5 x i32>, <5 x i32> addrspace(5)* %aptr
256
257  ; Force %a to spill.
258  call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" ()
259
260  %outptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1
261  store volatile <5 x i32> %a, <5 x i32> addrspace(5)* %outptr
262
263  ret void
264}
265