source: CLRX/CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase2.cpp @ 3892

Last change on this file since 3892 was 3892, checked in by matszpk, 13 months ago

CLRadeonExtender: Small formatting.

File size: 68.0 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2018 Mateusz Szpakowski
4 *
5 *  This library is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Lesser General Public
7 *  License as published by the Free Software Foundation; either
8 *  version 2.1 of the License, or (at your option) any later version.
9 *
10 *  This library is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 *  Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public
16 *  License along with this library; if not, write to the Free Software
17 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20#include <CLRX/Config.h>
21#include <CLRX/utils/Utilities.h>
22#include <CLRX/amdasm/Assembler.h>
23#include <CLRX/utils/Containers.h>
24#include "../TestUtils.h"
25#include "AsmRegAlloc.h"
26
27const AsmSSADataCase ssaDataTestCases2Tbl[] =
28{
29    {   // 27 - conflicts inside routines
30        R"ffDXD(.regvar sa:s:8, va:v:8
31        s_mov_b32 sa[2], s4
32        s_mov_b32 sa[3], s5
33        s_mov_b32 sa[4], s6
34        s_cbranch_scc1 aa0
35       
36        s_getpc_b64 s[2:3]
37        s_add_u32 s2, s2, routine1-.
38        s_add_u32 s3, s3, routine1-.+4
39        .cf_call routine1
40        s_swappc_b64 s[0:1], s[2:3]
41       
42        s_and_b32 sa[5], sa[5], s0
43       
44aa0:    s_getpc_b64 s[2:3]
45        s_add_u32 s2, s2, routine2-.
46        s_add_u32 s3, s3, routine2-.+4
47        .cf_call routine2
48        s_swappc_b64 s[0:1], s[2:3]
49       
50        s_lshr_b32 sa[2], sa[2], 2
51        s_min_u32 sa[2], sa[2], sa[3]
52        s_lshr_b32 sa[3], sa[3], 2
53        s_endpgm
54       
55routine1:
56        s_xor_b32 sa[2], sa[2], sa[6]
57        s_xor_b32 sa[3], sa[3], sa[6]
58        s_cbranch_scc1 bb1
59       
60        s_min_u32 sa[2], sa[2], sa[6]
61        s_and_b32 sa[4], sa[4], sa[6]
62        .cf_ret
63        s_setpc_b64 s[0:1]
64       
65bb1:    s_and_b32 sa[2], sa[2], sa[6]
66        s_and_b32 sa[4], sa[4], sa[6]
67        .cf_ret
68        s_setpc_b64 s[0:1]
69       
70routine2:
71        s_xor_b32 sa[2], sa[2], sa[6]
72        s_xor_b32 sa[3], sa[3], sa[6]
73        s_cbranch_scc1 bb2
74       
75        s_min_u32 sa[2], sa[2], sa[6]
76        s_max_u32 sa[4], sa[4], sa[6]
77        .cf_ret
78        s_setpc_b64 s[0:1]
79       
80bb2:    s_and_b32 sa[3], sa[3], sa[6]
81        .cf_ret
82        s_setpc_b64 s[0:1]
83)ffDXD",
84        {
85            // block 0 - start
86            { 0, 16,
87                { { 1, false }, { 3, false } },
88                {
89                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
90                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
91                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
92                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
93                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
94                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
95                }, false, false, false },
96            // block 1 - call routine1
97            { 16, 40,
98                { { 5, true } },
99                {
100                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
101                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
102                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
103                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
104                }, true, false, false },
105            // block 2 - before aa0
106            { 40, 44,
107                { },
108                {
109                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
110                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) }
111                }, false, false, false },
112            // block 3 - aa0
113            { 44, 68,
114                { { 8, true } },
115                {
116                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
117                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
118                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
119                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
120                }, true, false, false },
121            // block 4 - end
122            { 68, 84,
123                { },
124                {
125                    { { "sa", 2 }, SSAInfo(5, 7, 7, 8, 2, true) },
126                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
127                }, false, false, true },
128            // block 5 - routine1
129            { 84, 96,
130                { { 6, false }, { 7, false } },
131                {
132                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
133                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
134                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
135                }, false, false, false },
136            // block 6 - routine1 way 1
137            { 96, 108,
138                { },
139                {
140                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
141                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
142                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
143                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
144                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
145                }, false, true, true },
146            // block 7 - routine1 way 2
147            { 108, 120,
148                { },
149                {
150                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
151                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
152                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
153                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
154                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
155                }, false, true, true },
156            // block 8 - routine 2
157            { 120, 132,
158                { { 9, false }, { 10, false } },
159                {
160                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
161                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
162                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
163                }, false, false, false },
164            // block 9 - routine 2 way 0
165            { 132, 144,
166                { },
167                {
168                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
169                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
170                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
171                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
172                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
173                }, false, true, true },
174            // block 10 - routine 2 way 1
175            { 144, 152,
176                { },
177                {
178                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
179                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
180                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
181                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
182                }, false, true, true }
183        },
184        {   // SSA replaces
185            { { "sa", 2 }, { { 4, 3 }, { 6, 5 }, { 3, 1 } } },
186            { { "sa", 3 }, { { 4, 3 }, { 2, 1 } } },
187            { { "sa", 4 }, { { 3, 2 }, { 2, 1 } } }
188        },
189        true, ""
190    },
191    {  // 28 - res second point cache test 1
192        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
193        s_mov_b32 sa[2], s4
194        s_mov_b32 sa[3], s5
195        s_mov_b32 sa[4], s6
196        .cf_cjump aa0, bb0, cc0
197        s_setpc_b64 s[0:1]
198       
199        s_mov_b32 sa[3], s3
200        s_mov_b32 sa[6], s3
201        s_branch mainx
202       
203aa0:    s_mov_b32 sa[2], s2
204        s_mov_b32 sa[6], s2
205        s_cbranch_scc0 mainx
206       
207        s_mov_b32 sa[4], s5
208        s_branch mainx
209
210bb0:    v_mov_b32 va[3], 4
211        v_mov_b32 va[2], v6
212        s_cbranch_scc0 mainy
213       
214        v_mov_b32 va[0], v6
215        v_mov_b32 va[4], v6
216        s_branch mainy
217       
218cc0:    s_mov_b32 xa[3], 4
219        s_mov_b32 xa[4], 4
220        s_cbranch_scc0 mainz
221       
222        s_mov_b32 xa[0], s6
223        s_mov_b32 xa[3], s6
224        s_cbranch_scc0 mainz
225       
226        s_mov_b32 xa[0], s6
227       
228mainx:
229        s_add_u32 sa[2], sa[2], sa[7]
230        s_add_u32 sa[3], sa[3], sa[7]
231        s_sub_u32 sa[4], sa[4], sa[7]
232        s_add_u32 sa[5], sa[5], sa[7]
233       
234        v_xor_b32 va[2], va[2], va[1]
235        s_add_u32 xa[0], xa[0], xa[7]
236        s_cbranch_scc0 mainz
237       
238mainy:
239        v_xor_b32 va[0], va[0], va[1]
240        v_xor_b32 va[2], va[2], va[1]
241        v_xor_b32 va[3], va[3], va[1]
242        v_xor_b32 va[4], va[4], va[1]
243        s_endpgm
244       
245mainz:
246        s_add_u32 xa[0], xa[0], xa[7]
247        s_add_u32 xa[3], xa[3], xa[7]
248        s_sub_u32 xa[4], xa[4], xa[7]
249        s_add_u32 xa[5], xa[5], xa[7]
250        s_add_u32 sa[6], sa[6], sa[7]
251        s_add_u32 sa[3], sa[3], sa[7]
252        s_sub_u32 sa[4], sa[4], sa[7]
253        s_add_u32 sa[5], sa[5], sa[7]
254        s_endpgm
255)ffDXD",
256        {
257            {   // block 0 - start
258                0, 16,
259                { { 1, false }, { 2, false }, { 4, false }, { 6, false } },
260                {
261                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
262                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
263                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
264                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
265                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
266                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
267                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
268                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
269                }, false, false, false },
270            {   // block 1 - before aa0
271                16, 28,
272                { { 9, false } },
273                {
274                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
275                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
276                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
277                }, false, false, true },
278            {   // block 2 - aa0
279                28, 40,
280                { { 3, false }, { 9, false } },
281                {
282                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
283                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, false) },
284                    { { "sa", 6 }, SSAInfo(0, 3, 3, 3, 1, false) }
285                }, false, false, false },
286            {   // block 3 - after aa0
287                40, 48,
288                { { 9, false } },
289                {
290                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
291                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) }
292                }, false, false, true },
293            {   // block 4 - bb0
294                48, 60,
295                { { 5, false }, { 10, false } },
296                {
297                    { { "", 256+6 }, SSAInfo(0, 0, 0, 0, 0, true) },
298                    { { "va", 2 }, SSAInfo(0, 3, 3, 3, 1, false) },
299                    { { "va", 3 }, SSAInfo(0, 2, 2, 2, 1, false) }
300                }, false, false, false },
301            {   // block 5 - after bb0
302                60, 72,
303                { { 10, false } },
304                {
305                    { { "", 256+6 }, SSAInfo(0, 0, 0, 0, 0, true) },
306                    { { "va", 0 }, SSAInfo(0, 2, 2, 2, 1, false) },
307                    { { "va", 4 }, SSAInfo(0, 2, 2, 2, 1, false) }
308                }, false, false, true },
309            {   // block 6 - cc0
310                72, 84,
311                { { 7, false }, { 11, false } },
312                {
313                    { { "xa", 3 }, SSAInfo(0, 2, 2, 2, 1, false) },
314                    { { "xa", 4 }, SSAInfo(0, 2, 2, 2, 1, false) }
315                }, false, false, false },
316            {   // block 7 - after cc0
317                84, 96,
318                { { 8, false }, { 11, false } },
319                {
320                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
321                    { { "xa", 0 }, SSAInfo(0, 3, 3, 3, 1, false) },
322                    { { "xa", 3 }, SSAInfo(2, 3, 3, 3, 1, false) }
323                }, false, false, false },
324            {   // block 8 - before mainx
325                96, 100,
326                { },
327                {
328                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
329                    { { "xa", 0 }, SSAInfo(3, 4, 4, 4, 1, false) }
330                }, false, false, false },
331            {   // block 9 - mainx
332                100, 128,
333                { { 10, false }, { 11, false } },
334                {
335                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
336                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
337                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
338                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) },
339                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
340                    { { "va", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
341                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, true) },
342                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
343                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
344                }, false, false, false },
345            {   // block 10 - mainy
346                128, 148,
347                { },
348                {
349                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
350                    { { "va", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
351                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
352                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, true) },
353                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
354                }, false, false, true },
355            {   // block 11 - mainz
356                148, 184,
357                { },
358                {
359                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
360                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
361                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
362                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
363                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
364                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
365                    { { "xa", 3 }, SSAInfo(0, 1, 1, 1, 1, true) },
366                    { { "xa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) },
367                    { { "xa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) },
368                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
369                }, false, false, true },
370        },
371        {   // SSA replaces
372            { { "sa", 2 }, { { 3, 1 }, { 3, 1 } } },
373            { { "sa", 3 }, { { 2, 1 }, { 2, 1 }, { 2, 1 }, { 3, 1 }, { 3, 1 } } },
374            { { "sa", 4 }, { { 4, 1 }, { 2, 1 }, { 2, 1 } } },
375            { { "sa", 6 }, { { 3, 1 }, { 3, 1 } } },
376            { { "va", 0 }, { { 2, 0 } } },
377            { { "va", 2 }, { { 3, 1 }, { 3, 1 } } },
378            { { "va", 3 }, { { 2, 0 }, { 2, 0 } } },
379            { { "va", 4 }, { { 2, 0 } } },
380            { { "xa", 0 }, { { 4, 0 }, { 3, 1 } } },
381            { { "xa", 3 }, { { 3, 0 }, { 3, 0 }, { 2, 0 } } },
382            { { "xa", 4 }, { { 2, 0 }, { 2, 0 }, { 2, 0 } } }
383        },
384        true, ""
385    },
386    {   // 29 - cache test 2: loop
387        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
388        s_mov_b32 sa[2], s4
389        s_mov_b32 sa[3], s5
390        s_mov_b32 sa[4], s6
391        s_mov_b32 sa[5], s7
392        s_mov_b32 xa[0], s4
393        .cf_cjump aa0, aa1, aa2, aa3
394        s_setpc_b64 s[0:1]
395       
396loop:   s_xor_b32 sa[2], sa[2], sa[7]
397        s_xor_b32 xa[0], xa[0], xa[7]
398       
399l1:     s_xor_b32 sa[3], sa[3], sa[7]
400        s_xor_b32 xa[0], xa[0], xa[7]
401       
402l2:     s_xor_b32 sa[4], sa[4], sa[7]
403        s_xor_b32 xa[0], xa[0], xa[7]
404
405l3:     s_xor_b32 sa[5], sa[5], sa[7]
406        s_xor_b32 xa[0], xa[0], xa[7]
407        s_cbranch_scc0 loop
408       
409        s_endpgm
410       
411aa0:    s_xor_b32 sa[5], sa[5], sa[7]
412        s_xor_b32 xa[0], xa[0], xa[7]
413        s_branch loop
414
415aa1:    s_xor_b32 sa[2], sa[2], sa[7]
416        s_xor_b32 xa[0], xa[0], xa[7]
417        s_branch l1
418
419aa2:    s_xor_b32 sa[3], sa[3], sa[7]
420        s_xor_b32 xa[0], xa[0], xa[7]
421        s_branch l2
422
423aa3:    s_xor_b32 sa[4], sa[4], sa[7]
424        s_xor_b32 xa[0], xa[0], xa[7]
425        s_branch l3
426)ffDXD",
427        {
428            {   // block 0 - start
429                0, 24,
430                { { 1, false }, { 6, false }, { 7, false }, { 8, false }, { 9, false } },
431                {
432                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
433                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
434                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
435                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
436                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
437                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
438                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
439                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
440                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
441                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
442                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) }
443                }, false, false, false },
444            {   // block 1 - loop
445                24, 32,
446                { },
447                {
448                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
449                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
450                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
451                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
452                }, false, false, false },
453            {   // block 2 - l1
454                32, 40,
455                { },
456                {
457                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
458                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
459                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
460                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
461                }, false, false, false },
462            {   // block 3 - l2
463                40, 48,
464                { },
465                {
466                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
467                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
468                    { { "xa", 0 }, SSAInfo(3, 4, 4, 4, 1, true) },
469                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
470                }, false, false, false },
471            {   // block 4 - l3
472                48, 60,
473                { { 1, false }, { 5, false } },
474                {
475                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
476                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
477                    { { "xa", 0 }, SSAInfo(4, 5, 5, 5, 1, true) },
478                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
479                }, false, false, false },
480            {   // block 5 - end
481                60, 64,
482                { },
483                { }, false, false, true },
484            {   // block 6 - aa0
485                64, 76,
486                { { 1, false } },
487                {
488                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
489                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
490                    { { "xa", 0 }, SSAInfo(1, 6, 6, 6, 1, true) },
491                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
492                }, false, false, true },
493            {   // block 7 - aa1
494                76, 88,
495                { { 2, false } },
496                {
497                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) },
498                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
499                    { { "xa", 0 }, SSAInfo(1, 7, 7, 7, 1, true) },
500                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
501                }, false, false, true },
502            {   // block 9 - aa2
503                88, 100,
504                { { 3, false } },
505                {
506                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
507                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
508                    { { "xa", 0 }, SSAInfo(1, 8, 8, 8, 1, true) },
509                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
510                }, false, false, true },
511            {   // block 10 - aa3
512                100, 112,
513                { { 4, false } },
514                {
515                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
516                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
517                    { { "xa", 0 }, SSAInfo(1, 9, 9, 9, 1, true) },
518                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
519                }, false, false, true }
520        },
521        {   // SSA replaces
522            { { "sa", 2 }, { { 2, 1 }, { 3, 1 } } },
523            { { "sa", 3 }, { { 2, 1 }, { 3, 1 } } },
524            { { "sa", 4 }, { { 2, 1 }, { 3, 1 } } },
525            { { "sa", 5 }, { { 2, 1 }, { 3, 1 } } },
526            { { "xa", 0 }, { { 5, 1 }, { 6, 1 }, { 7, 2 }, { 8, 3 }, { 9, 4 } } }
527        },
528        true, ""
529    },
530#if 0
531    {   // 30 - routine with loop
532        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
533        s_mov_b32 sa[2], s4
534        s_mov_b32 sa[3], s5
535        s_mov_b32 sa[4], s6
536        s_mov_b32 sa[5], s7
537       
538        .cf_call routine
539        s_swappc_b64 s[0:1], s[2:3]
540       
541        s_xor_b32 sa[5], sa[5], sa[0]
542        s_xor_b32 sa[2], sa[2], sa[0]
543       
544        .cf_call routine
545        s_swappc_b64 s[0:1], s[2:3]
546       
547        s_endpgm
548       
549routine:
550        s_add_u32 sa[2], sa[2], sa[0]
551        s_add_u32 sa[3], sa[3], sa[1]
552       
553loop0:
554        s_add_u32 sa[4], sa[3], sa[0]
555        s_add_u32 sa[5], sa[3], sa[5]
556        s_cbranch_scc1 j1
557       
558j0:     s_add_u32 sa[2], sa[3], sa[0]
559        s_branch loopend
560
561j1:     s_add_u32 sa[5], sa[2], sa[0]
562
563loopend:
564        s_add_u32 sa[5], sa[5], sa[1]
565        s_cbranch_scc0 loop0
566       
567        s_add_u32 sa[5], sa[5], sa[0]
568        s_add_u32 sa[3], sa[3], sa[1]
569        .cf_ret
570        s_setpc_b64 s[0:1]
571)ffDXD",
572        {
573            {   // block 0 - start
574                0, 20,
575                { { 3, true } },
576                {
577                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
578                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
579                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
580                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
581                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
582                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
583                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
584                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
585                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
586                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
587                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
588                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
589                }, true, false, false },
590            {   // block 1 - before second call
591                20, 32,
592                { { 3, true } },
593                {
594                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
595                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
596                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
597                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
598                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
599                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
600                    { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) }
601                }, true, false, false },
602            {   // block 2 - end
603                32, 36,
604                { },
605                { }, false, false, true },
606            {   // block 3 - routine
607                36, 44,
608                { },
609                {
610                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
611                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
612                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
613                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
614                }, false, false, false },
615            {   // block 4 - loop
616                44, 56,
617                { { 5, false }, { 6, false } },
618                {
619                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
620                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
621                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
622                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
623                },
624                false, false, false },
625            {   // block 5 - j0
626                56, 64,
627                { { 7, false } },
628                {
629                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
630                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
631                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) }
632                }, false, false, true },
633            {   // block 6 - j1
634                64, 68,
635                { },
636                {
637                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
638                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
639                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, false) }
640                }, false, false, false },
641            {   // block 7 - loopend
642                68, 76,
643                { { 4, false }, { 8, false } },
644                {
645                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
646                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
647                }, false, false, false },
648            {   // block 8 - routine end
649                76, 88,
650                { },
651                {
652                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
653                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
654                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
655                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
656                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
657                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
658                }, false, true, true }
659        },
660        {   // SSA replaces
661            { { "sa", 2 }, { { 3, 2 }, { 3, 2 }, { 4, 1 } } },
662            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 3, 1 }, { 5, 2 }, { 6, 1 } } }
663        },
664        true, ""
665    }
666#endif
667    {   // 31 - routine with condition
668        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
669        s_mov_b32 sa[2], s4
670        s_mov_b32 sa[3], s5
671        s_mov_b32 sa[4], s6
672        s_mov_b32 sa[5], s7
673       
674        .cf_call routine
675        s_swappc_b64 s[0:1], s[2:3]
676       
677        s_xor_b32 sa[5], sa[5], sa[0]
678        s_xor_b32 sa[2], sa[2], sa[0]
679       
680        .cf_call routine
681        s_swappc_b64 s[0:1], s[2:3]
682       
683        s_endpgm
684       
685routine:
686        s_add_u32 sa[2], sa[2], sa[0]
687        s_add_u32 sa[3], sa[3], sa[1]
688       
689        s_add_u32 sa[4], sa[3], sa[0]
690        s_add_u32 sa[5], sa[3], sa[5]
691        s_cbranch_scc1 j1
692       
693j0:     s_add_u32 sa[2], sa[3], sa[0]
694        s_add_u32 sa[4], sa[3], sa[1]
695        s_branch rend
696
697j1:     s_add_u32 sa[5], sa[2], sa[0]
698        s_add_u32 sa[4], sa[3], sa[1]
699
700rend:
701        s_add_u32 sa[5], sa[5], sa[0]
702        s_add_u32 sa[3], sa[3], sa[1]
703        .cf_ret
704        s_setpc_b64 s[0:1]
705)ffDXD",
706        {
707            {   // block 0 - start
708                0, 20,
709                { { 3, true } },
710                {
711                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
712                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
713                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
714                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
715                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
716                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
717                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
718                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
719                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
720                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
721                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
722                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
723                }, true, false, false },
724            {   // block 1 - before second call
725                20, 32,
726                { { 3, true } },
727                {
728                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
729                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
730                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
731                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
732                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
733                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
734                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
735                }, true, false, false },
736            {   // block 2 - end
737                32, 36,
738                { },
739                { }, false, false, true },
740            {   // block 3 - routine
741                36, 56,
742                { { 4, false }, { 5, false } },
743                {
744                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
745                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
746                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
747                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
748                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
749                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
750                }, false, false, false },
751            {   // block 4 - j0
752                56, 68,
753                { { 6, false } },
754                {
755                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
756                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
757                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
758                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
759                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, false) }
760                },
761                false, false, true },
762            {   // block 5 - j1
763                68, 76,
764                { },
765                {
766                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
767                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
768                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
769                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
770                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, false) },
771                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, false) }
772                }, false, false, false },
773            {   // block 6 - end
774                76, 88,
775                { },
776                {
777                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
778                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
779                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
780                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
781                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
782                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
783                }, false, true, true }
784        },
785        {   // SSA replaces
786            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
787            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
788        },
789        true, ""
790    },
791    {   // 32 - two routines with common code
792        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
793        s_mov_b32 sa[2], s4
794        s_mov_b32 sa[3], s5
795        s_mov_b32 sa[4], s6
796        s_mov_b32 sa[5], s7
797        s_mov_b32 sa[6], s8
798        s_mov_b32 xa[0], s9
799        s_mov_b32 xa[1], s10
800       
801        .cf_call routine1
802        s_swappc_b64 s[0:1], s[2:3]
803       
804        s_xor_b32 sa[5], sa[5], sa[0]
805        s_xor_b32 sa[2], sa[2], sa[0]
806       
807        .cf_call routine2
808        s_swappc_b64 s[0:1], s[2:3]
809       
810        s_xor_b32 sa[5], sa[5], sa[0]
811        s_xor_b32 sa[2], sa[2], sa[0]
812        s_xor_b32 sa[6], sa[6], sa[0]
813        s_xor_b32 xa[0], xa[0], sa[0]
814        s_xor_b32 xa[1], xa[1], sa[0]
815        s_endpgm
816       
817routine1:
818        s_add_u32 sa[2], sa[2], sa[0]
819        s_add_u32 sa[3], sa[3], sa[1]
820       
821        s_add_u32 sa[4], sa[3], sa[0]
822        s_add_u32 sa[5], sa[3], sa[5]
823        s_add_u32 sa[6], sa[6], sa[1]
824       
825        s_xor_b32 xa[1], xa[1], sa[0]
826       
827common:
828        s_add_u32 sa[5], sa[5], sa[0]
829        s_add_u32 sa[3], sa[3], sa[1]
830        s_xor_b32 sa[4], sa[4], sa[2]
831        .cf_ret
832        s_setpc_b64 s[0:1]
833
834routine2:
835        s_add_u32 sa[2], sa[2], sa[0]
836        s_add_u32 sa[3], sa[3], sa[1]
837       
838        s_add_u32 sa[4], sa[1], sa[2]
839        s_add_u32 sa[5], sa[3], sa[5]
840       
841        s_xor_b32 xa[0], xa[0], sa[0]
842        s_branch common
843)ffDXD",
844        {
845            {   // block 0 - start
846                0, 32,
847                { { 3, true } },
848                {
849                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
850                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
851                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
852                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
853                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
854                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
855                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
856                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
857                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
858                    { { "", 9 }, SSAInfo(0, 0, 0, 0, 0, true) },
859                    { { "", 10 }, SSAInfo(0, 0, 0, 0, 0, true) },
860                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
861                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
862                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
863                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
864                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
865                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
866                    { { "xa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
867                }, true, false, false },
868            {   // block 1 - after routine1 call
869                32, 44,
870                { { 5, true } },
871                {
872                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
873                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
874                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
875                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
876                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
877                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
878                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
879                }, true, false, false },
880            {   // block 2 - after routine2 call
881                44, 68,
882                { },
883                {
884                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
885                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
886                    { { "sa", 5 }, SSAInfo(3, 6, 6, 6, 1, true) },
887                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) },
888                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
889                    { { "xa", 1 }, SSAInfo(2, 3, 3, 3, 1, true) }
890                }, false, false, true },
891            {   // block 3 - routine1
892                68, 92,
893                { },
894                {
895                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
896                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
897                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
898                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
899                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
900                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
901                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
902                    { { "xa", 1 }, SSAInfo(1, 2, 2, 2, 1, true) }
903                }, false, false, false },
904            {   // block 4 - common part
905                92, 108,
906                { },
907                {
908                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
909                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
910                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
911                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
912                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
913                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
914                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
915                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
916                }, false, true, true },
917            {   // block 5 - routine2
918                108, 132,
919                { { 4, false } },
920                {
921                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
922                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
923                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
924                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
925                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) },
926                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
927                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) }
928                }, false, false, true }
929        },
930        {   // SSA replaces
931            { { "sa", 2 }, { { 4, 2 } } },
932            { { "sa", 3 }, { { 4, 2 } } },
933            { { "sa", 4 }, { { 4, 2 } } },
934            { { "sa", 5 }, { { 5, 2 } } }
935        },
936        true, ""
937    },
938    {   // 33 - simple call, more complex routine (reduce with reads)
939        R"ffDXD(.regvar sa:s:8, va:v:8
940        s_mov_b32 sa[2], s4
941        s_mov_b32 sa[3], s5
942        s_mov_b32 sa[5], s6
943        s_mov_b32 sa[6], s7
944       
945        s_getpc_b64 s[2:3]
946        s_add_u32 s2, s2, routine-.
947        s_add_u32 s3, s3, routine-.+4
948        .cf_call routine
949        s_swappc_b64 s[0:1], s[2:3]
950       
951        s_lshl_b32 sa[2], sa[2], 3
952        s_lshl_b32 sa[3], sa[3], 4
953        s_lshl_b32 sa[5], sa[5], 4
954        s_lshl_b32 sa[6], sa[6], 4
955        s_endpgm
956       
957routine:
958        s_xor_b32 sa[2], sa[2], sa[4]
959        s_xor_b32 sa[3], sa[3], sa[4]
960        s_cbranch_scc1 bb1
961       
962        s_min_u32 sa[2], sa[2], sa[4]
963        s_min_u32 sa[3], sa[3], sa[4]
964        s_xor_b32 sa[5], sa[5], sa[4]
965        .cf_ret
966        s_setpc_b64 s[0:1]
967       
968bb1:    s_and_b32 sa[2], sa[2], sa[4]
969        s_and_b32 sa[3], sa[3], sa[4]
970        s_xor_b32 sa[6], sa[6], sa[4]
971        .cf_ret
972        s_setpc_b64 s[0:1]
973)ffDXD",
974        {
975            { 0, 40,
976                { { 2, true } },
977                {
978                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
979                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
980                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
981                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
982                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
983                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
984                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
985                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
986                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
987                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
988                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
989                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
990                }, true, false, false },
991            // block 1 - after call
992            { 40, 60,
993                { },
994                {
995                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
996                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
997                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
998                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
999                }, false, false, true },
1000            // block 2 - routine
1001            { 60, 72,
1002                { { 3, false }, { 4, false } },
1003                {
1004                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1005                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
1006                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1007                }, false, false, false },
1008            // block 3 - first return
1009            { 72, 88,
1010                { },
1011                {
1012                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1013                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1014                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1015                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1016                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1017                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
1018                }, false, true, true },
1019            // block 4 - second return
1020            { 88, 104,
1021                { },
1022                {
1023                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1024                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1025                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1026                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1027                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1028                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1029                }, false, true, true }
1030        },
1031        {   // SSA replaces
1032            { { "sa", 2 }, { { 4, 3 } } },
1033            { { "sa", 3 }, { { 4, 3 } } },
1034            { { "sa", 5 }, { { 2, 1 } } },
1035            { { "sa", 6 }, { { 2, 1 } } }
1036        },
1037        true, ""
1038    },
1039    {   // 34 - retssa tests
1040        R"ffDXD(.regvar sa:s:8, va:v:8
1041        s_mov_b32 sa[2], s4
1042        s_mov_b32 sa[3], s5
1043        s_mov_b32 sa[4], s6
1044        s_mov_b32 sa[5], s6
1045        s_mov_b32 sa[6], s7
1046        s_mov_b32 sa[7], s7
1047       
1048        .cf_call routine
1049        s_swappc_b64 s[0:1], s[2:3]
1050       
1051        s_lshl_b32 sa[2], sa[2], 3
1052        s_lshl_b32 sa[3], sa[1], 4
1053        s_cbranch_scc1 aa1
1054       
1055aa0:    s_lshl_b32 sa[5], sa[1], 4
1056        s_lshl_b32 sa[4], sa[1], 4
1057        s_branch ca0
1058       
1059aa1:    s_lshl_b32 sa[6], sa[1], 4
1060        s_lshl_b32 sa[3], sa[3], 4
1061        s_lshl_b32 sa[5], sa[1], 4
1062       
1063ca0:    .cf_call routine
1064        s_swappc_b64 s[0:1], s[2:3]
1065
1066        s_lshl_b32 sa[6], sa[3], 4
1067        s_lshl_b32 sa[6], sa[4], 4
1068        s_cbranch_execz aa3
1069       
1070aa2:    s_lshr_b32 sa[7], sa[1], 4
1071        s_endpgm
1072       
1073aa3:    s_ashr_i32 sa[7], sa[7], 4
1074        s_endpgm
1075       
1076routine:
1077        s_xor_b32 sa[2], sa[2], sa[0]
1078        s_xor_b32 sa[3], sa[3], sa[0]
1079        .cf_cjump bb1, bb2
1080        s_setpc_b64 s[0:1]
1081       
1082bb0:    s_min_u32 sa[2], sa[2], sa[0]
1083        s_min_u32 sa[3], sa[3], sa[0]
1084        s_max_u32 sa[4], sa[4], sa[0]
1085        s_xor_b32 sa[5], sa[5], sa[0]
1086        s_xor_b32 sa[6], sa[6], sa[0]
1087        s_xor_b32 sa[7], sa[7], sa[0]
1088        .cf_ret
1089        s_setpc_b64 s[0:1]
1090       
1091bb1:    s_and_b32 sa[2], sa[2], sa[0]
1092        s_and_b32 sa[3], sa[3], sa[0]
1093        s_max_u32 sa[4], sa[4], sa[0]
1094        s_xor_b32 sa[5], sa[5], sa[0]
1095        s_xor_b32 sa[6], sa[6], sa[0]
1096        s_xor_b32 sa[7], sa[7], sa[0]
1097        .cf_ret
1098        s_setpc_b64 s[0:1]
1099
1100bb2:    s_and_b32 sa[2], sa[2], sa[0]
1101        s_and_b32 sa[3], sa[3], sa[0]
1102        s_max_u32 sa[4], sa[4], sa[0]
1103        s_xor_b32 sa[5], sa[5], sa[0]
1104        s_xor_b32 sa[6], sa[6], sa[0]
1105        s_xor_b32 sa[7], sa[7], sa[0]
1106        .cf_ret
1107        s_setpc_b64 s[0:1]
1108)ffDXD",
1109        {
1110            {   // block 0 - start
1111                0, 28,
1112                { { 8, true } },
1113                {
1114                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1115                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1116                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1117                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1118                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1119                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1120                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1121                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1122                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1123                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1124                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1125                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1126                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
1127                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
1128                }, true, false, false },
1129            {   // block 1 - after call
1130                28, 40,
1131                { { 2, false }, { 3, false } },
1132                {
1133                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1134                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1135                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1136                }, false, false, false },
1137            {   // block 2 - aa0
1138                40, 52,
1139                { { 4, false } },
1140                {
1141                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1142                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1143                    { { "sa", 5 }, SSAInfo(1, 5, 5, 5, 1, false) }
1144                }, false, false, true },
1145            {   // block 3 - aa1
1146                52, 64,
1147                { },
1148                {
1149                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1150                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
1151                    { { "sa", 5 }, SSAInfo(1, 6, 6, 6, 1, false) },
1152                    { { "sa", 6 }, SSAInfo(1, 7, 7, 7, 1, false) }
1153                }, false, false, false },
1154            {   // block 4 - ca0
1155                64, 68,
1156                { { 8, true } },
1157                {
1158                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1159                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1160                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1161                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1162                }, true, false, false },
1163            {   // block 5 - last cond
1164                68, 80,
1165                { { 6, false }, { 7, false } },
1166                {
1167                    { { "sa", 3 }, SSAInfo(3, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1168                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1169                    { { "sa", 6 }, SSAInfo(1, 5, 5, 6, 2, false) }
1170                }, false, false, false },
1171            {   // block 6 - end1
1172                80, 88,
1173                { },
1174                {
1175                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1176                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, false) }
1177                }, false, false, true },
1178            {   // block 7 - end2
1179                88, 96,
1180                { },
1181                {
1182                    { { "sa", 7 }, SSAInfo(2, 6, 6, 6, 1, true) }
1183                }, false, false, true },
1184            {   // block 8 - routine
1185                96, 108,
1186                { { 9, false }, { 10, false }, { 11, false } },
1187                {
1188                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1189                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1190                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1191                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1192                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1193                }, false, false, false },
1194            {   // block 9 - bb0
1195                108, 136,
1196                { },
1197                {
1198                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1199                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1200                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1201                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1202                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1203                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1204                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1205                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1206                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
1207                }, false, true, true },
1208            {   // block 10 - bb1
1209                136, 164,
1210                { },
1211                {
1212                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1213                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1214                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1215                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1216                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1217                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1218                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1219                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1220                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) }
1221                }, false, true, true },
1222            {   // block 11 - bb2
1223                164, 192,
1224                { },
1225                {
1226                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1227                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1228                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1229                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1230                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1231                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1232                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1233                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) },
1234                    { { "sa", 7 }, SSAInfo(1, 4, 4, 4, 1, true) }
1235                }, false, true, true }
1236        },
1237        {   // SSA replaces
1238            { { "sa", 2 }, { { 4, 3 }, { 5, 3 }, { 6, 1 }, { 6, 1 } } },
1239            { { "sa", 3 }, { { 4, 3 }, { 5, 3 }, { 6, 1 }, { 7, 1 } } },
1240            { { "sa", 4 }, { { 3, 2 }, { 4, 2 }, { 5, 1 }, { 5, 1 }, { 5, 1 }, { 2, 1 },
1241                    { 2, 1 }, { 2, 1 } } },
1242            { { "sa", 5 }, { { 5, 1 }, { 5, 1 }, { 5, 1 },
1243                    { 6, 1 }, { 6, 1 }, { 6, 1 } } },
1244            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 2, 1 }, { 3, 1 }, { 4, 1 },
1245                    { 2, 1 }, { 3, 1 }, { 4, 1 }, { 7, 1 }, { 7, 1 }, { 7, 1 } } },
1246            { { "sa", 7 }, { { 3, 2 }, { 4, 2 }, { 2, 1 }, { 2, 1 }, { 2, 1 },
1247                    { 2, 1 }, { 2, 1 }, { 2, 1 } } }
1248        },
1249        true, ""
1250    },
1251    {   // 35 - retssa tests
1252        R"ffDXD(.regvar sa:s:8, va:v:8
1253        s_mov_b32 sa[2], s4
1254        s_mov_b32 sa[3], s5
1255        s_mov_b32 sa[4], s6
1256        s_mov_b32 sa[5], s5
1257        s_mov_b32 sa[6], s6
1258       
1259        .cf_call routine
1260        s_swappc_b64 s[0:1], s[2:3]
1261       
1262        s_lshl_b32 sa[2], sa[2], 3
1263        s_lshl_b32 sa[3], sa[1], 4
1264        s_cbranch_scc1 aa1
1265       
1266aa0:    s_lshl_b32 sa[2], sa[2], 3
1267        s_lshl_b32 sa[4], sa[3], 3
1268        s_lshl_b32 sa[6], sa[5], 3
1269        s_endpgm
1270
1271aa1:    s_lshl_b32 sa[2], sa[1], 3
1272        s_lshl_b32 sa[2], sa[3], 3
1273        s_lshl_b32 sa[4], sa[4], 3
1274        s_lshl_b32 sa[6], sa[6], 3
1275        s_endpgm
1276       
1277routine:
1278        s_xor_b32 sa[2], sa[2], sa[0]
1279        s_xor_b32 sa[3], sa[3], sa[0]
1280        .cf_cjump bb1, bb2
1281        s_setpc_b64 s[0:1]
1282       
1283bb0:    s_min_u32 sa[2], sa[2], sa[0]
1284        s_min_u32 sa[3], sa[3], sa[0]
1285        s_max_u32 sa[4], sa[4], sa[0]
1286        s_xor_b32 sa[5], sa[5], sa[0]
1287        s_xor_b32 sa[6], sa[6], sa[0]
1288        .cf_ret
1289        s_setpc_b64 s[0:1]
1290       
1291bb1:    s_and_b32 sa[2], sa[2], sa[0]
1292        s_and_b32 sa[3], sa[3], sa[0]
1293        s_max_u32 sa[4], sa[4], sa[0]
1294        s_xor_b32 sa[5], sa[5], sa[0]
1295        s_xor_b32 sa[6], sa[6], sa[0]
1296        .cf_ret
1297        s_setpc_b64 s[0:1]
1298
1299bb2:    s_and_b32 sa[2], sa[2], sa[0]
1300        s_and_b32 sa[3], sa[3], sa[0]
1301        s_max_u32 sa[4], sa[4], sa[0]
1302        s_xor_b32 sa[5], sa[5], sa[0]
1303        s_xor_b32 sa[6], sa[6], sa[0]
1304        .cf_ret
1305        s_setpc_b64 s[0:1]
1306)ffDXD",
1307        {
1308            {   // block 0 - start
1309                0, 24,
1310                { { 4, true } },
1311                {
1312                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1313                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1314                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1315                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1316                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1317                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1318                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1319                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1320                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1321                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1322                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1323                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1324                }, true, false, false },
1325            {   // block 1 - after call
1326                24, 36,
1327                { { 2, false }, { 3, false } },
1328                {
1329                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1330                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1331                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1332                }, false, false, false },
1333            {   // block 2 - aa0
1334                36, 52,
1335                { },
1336                {
1337                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
1338                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1339                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1340                    { { "sa", 5 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) },
1341                    { { "sa", 6 }, SSAInfo(1, 5, 5, 5, 1, false) }
1342                }, false, false, true },
1343            {   // block 3 - aa1
1344                52, 72,
1345                { },
1346                {
1347                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1348                    { { "sa", 2 }, SSAInfo(6, 8, 8, 9, 2, false) },
1349                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1350                    { { "sa", 4 }, SSAInfo(2, 6, 6, 6, 1, true) },
1351                    { { "sa", 6 }, SSAInfo(2, 6, 6, 6, 1, true) }
1352                }, false, false, true },
1353            {   // block 4 - routine
1354                72, 84,
1355                { { 5, false }, { 6, false }, { 7, false } },
1356                {
1357                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1358                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1359                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1360                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1361                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1362                }, false, false, false },
1363            {   // block 5 - bb0
1364                84, 108,
1365                { },
1366                {
1367                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1368                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1369                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1370                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1371                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1372                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1373                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1374                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1375                }, false, true, true },
1376            {   // block 6 - bb1
1377                108, 132,
1378                { },
1379                {
1380                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1381                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1382                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1383                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1384                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1385                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1386                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1387                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1388                }, false, true, true },
1389            {   // block 7 - bb2
1390                132, 156,
1391                { },
1392                {
1393                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1394                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1395                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1396                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1397                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1398                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1399                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1400                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
1401                }, false, true, true }
1402        },
1403        {   // SSA replaces
1404            { { "sa", 2 }, { { 4, 3 }, { 5, 3 } } },
1405            { { "sa", 4 }, { { 3, 2 }, { 4, 2 } } },
1406            { { "sa", 5 }, { { 3, 2 }, { 4, 2 } } },
1407            { { "sa", 6 }, { { 3, 2 }, { 4, 2 } } }
1408        },
1409        true, ""
1410    },
1411    {   // 35 - retssa tests
1412        R"ffDXD(.regvar sa:s:10, va:v:8
1413        s_mov_b32 sa[2], s4
1414        s_mov_b32 sa[3], s5
1415        s_mov_b32 sa[4], s6
1416        s_mov_b32 sa[5], s5
1417        v_mov_b32 va[1], v0
1418        v_mov_b32 va[2], v1
1419       
1420        .cf_call routine
1421        s_swappc_b64 s[0:1], s[2:3]
1422        s_cbranch_vccnz aa1
1423aa0:    s_xor_b32 sa[2], sa[1], sa[0]
1424        s_xor_b32 sa[3], sa[3], sa[0]
1425       
1426        .cf_call routine2
1427        s_swappc_b64 s[0:1], s[2:3]
1428       
1429        s_cbranch_vccnz aa3
1430aa2:    s_xor_b32 sa[6], sa[1], sa[0]
1431        s_xor_b32 sa[7], sa[7], sa[0]
1432        v_xor_b32 va[1], va[0], va[0]
1433        v_xor_b32 va[2], va[0], va[0]
1434        s_endpgm
1435       
1436aa3:    s_xor_b32 sa[6], sa[6], sa[0]
1437        s_xor_b32 sa[7], sa[7], sa[0]
1438        s_xor_b32 sa[8], sa[8], sa[0]
1439        s_xor_b32 sa[5], sa[5], sa[0]
1440        v_xor_b32 va[1], va[1], va[0]
1441        v_xor_b32 va[0], va[2], va[0]
1442        s_endpgm
1443       
1444aa1:    s_xor_b32 sa[2], sa[2], sa[0]
1445        s_xor_b32 sa[3], sa[3], sa[0]
1446        s_xor_b32 sa[2], sa[4], sa[0]
1447        s_xor_b32 sa[5], sa[5], sa[0]
1448        s_cbranch_execz aa5
1449       
1450aa4:    s_xor_b32 sa[4], sa[4], sa[0]
1451        v_xor_b32 va[1], va[1], va[0]
1452        s_endpgm
1453       
1454aa5:    s_xor_b32 sa[4], sa[4], sa[0]
1455        s_endpgm
1456       
1457routine:
1458        s_xor_b32 sa[2], sa[2], sa[0]
1459        s_xor_b32 sa[3], sa[3], sa[0]
1460        s_cbranch_vccz bb1
1461       
1462bb0:    s_min_u32 sa[2], sa[2], sa[0]
1463        s_min_u32 sa[3], sa[3], sa[0]
1464        s_max_u32 sa[4], sa[4], sa[0]
1465        s_xor_b32 sa[5], sa[5], sa[0]
1466        v_xor_b32 va[1], va[1], va[0]
1467        v_xor_b32 va[2], va[2], va[0]
1468        .cf_ret
1469        s_setpc_b64 s[0:1]
1470       
1471bb1:    s_and_b32 sa[2], sa[2], sa[0]
1472        s_and_b32 sa[3], sa[3], sa[0]
1473        s_max_u32 sa[4], sa[4], sa[0]
1474        s_xor_b32 sa[5], sa[5], sa[0]
1475        v_xor_b32 va[1], va[1], va[0]
1476        v_xor_b32 va[2], va[2], va[0]
1477        .cf_ret
1478        s_setpc_b64 s[0:1]
1479
1480routine2:
1481        s_xor_b32 sa[6], sa[6], sa[1]
1482        s_xor_b32 sa[7], sa[7], sa[1]
1483        s_cbranch_vccz bb3
1484       
1485bb2:    s_min_u32 sa[6], sa[6], sa[1]
1486        s_min_u32 sa[7], sa[7], sa[1]
1487        s_max_u32 sa[8], sa[8], sa[1]
1488        s_xor_b32 sa[5], sa[5], sa[1]
1489        .cf_ret
1490        s_setpc_b64 s[0:1]
1491       
1492bb3:    s_and_b32 sa[6], sa[6], sa[1]
1493        s_and_b32 sa[7], sa[7], sa[1]
1494        s_max_u32 sa[8], sa[8], sa[1]
1495        s_xor_b32 sa[5], sa[5], sa[1]
1496        .cf_ret
1497        s_setpc_b64 s[0:1]
1498)ffDXD",
1499        {
1500            {   // block 0 - start
1501                0, 28,
1502                { { 9, true } },
1503                {
1504                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1505                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1506                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1507                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1508                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1509                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1510                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1511                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1512                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1513                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1514                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1515                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1516                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1517                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1518                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
1519                }, true, false, false },
1520            {   // block 1 - branch aa0-aa1
1521                28, 32,
1522                { { 2, false }, { 6, false } },
1523                {
1524                }, false, false, false },
1525            {   // block 2 - aa0
1526                32, 44,
1527                { { 12, true } },
1528                {
1529                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1530                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1531                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1532                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1533                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1534                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1535                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1536                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1537                }, true, false, false },
1538            {   // block 3 - branch aa2-aa3
1539                44, 48,
1540                { { 4, false }, { 5, false } },
1541                {
1542                }, false, false, false },
1543            {   // block 4 - aa2
1544                48, 68,
1545                { },
1546                {
1547                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1548                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1549                    { { "sa", 6 }, SSAInfo(0, 4, 4, 4, 1, false) },
1550                    { { "sa", 7 }, SSAInfo(2, 4, 4, 4, 1, true) },
1551                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1552                    { { "va", 1 }, SSAInfo(1, 4, 4, 4, 1, false) },
1553                    { { "va", 2 }, SSAInfo(1, 4, 4, 4, 1, false) }
1554                }, false, false, true },
1555            {   // block 5 - aa3
1556                68, 96,
1557                { },
1558                {
1559                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1560                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) },
1561                    { { "sa", 6 }, SSAInfo(2, 5, 5, 5, 1, true) },
1562                    { { "sa", 7 }, SSAInfo(2, 5, 5, 5, 1, true) },
1563                    { { "sa", 8 }, SSAInfo(1, 3, 3, 3, 1, true) },
1564                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
1565                    { { "va", 1 }, SSAInfo(2, 5, 5, 5, 1, true) },
1566                    { { "va", 2 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1567                }, false, false, true },
1568            {   // block 6 - aa1
1569                96, 116,
1570                { { 7, false }, { 8, false } },
1571                {
1572                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1573                    { { "sa", 2 }, SSAInfo(3, 6, 6, 7, 2, true) },
1574                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) },
1575                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
1576                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) }
1577                }, false, false, false },
1578            {   // block 7 - aa4
1579                116, 128,
1580                { },
1581                {
1582                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1583                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
1584                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1585                    { { "va", 1 }, SSAInfo(2, 6, 6, 6, 1, true) }
1586                }, false, false, true },
1587            {   // block 8 - aa5
1588                128, 136,
1589                { },
1590                {
1591                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1592                    { { "sa", 4 }, SSAInfo(2, 5, 5, 5, 1, true) }
1593                }, false, false, true },
1594            {   // block 9 - routine
1595                136, 148,
1596                { { 10, false }, { 11, false } },
1597                {
1598                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1599                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1600                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1601                }, false, false, false },
1602            {   // block 10 - bb0
1603                148, 176,
1604                { },
1605                {
1606                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1607                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1608                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1609                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1610                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1611                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1612                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1613                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1614                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1615                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1616                }, false, true, true },
1617            {   // block 11 - bb1
1618                176, 204,
1619                { },
1620                {
1621                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1622                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1623                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1624                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1625                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1626                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1627                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1628                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1629                    { { "va", 1 }, SSAInfo(1, 3, 3, 3, 1, true) },
1630                    { { "va", 2 }, SSAInfo(1, 3, 3, 3, 1, true) }
1631                }, false, true, true },
1632            {   // block 12 - routine2
1633                204, 216,
1634                { { 13, false }, { 14, false } },
1635                {
1636                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1637                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, true) },
1638                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, true) }
1639                }, false, false, false },
1640            {   // block 13 - bb2
1641                216, 236,
1642                { },
1643                {
1644                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1645                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1646                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1647                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
1648                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1649                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) },
1650                    { { "sa", 8 }, SSAInfo(0, 1, 1, 1, 1, true) }
1651                }, false, true, true },
1652            {   // block 14 - bb3
1653                236, 256,
1654                { },
1655                {
1656                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1657                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1658                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1659                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, true) },
1660                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1661                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) },
1662                    { { "sa", 8 }, SSAInfo(0, 2, 2, 2, 1, true) }
1663                }, false, true, true }
1664        },
1665        {   // SSA replaces
1666            { { "sa", 2 }, { { 4, 3 } } },
1667            { { "sa", 3 }, { { 4, 3 } } },
1668            { { "sa", 4 }, { { 3, 2 } } },
1669            { { "sa", 5 }, { { 3, 2 }, { 5, 4 } } },
1670            { { "sa", 6 }, { { 3, 2 } } },
1671            { { "sa", 7 }, { { 3, 2 } } },
1672            { { "sa", 8 }, { { 2, 1 } } },
1673            { { "va", 1 }, { { 3, 2 } } },
1674            { { "va", 2 }, { { 3, 2 } } }
1675        },
1676        true, ""
1677    },
1678    { nullptr }
1679};
Note: See TracBrowser for help on using the repository browser.