xref: /aosp_15_r20/external/mesa3d/src/amd/compiler/tests/test_hard_clause.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2020 Valve Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 #include "helpers.h"
7 #include "sid.h"
8 
9 using namespace aco;
10 
11 static void
create_mubuf(Temp desc=Temp (0,s8))12 create_mubuf(Temp desc = Temp(0, s8))
13 {
14    Operand desc_op(desc);
15    desc_op.setFixed(PhysReg(0));
16    bld.mubuf(aco_opcode::buffer_load_dword, Definition(PhysReg(256), v1), desc_op,
17              Operand(PhysReg(256), v1), Operand::zero(), 0, false);
18 }
19 
20 static void
create_mubuf_store()21 create_mubuf_store()
22 {
23    bld.mubuf(aco_opcode::buffer_store_dword, Operand(PhysReg(0), s4), Operand(PhysReg(256), v1),
24              Operand(PhysReg(256), v1), Operand::zero(), 0, false);
25 }
26 
27 static void
create_mtbuf(Temp desc=Temp (0,s8))28 create_mtbuf(Temp desc = Temp(0, s8))
29 {
30    Operand desc_op(desc);
31    desc_op.setFixed(PhysReg(0));
32    bld.mtbuf(aco_opcode::tbuffer_load_format_x, Definition(PhysReg(256), v1), desc_op,
33              Operand(PhysReg(256), v1), Operand::zero(), V_008F0C_BUF_DATA_FORMAT_32,
34              V_008F0C_BUF_NUM_FORMAT_FLOAT, 0, false);
35 }
36 
37 static void
create_flat()38 create_flat()
39 {
40    bld.flat(aco_opcode::flat_load_dword, Definition(PhysReg(256), v1), Operand(PhysReg(256), v2),
41             Operand(s2));
42 }
43 
44 static void
create_global()45 create_global()
46 {
47    bld.global(aco_opcode::global_load_dword, Definition(PhysReg(256), v1),
48               Operand(PhysReg(256), v2), Operand(s2));
49 }
50 
51 static void
create_mimg(bool nsa,Temp desc=Temp (0,s8))52 create_mimg(bool nsa, Temp desc = Temp(0, s8))
53 {
54    aco_ptr<Instruction> mimg{create_instruction(aco_opcode::image_sample, Format::MIMG, 5, 1)};
55    mimg->definitions[0] = Definition(PhysReg(256), v1);
56    mimg->operands[0] = Operand(desc);
57    mimg->operands[0].setFixed(PhysReg(0));
58    mimg->operands[1] = Operand(PhysReg(0), s4);
59    mimg->operands[2] = Operand(v1);
60    for (unsigned i = 0; i < 2; i++)
61       mimg->operands[3 + i] = Operand(PhysReg(256 + (nsa ? i * 2 : i)), v1);
62    mimg->mimg().dmask = 0x1;
63    mimg->mimg().dim = ac_image_2d;
64 
65    bld.insert(std::move(mimg));
66 }
67 
68 static void
create_smem()69 create_smem()
70 {
71    bld.smem(aco_opcode::s_load_dword, Definition(PhysReg(0), s1), Operand(PhysReg(0), s2),
72             Operand::zero());
73 }
74 
75 static void
create_smem_buffer(Temp desc=Temp (0,s4))76 create_smem_buffer(Temp desc = Temp(0, s4))
77 {
78    Operand desc_op(desc);
79    desc_op.setFixed(PhysReg(0));
80    bld.smem(aco_opcode::s_buffer_load_dword, Definition(PhysReg(0), s1), desc_op, Operand::zero());
81 }
82 
83 BEGIN_TEST(form_hard_clauses.type_restrictions)
84    if (!setup_cs(NULL, GFX10))
85       return;
86 
87    //>> p_unit_test 0
88    //! s_clause imm:1
89    //; search_re('image_sample')
90    //; search_re('image_sample')
91    bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
92    create_mimg(false);
93    create_mimg(false);
94 
95    //>> p_unit_test 1
96    //! s_clause imm:1
97    //; search_re('buffer_load_dword')
98    //; search_re('buffer_load_dword')
99    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
100    create_mubuf();
101    create_mubuf();
102 
103    //>> p_unit_test 2
104    //! s_clause imm:1
105    //; search_re('global_load_dword')
106    //; search_re('global_load_dword')
107    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
108    create_global();
109    create_global();
110 
111    //>> p_unit_test 3
112    //! s_clause imm:1
113    //; search_re('flat_load_dword')
114    //; search_re('flat_load_dword')
115    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
116    create_flat();
117    create_flat();
118 
119    //>> p_unit_test 4
120    //! s_clause imm:1
121    //; search_re('s_load_dword')
122    //; search_re('s_load_dword')
123    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
124    create_smem();
125    create_smem();
126 
127    //>> p_unit_test 5
128    //; search_re('buffer_load_dword')
129    //; search_re('flat_load_dword')
130    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
131    create_mubuf();
132    create_flat();
133 
134    //>> p_unit_test 6
135    //; search_re('buffer_load_dword')
136    //; search_re('s_load_dword')
137    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
138    create_mubuf();
139    create_smem();
140 
141    //>> p_unit_test 7
142    //; search_re('flat_load_dword')
143    //; search_re('s_load_dword')
144    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
145    create_flat();
146    create_smem();
147 
148    finish_form_hard_clause_test();
149 END_TEST
150 
151 BEGIN_TEST(form_hard_clauses.size)
152    if (!setup_cs(NULL, GFX10))
153       return;
154 
155    //>> p_unit_test 0
156    //; search_re('s_load_dword')
157    bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
158    create_smem();
159 
160    //>> p_unit_test 1
161    //! s_clause imm:62
162    //; for i in range(63):
163    //;    search_re('s_load_dword')
164    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
165    for (unsigned i = 0; i < 63; i++)
166       create_smem();
167 
168    //>> p_unit_test 2
169    //! s_clause imm:62
170    //; for i in range(64):
171    //;    search_re('s_load_dword')
172    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
173    for (unsigned i = 0; i < 64; i++)
174       create_smem();
175 
176    //>> p_unit_test 3
177    //! s_clause imm:62
178    //; for i in range(63):
179    //;    search_re('s_load_dword')
180    //! s_clause imm:1
181    //; search_re('s_load_dword')
182    //; search_re('s_load_dword')
183    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
184    for (unsigned i = 0; i < 65; i++)
185       create_smem();
186 
187    finish_form_hard_clause_test();
188 END_TEST
189 
190 BEGIN_TEST(form_hard_clauses.nsa)
191    for (unsigned i = GFX10; i <= GFX10_3; i++) {
192       if (!setup_cs(NULL, (amd_gfx_level)i))
193          continue;
194 
195       //>> p_unit_test 0
196       //! s_clause imm:1
197       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
198       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
199       bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
200       create_mimg(false);
201       create_mimg(false);
202 
203       //>> p_unit_test 1
204       //~gfx10_3! s_clause imm:1
205       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
206       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
207       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
208       create_mimg(false);
209       create_mimg(true);
210 
211       //>> p_unit_test 2
212       //~gfx10_3! s_clause imm:1
213       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
214       //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
215       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
216       create_mimg(true);
217       create_mimg(true);
218 
219       finish_form_hard_clause_test();
220    }
221 END_TEST
222 
223 BEGIN_TEST(form_hard_clauses.heuristic)
224    if (!setup_cs(NULL, GFX10))
225       return;
226 
227    Temp img_desc0 = bld.tmp(s8);
228    Temp img_desc1 = bld.tmp(s8);
229    Temp buf_desc0 = bld.tmp(s4);
230    Temp buf_desc1 = bld.tmp(s4);
231 
232    /* Don't form clause with different descriptors */
233    //>> p_unit_test 0
234    //! s_clause imm:1
235    //; search_re('image_sample')
236    //; search_re('image_sample')
237    bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
238    create_mimg(false, img_desc0);
239    create_mimg(false, img_desc0);
240 
241    //>> p_unit_test 1
242    //; search_re('image_sample')
243    //; search_re('image_sample')
244    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
245    create_mimg(false, img_desc0);
246    create_mimg(false, img_desc1);
247 
248    //>> p_unit_test 2
249    //! s_clause imm:1
250    //; search_re('buffer_load_dword')
251    //; search_re('buffer_load_dword')
252    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
253    create_mubuf(buf_desc0);
254    create_mubuf(buf_desc0);
255 
256    //>> p_unit_test 3
257    //; search_re('buffer_load_dword')
258    //; search_re('buffer_load_dword')
259    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
260    create_mubuf(buf_desc0);
261    create_mubuf(buf_desc1);
262 
263    //>> p_unit_test 4
264    //! s_clause imm:1
265    //; search_re('s_buffer_load_dword')
266    //; search_re('s_buffer_load_dword')
267    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
268    create_smem_buffer(buf_desc0);
269    create_smem_buffer(buf_desc0);
270 
271    //>> p_unit_test 5
272    //; search_re('s_buffer_load_dword')
273    //; search_re('s_buffer_load_dword')
274    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
275    create_smem_buffer(buf_desc0);
276    create_smem_buffer(buf_desc1);
277 
278    //>> p_unit_test 6
279    //; search_re('s_buffer_load_dword')
280    //; search_re('s_load_dword')
281    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
282    create_smem_buffer(buf_desc0);
283    create_smem();
284 
285    /* Only form clause between MUBUF and MTBUF if they load from the same binding. Ignore descriptor
286     * if they're te same binding.
287     */
288    //>> p_unit_test 7
289    //; search_re('buffer_load_dword')
290    //; search_re('tbuffer_load_format_x')
291    bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
292    create_mubuf(buf_desc0);
293    create_mtbuf(buf_desc0);
294 
295    finish_form_hard_clause_test();
296 END_TEST
297 
298 BEGIN_TEST(form_hard_clauses.stores)
299    for (amd_gfx_level gfx : {GFX10, GFX11}) {
300       if (!setup_cs(NULL, gfx))
301          continue;
302 
303       //>> p_unit_test 0
304       //~gfx11! s_clause imm:1
305       //; search_re('buffer_store_dword')
306       //; search_re('buffer_store_dword')
307       bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
308       create_mubuf_store();
309       create_mubuf_store();
310 
311       //>> p_unit_test 1
312       //! s_clause imm:1
313       //; search_re('buffer_load_dword')
314       //; search_re('buffer_load_dword')
315       //; search_re('buffer_store_dword')
316       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
317       create_mubuf();
318       create_mubuf();
319       create_mubuf_store();
320 
321       //>> p_unit_test 2
322       //; search_re('buffer_store_dword')
323       //! s_clause imm:1
324       //; search_re('buffer_load_dword')
325       //; search_re('buffer_load_dword')
326       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
327       create_mubuf_store();
328       create_mubuf();
329       create_mubuf();
330 
331       /* Unclear whether this is the best behaviour */
332       //>> p_unit_test 3
333       //; search_re('buffer_load_dword')
334       //; search_re('buffer_store_dword')
335       //; search_re('buffer_load_dword')
336       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
337       create_mubuf();
338       create_mubuf_store();
339       create_mubuf();
340 
341       finish_form_hard_clause_test();
342    }
343 END_TEST
344