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

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

CLRadeonExtender: AsmRegAlloc?: Delete obsolete (finished) TODO in testcase.

File size: 144.2 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    {   // 0 - 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    {  // 1 - 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 } } },
373            { { "sa", 3 }, { { 2, 1 }, { 3, 1 } } },
374            { { "sa", 4 }, { { 4, 1 }, { 2, 1 } } },
375            { { "sa", 6 }, { { 3, 1 }, } },
376            { { "va", 0 }, { { 2, 0 } } },
377            { { "va", 2 }, { { 3, 1 }, } },
378            { { "va", 3 }, { { 2, 0 } } },
379            { { "va", 4 }, { { 2, 0 } } },
380            { { "xa", 0 }, { { 4, 0 }, { 3, 1 } } },
381            { { "xa", 3 }, { { 3, 0 }, { 2, 0 } } },
382            { { "xa", 4 }, { { 2, 0 } } }
383        },
384        true, ""
385    },
386    {   // 2 - 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    {   // 3 - routine with loop
531        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
532        s_mov_b32 sa[2], s4
533        s_mov_b32 sa[3], s5
534        s_mov_b32 sa[4], s6
535        s_mov_b32 sa[5], s7
536       
537        .cf_call routine
538        s_swappc_b64 s[0:1], s[2:3]
539       
540        s_xor_b32 sa[5], sa[5], sa[0]
541        s_xor_b32 sa[2], sa[2], sa[0]
542       
543        .cf_call routine
544        s_swappc_b64 s[0:1], s[2:3]
545       
546        s_endpgm
547       
548routine:
549        s_add_u32 sa[2], sa[2], sa[0]
550        s_add_u32 sa[3], sa[3], sa[1]
551       
552loop0:
553        s_add_u32 sa[4], sa[3], sa[0]
554        s_add_u32 sa[5], sa[3], sa[5]
555        s_cbranch_scc1 j1
556       
557j0:     s_add_u32 sa[2], sa[3], sa[0]
558        s_branch loopend
559
560j1:     s_add_u32 sa[5], sa[2], sa[0]
561
562loopend:
563        s_add_u32 sa[5], sa[5], sa[1]
564        s_cbranch_scc0 loop0
565       
566        s_add_u32 sa[5], sa[5], sa[0]
567        s_add_u32 sa[3], sa[3], sa[1]
568        .cf_ret
569        s_setpc_b64 s[0:1]
570)ffDXD",
571        {
572            {   // block 0 - start
573                0, 20,
574                { { 3, true } },
575                {
576                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
577                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
578                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
579                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
580                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
581                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
582                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
583                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
584                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
585                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
586                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
587                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
588                }, true, false, false },
589            {   // block 1 - before second call
590                20, 32,
591                { { 3, true } },
592                {
593                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
594                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
595                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
596                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
597                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
598                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
599                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) }
600                }, true, false, false },
601            {   // block 2 - end
602                32, 36,
603                { },
604                { }, false, false, true },
605            {   // block 3 - routine
606                36, 44,
607                { },
608                {
609                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
610                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
611                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
612                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
613                }, false, false, false },
614            {   // block 4 - loop
615                44, 56,
616                { { 5, false }, { 6, false } },
617                {
618                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
619                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
620                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
621                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
622                },
623                false, false, false },
624            {   // block 5 - j0
625                56, 64,
626                { { 7, false } },
627                {
628                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
629                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
630                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) }
631                }, false, false, true },
632            {   // block 6 - j1
633                64, 68,
634                { },
635                {
636                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
637                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
638                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, false) }
639                }, false, false, false },
640            {   // block 7 - loopend
641                68, 76,
642                { { 4, false }, { 8, false } },
643                {
644                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
645                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
646                }, false, false, false },
647            {   // block 8 - routine end
648                76, 88,
649                { },
650                {
651                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
652                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
653                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
654                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
655                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
656                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
657                }, false, true, true }
658        },
659        {   // SSA replaces
660            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
661            { { "sa", 5 }, { { 3, 1 }, { 5, 2 }, { 6, 1 } } }
662        },
663        true, ""
664    },
665    {   // 4 - routine with condition
666        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
667        s_mov_b32 sa[2], s4
668        s_mov_b32 sa[3], s5
669        s_mov_b32 sa[4], s6
670        s_mov_b32 sa[5], s7
671       
672        .cf_call routine
673        s_swappc_b64 s[0:1], s[2:3]
674       
675        s_xor_b32 sa[5], sa[5], sa[0]
676        s_xor_b32 sa[2], sa[2], sa[0]
677       
678        .cf_call routine
679        s_swappc_b64 s[0:1], s[2:3]
680       
681        s_endpgm
682       
683routine:
684        s_add_u32 sa[2], sa[2], sa[0]
685        s_add_u32 sa[3], sa[3], sa[1]
686       
687        s_add_u32 sa[4], sa[3], sa[0]
688        s_add_u32 sa[5], sa[3], sa[5]
689        s_cbranch_scc1 j1
690       
691j0:     s_add_u32 sa[2], sa[3], sa[0]
692        s_add_u32 sa[4], sa[3], sa[1]
693        s_branch rend
694
695j1:     s_add_u32 sa[5], sa[2], sa[0]
696        s_add_u32 sa[4], sa[3], sa[1]
697
698rend:
699        s_add_u32 sa[5], sa[5], sa[0]
700        s_add_u32 sa[3], sa[3], sa[1]
701        .cf_ret
702        s_setpc_b64 s[0:1]
703)ffDXD",
704        {
705            {   // block 0 - start
706                0, 20,
707                { { 3, true } },
708                {
709                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
710                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
711                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
712                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
713                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
714                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
715                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
716                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
717                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
718                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
719                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
720                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
721                }, true, false, false },
722            {   // block 1 - before second call
723                20, 32,
724                { { 3, true } },
725                {
726                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
727                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
728                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
729                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
730                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
731                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
732                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
733                }, true, false, false },
734            {   // block 2 - end
735                32, 36,
736                { },
737                { }, false, false, true },
738            {   // block 3 - routine
739                36, 56,
740                { { 4, false }, { 5, false } },
741                {
742                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
743                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
744                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
745                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
746                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
747                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
748                }, false, false, false },
749            {   // block 4 - j0
750                56, 68,
751                { { 6, false } },
752                {
753                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
754                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
755                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
756                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
757                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, false) }
758                },
759                false, false, true },
760            {   // block 5 - j1
761                68, 76,
762                { },
763                {
764                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
765                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
766                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
767                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
768                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, false) },
769                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, false) }
770                }, false, false, false },
771            {   // block 6 - end
772                76, 88,
773                { },
774                {
775                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
776                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
777                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
778                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
779                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
780                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
781                }, false, true, true }
782        },
783        {   // SSA replaces
784            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
785            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
786        },
787        true, ""
788    },
789    {   // 5 - two routines with common code
790        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
791        s_mov_b32 sa[2], s4
792        s_mov_b32 sa[3], s5
793        s_mov_b32 sa[4], s6
794        s_mov_b32 sa[5], s7
795        s_mov_b32 sa[6], s8
796        s_mov_b32 xa[0], s9
797        s_mov_b32 xa[1], s10
798       
799        .cf_call routine1
800        s_swappc_b64 s[0:1], s[2:3]
801       
802        s_xor_b32 sa[5], sa[5], sa[0]
803        s_xor_b32 sa[2], sa[2], sa[0]
804       
805        .cf_call routine2
806        s_swappc_b64 s[0:1], s[2:3]
807       
808        s_xor_b32 sa[5], sa[5], sa[0]
809        s_xor_b32 sa[2], sa[2], sa[0]
810        s_xor_b32 sa[6], sa[6], sa[0]
811        s_xor_b32 xa[0], xa[0], sa[0]
812        s_xor_b32 xa[1], xa[1], sa[0]
813        s_endpgm
814       
815routine1:
816        s_add_u32 sa[2], sa[2], sa[0]
817        s_add_u32 sa[3], sa[3], sa[1]
818       
819        s_add_u32 sa[4], sa[3], sa[0]
820        s_add_u32 sa[5], sa[3], sa[5]
821        s_add_u32 sa[6], sa[6], sa[1]
822       
823        s_xor_b32 xa[1], xa[1], sa[0]
824       
825common:
826        s_add_u32 sa[5], sa[5], sa[0]
827        s_add_u32 sa[3], sa[3], sa[1]
828        s_xor_b32 sa[4], sa[4], sa[2]
829        .cf_ret
830        s_setpc_b64 s[0:1]
831
832routine2:
833        s_add_u32 sa[2], sa[2], sa[0]
834        s_add_u32 sa[3], sa[3], sa[1]
835       
836        s_add_u32 sa[4], sa[1], sa[2]
837        s_add_u32 sa[5], sa[3], sa[5]
838       
839        s_xor_b32 xa[0], xa[0], sa[0]
840        s_branch common
841)ffDXD",
842        {
843            {   // block 0 - start
844                0, 32,
845                { { 3, true } },
846                {
847                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
848                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
849                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
850                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
851                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
852                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
853                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
854                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
855                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
856                    { { "", 9 }, SSAInfo(0, 0, 0, 0, 0, true) },
857                    { { "", 10 }, SSAInfo(0, 0, 0, 0, 0, true) },
858                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
859                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
860                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
861                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
862                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
863                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
864                    { { "xa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
865                }, true, false, false },
866            {   // block 1 - after routine1 call
867                32, 44,
868                { { 5, true } },
869                {
870                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
871                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
872                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
873                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
874                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
875                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
876                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
877                }, true, false, false },
878            {   // block 2 - after routine2 call
879                44, 68,
880                { },
881                {
882                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
883                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
884                    { { "sa", 5 }, SSAInfo(3, 6, 6, 6, 1, true) },
885                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) },
886                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
887                    { { "xa", 1 }, SSAInfo(2, 3, 3, 3, 1, true) }
888                }, false, false, true },
889            {   // block 3 - routine1
890                68, 92,
891                { },
892                {
893                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
894                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
895                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
896                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
897                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
898                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
899                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
900                    { { "xa", 1 }, SSAInfo(1, 2, 2, 2, 1, true) }
901                }, false, false, false },
902            {   // block 4 - common part
903                92, 108,
904                { },
905                {
906                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
907                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
908                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
909                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
910                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
911                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
912                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
913                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
914                }, false, true, true },
915            {   // block 5 - routine2
916                108, 132,
917                { { 4, false } },
918                {
919                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
920                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
921                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
922                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
923                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) },
924                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
925                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) }
926                }, false, false, true }
927        },
928        {   // SSA replaces
929            { { "sa", 2 }, { { 4, 2 } } },
930            { { "sa", 3 }, { { 4, 2 } } },
931            { { "sa", 4 }, { { 4, 2 } } },
932            { { "sa", 5 }, { { 5, 2 } } }
933        },
934        true, ""
935    },
936    {   // 6 - simple call, more complex routine (reduce with reads)
937        R"ffDXD(.regvar sa:s:8, va:v:8
938        s_mov_b32 sa[2], s4
939        s_mov_b32 sa[3], s5
940        s_mov_b32 sa[5], s6
941        s_mov_b32 sa[6], s7
942       
943        s_getpc_b64 s[2:3]
944        s_add_u32 s2, s2, routine-.
945        s_add_u32 s3, s3, routine-.+4
946        .cf_call routine
947        s_swappc_b64 s[0:1], s[2:3]
948       
949        s_lshl_b32 sa[2], sa[2], 3
950        s_lshl_b32 sa[3], sa[3], 4
951        s_lshl_b32 sa[5], sa[5], 4
952        s_lshl_b32 sa[6], sa[6], 4
953        s_endpgm
954       
955routine:
956        s_xor_b32 sa[2], sa[2], sa[4]
957        s_xor_b32 sa[3], sa[3], sa[4]
958        s_cbranch_scc1 bb1
959       
960        s_min_u32 sa[2], sa[2], sa[4]
961        s_min_u32 sa[3], sa[3], sa[4]
962        s_xor_b32 sa[5], sa[5], sa[4]
963        .cf_ret
964        s_setpc_b64 s[0:1]
965       
966bb1:    s_and_b32 sa[2], sa[2], sa[4]
967        s_and_b32 sa[3], sa[3], sa[4]
968        s_xor_b32 sa[6], sa[6], sa[4]
969        .cf_ret
970        s_setpc_b64 s[0:1]
971)ffDXD",
972        {
973            { 0, 40,
974                { { 2, true } },
975                {
976                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
977                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
978                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
979                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
980                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
981                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
982                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
983                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
984                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
985                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
986                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
987                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
988                }, true, false, false },
989            // block 1 - after call
990            { 40, 60,
991                { },
992                {
993                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
994                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
995                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
996                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
997                }, false, false, true },
998            // block 2 - routine
999            { 60, 72,
1000                { { 3, false }, { 4, false } },
1001                {
1002                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1003                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
1004                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1005                }, false, false, false },
1006            // block 3 - first return
1007            { 72, 88,
1008                { },
1009                {
1010                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1011                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1012                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1013                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1014                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1015                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
1016                }, false, true, true },
1017            // block 4 - second return
1018            { 88, 104,
1019                { },
1020                {
1021                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1022                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1023                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1024                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1025                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1026                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1027                }, false, true, true }
1028        },
1029        {   // SSA replaces
1030            { { "sa", 2 }, { { 4, 3 } } },
1031            { { "sa", 3 }, { { 4, 3 } } },
1032            { { "sa", 5 }, { { 2, 1 } } },
1033            { { "sa", 6 }, { { 2, 1 } } }
1034        },
1035        true, ""
1036    },
1037    {   // 7 - retssa tests
1038        R"ffDXD(.regvar sa:s:8, va:v:8
1039        s_mov_b32 sa[2], s4
1040        s_mov_b32 sa[3], s5
1041        s_mov_b32 sa[4], s6
1042        s_mov_b32 sa[5], s6
1043        s_mov_b32 sa[6], s7
1044        s_mov_b32 sa[7], s7
1045       
1046        .cf_call routine
1047        s_swappc_b64 s[0:1], s[2:3]
1048       
1049        s_lshl_b32 sa[2], sa[2], 3
1050        s_lshl_b32 sa[3], sa[1], 4
1051        s_cbranch_scc1 aa1
1052       
1053aa0:    s_lshl_b32 sa[5], sa[1], 4
1054        s_lshl_b32 sa[4], sa[1], 4
1055        s_branch ca0
1056       
1057aa1:    s_lshl_b32 sa[6], sa[1], 4
1058        s_lshl_b32 sa[3], sa[3], 4
1059        s_lshl_b32 sa[5], sa[1], 4
1060       
1061ca0:    .cf_call routine
1062        s_swappc_b64 s[0:1], s[2:3]
1063
1064        s_lshl_b32 sa[6], sa[3], 4
1065        s_lshl_b32 sa[6], sa[4], 4
1066        s_cbranch_execz aa3
1067       
1068aa2:    s_lshr_b32 sa[7], sa[1], 4
1069        s_endpgm
1070       
1071aa3:    s_ashr_i32 sa[7], sa[7], 4
1072        s_endpgm
1073       
1074routine:
1075        s_xor_b32 sa[2], sa[2], sa[0]
1076        s_xor_b32 sa[3], sa[3], sa[0]
1077        .cf_cjump bb1, bb2
1078        s_setpc_b64 s[0:1]
1079       
1080bb0:    s_min_u32 sa[2], sa[2], sa[0]
1081        s_min_u32 sa[3], sa[3], sa[0]
1082        s_max_u32 sa[4], sa[4], sa[0]
1083        s_xor_b32 sa[5], sa[5], sa[0]
1084        s_xor_b32 sa[6], sa[6], sa[0]
1085        s_xor_b32 sa[7], sa[7], sa[0]
1086        .cf_ret
1087        s_setpc_b64 s[0:1]
1088       
1089bb1:    s_and_b32 sa[2], sa[2], sa[0]
1090        s_and_b32 sa[3], sa[3], sa[0]
1091        s_max_u32 sa[4], sa[4], sa[0]
1092        s_xor_b32 sa[5], sa[5], sa[0]
1093        s_xor_b32 sa[6], sa[6], sa[0]
1094        s_xor_b32 sa[7], sa[7], sa[0]
1095        .cf_ret
1096        s_setpc_b64 s[0:1]
1097
1098bb2:    s_and_b32 sa[2], sa[2], sa[0]
1099        s_and_b32 sa[3], sa[3], sa[0]
1100        s_max_u32 sa[4], sa[4], sa[0]
1101        s_xor_b32 sa[5], sa[5], sa[0]
1102        s_xor_b32 sa[6], sa[6], sa[0]
1103        s_xor_b32 sa[7], sa[7], sa[0]
1104        .cf_ret
1105        s_setpc_b64 s[0:1]
1106)ffDXD",
1107        {
1108            {   // block 0 - start
1109                0, 28,
1110                { { 8, true } },
1111                {
1112                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1113                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1114                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1115                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1116                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1117                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1118                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1119                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1120                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1121                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1122                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1123                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1124                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
1125                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
1126                }, true, false, false },
1127            {   // block 1 - after call
1128                28, 40,
1129                { { 2, false }, { 3, false } },
1130                {
1131                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1132                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1133                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1134                }, false, false, false },
1135            {   // block 2 - aa0
1136                40, 52,
1137                { { 4, false } },
1138                {
1139                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1140                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1141                    { { "sa", 5 }, SSAInfo(1, 5, 5, 5, 1, false) }
1142                }, false, false, true },
1143            {   // block 3 - aa1
1144                52, 64,
1145                { },
1146                {
1147                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1148                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
1149                    { { "sa", 5 }, SSAInfo(1, 6, 6, 6, 1, false) },
1150                    { { "sa", 6 }, SSAInfo(1, 7, 7, 7, 1, false) }
1151                }, false, false, false },
1152            {   // block 4 - ca0
1153                64, 68,
1154                { { 8, true } },
1155                {
1156                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1157                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1158                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1159                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1160                }, true, false, false },
1161            {   // block 5 - last cond
1162                68, 80,
1163                { { 6, false }, { 7, false } },
1164                {
1165                    { { "sa", 3 }, SSAInfo(3, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1166                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1167                    { { "sa", 6 }, SSAInfo(1, 5, 5, 6, 2, false) }
1168                }, false, false, false },
1169            {   // block 6 - end1
1170                80, 88,
1171                { },
1172                {
1173                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1174                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, false) }
1175                }, false, false, true },
1176            {   // block 7 - end2
1177                88, 96,
1178                { },
1179                {
1180                    { { "sa", 7 }, SSAInfo(2, 6, 6, 6, 1, true) }
1181                }, false, false, true },
1182            {   // block 8 - routine
1183                96, 108,
1184                { { 9, false }, { 10, false }, { 11, false } },
1185                {
1186                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1187                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1188                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1189                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1190                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1191                }, false, false, false },
1192            {   // block 9 - bb0
1193                108, 136,
1194                { },
1195                {
1196                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1197                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1198                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1199                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1200                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1201                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1202                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1203                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1204                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
1205                }, false, true, true },
1206            {   // block 10 - bb1
1207                136, 164,
1208                { },
1209                {
1210                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1211                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1212                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1213                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1214                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1215                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1216                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1217                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1218                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) }
1219                }, false, true, true },
1220            {   // block 11 - bb2
1221                164, 192,
1222                { },
1223                {
1224                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1225                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1226                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1227                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1228                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1229                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1230                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1231                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) },
1232                    { { "sa", 7 }, SSAInfo(1, 4, 4, 4, 1, true) }
1233                }, false, true, true }
1234        },
1235        {   // SSA replaces
1236            { { "sa", 2 }, { { 4, 3 }, { 5, 3 }, { 6, 1 } } },
1237            { { "sa", 3 }, { { 4, 3 }, { 5, 3 }, { 6, 1 }, { 7, 1 } } },
1238            { { "sa", 4 }, { { 3, 2 }, { 4, 2 }, { 5, 1 }, { 2, 1 } } },
1239            { { "sa", 5 }, { { 5, 1 }, { 6, 1 } } },
1240            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 7, 1 } } },
1241            { { "sa", 7 }, { { 3, 2 }, { 4, 2 }, { 2, 1 } } }
1242        },
1243        true, ""
1244    },
1245    {   // 8 - retssa tests
1246        R"ffDXD(.regvar sa:s:8, va:v:8
1247        s_mov_b32 sa[2], s4
1248        s_mov_b32 sa[3], s5
1249        s_mov_b32 sa[4], s6
1250        s_mov_b32 sa[5], s5
1251        s_mov_b32 sa[6], s6
1252       
1253        .cf_call routine
1254        s_swappc_b64 s[0:1], s[2:3]
1255       
1256        s_lshl_b32 sa[2], sa[2], 3
1257        s_lshl_b32 sa[3], sa[1], 4
1258        s_cbranch_scc1 aa1
1259       
1260aa0:    s_lshl_b32 sa[2], sa[2], 3
1261        s_lshl_b32 sa[4], sa[3], 3
1262        s_lshl_b32 sa[6], sa[5], 3
1263        s_endpgm
1264
1265aa1:    s_lshl_b32 sa[2], sa[1], 3
1266        s_lshl_b32 sa[2], sa[3], 3
1267        s_lshl_b32 sa[4], sa[4], 3
1268        s_lshl_b32 sa[6], sa[6], 3
1269        s_endpgm
1270       
1271routine:
1272        s_xor_b32 sa[2], sa[2], sa[0]
1273        s_xor_b32 sa[3], sa[3], sa[0]
1274        .cf_cjump bb1, bb2
1275        s_setpc_b64 s[0:1]
1276       
1277bb0:    s_min_u32 sa[2], sa[2], sa[0]
1278        s_min_u32 sa[3], sa[3], sa[0]
1279        s_max_u32 sa[4], sa[4], sa[0]
1280        s_xor_b32 sa[5], sa[5], sa[0]
1281        s_xor_b32 sa[6], sa[6], sa[0]
1282        .cf_ret
1283        s_setpc_b64 s[0:1]
1284       
1285bb1:    s_and_b32 sa[2], sa[2], sa[0]
1286        s_and_b32 sa[3], sa[3], sa[0]
1287        s_max_u32 sa[4], sa[4], sa[0]
1288        s_xor_b32 sa[5], sa[5], sa[0]
1289        s_xor_b32 sa[6], sa[6], sa[0]
1290        .cf_ret
1291        s_setpc_b64 s[0:1]
1292
1293bb2:    s_and_b32 sa[2], sa[2], sa[0]
1294        s_and_b32 sa[3], sa[3], sa[0]
1295        s_max_u32 sa[4], sa[4], sa[0]
1296        s_xor_b32 sa[5], sa[5], sa[0]
1297        s_xor_b32 sa[6], sa[6], sa[0]
1298        .cf_ret
1299        s_setpc_b64 s[0:1]
1300)ffDXD",
1301        {
1302            {   // block 0 - start
1303                0, 24,
1304                { { 4, true } },
1305                {
1306                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1307                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1308                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1309                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1310                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1311                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1312                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1313                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1314                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1315                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1316                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1317                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1318                }, true, false, false },
1319            {   // block 1 - after call
1320                24, 36,
1321                { { 2, false }, { 3, false } },
1322                {
1323                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1324                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1325                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1326                }, false, false, false },
1327            {   // block 2 - aa0
1328                36, 52,
1329                { },
1330                {
1331                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
1332                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1333                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1334                    { { "sa", 5 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) },
1335                    { { "sa", 6 }, SSAInfo(1, 5, 5, 5, 1, false) }
1336                }, false, false, true },
1337            {   // block 3 - aa1
1338                52, 72,
1339                { },
1340                {
1341                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1342                    { { "sa", 2 }, SSAInfo(6, 8, 8, 9, 2, false) },
1343                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1344                    { { "sa", 4 }, SSAInfo(2, 6, 6, 6, 1, true) },
1345                    { { "sa", 6 }, SSAInfo(2, 6, 6, 6, 1, true) }
1346                }, false, false, true },
1347            {   // block 4 - routine
1348                72, 84,
1349                { { 5, false }, { 6, false }, { 7, false } },
1350                {
1351                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1352                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1353                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1354                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1355                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1356                }, false, false, false },
1357            {   // block 5 - bb0
1358                84, 108,
1359                { },
1360                {
1361                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1362                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1363                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1364                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1365                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1366                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1367                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1368                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1369                }, false, true, true },
1370            {   // block 6 - bb1
1371                108, 132,
1372                { },
1373                {
1374                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1375                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1376                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1377                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1378                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1379                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1380                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1381                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1382                }, false, true, true },
1383            {   // block 7 - bb2
1384                132, 156,
1385                { },
1386                {
1387                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1388                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1389                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1390                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1391                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1392                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1393                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1394                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
1395                }, false, true, true }
1396        },
1397        {   // SSA replaces
1398            { { "sa", 2 }, { { 4, 3 }, { 5, 3 } } },
1399            { { "sa", 4 }, { { 3, 2 }, { 4, 2 } } },
1400            { { "sa", 5 }, { { 3, 2 }, { 4, 2 } } },
1401            { { "sa", 6 }, { { 3, 2 }, { 4, 2 } } }
1402        },
1403        true, ""
1404    },
1405    {   // 9 - retssa tests
1406        R"ffDXD(.regvar sa:s:10, va:v:8
1407        s_mov_b32 sa[2], s4
1408        s_mov_b32 sa[3], s5
1409        s_mov_b32 sa[4], s6
1410        s_mov_b32 sa[5], s5
1411        v_mov_b32 va[1], v0
1412        v_mov_b32 va[2], v1
1413       
1414        .cf_call routine
1415        s_swappc_b64 s[0:1], s[2:3]
1416        s_cbranch_vccnz aa1
1417aa0:    s_xor_b32 sa[2], sa[1], sa[0]
1418        s_xor_b32 sa[3], sa[3], sa[0]
1419       
1420        .cf_call routine2
1421        s_swappc_b64 s[0:1], s[2:3]
1422       
1423        s_cbranch_vccnz aa3
1424aa2:    s_xor_b32 sa[6], sa[1], sa[0]
1425        s_xor_b32 sa[7], sa[7], sa[0]
1426        v_xor_b32 va[1], va[0], va[0]
1427        v_xor_b32 va[2], va[0], va[0]
1428        s_endpgm
1429       
1430aa3:    s_xor_b32 sa[6], sa[6], sa[0]
1431        s_xor_b32 sa[7], sa[7], sa[0]
1432        s_xor_b32 sa[8], sa[8], sa[0]
1433        s_xor_b32 sa[5], sa[5], sa[0]
1434        v_xor_b32 va[1], va[1], va[0]
1435        v_xor_b32 va[0], va[2], va[0]
1436        s_endpgm
1437       
1438aa1:    s_xor_b32 sa[2], sa[2], sa[0]
1439        s_xor_b32 sa[3], sa[3], sa[0]
1440        s_xor_b32 sa[2], sa[4], sa[0]
1441        s_xor_b32 sa[5], sa[5], sa[0]
1442        s_cbranch_execz aa5
1443       
1444aa4:    s_xor_b32 sa[4], sa[4], sa[0]
1445        v_xor_b32 va[1], va[1], va[0]
1446        s_endpgm
1447       
1448aa5:    s_xor_b32 sa[4], sa[4], sa[0]
1449        s_endpgm
1450       
1451routine:
1452        s_xor_b32 sa[2], sa[2], sa[0]
1453        s_xor_b32 sa[3], sa[3], sa[0]
1454        s_cbranch_vccz bb1
1455       
1456bb0:    s_min_u32 sa[2], sa[2], sa[0]
1457        s_min_u32 sa[3], sa[3], sa[0]
1458        s_max_u32 sa[4], sa[4], sa[0]
1459        s_xor_b32 sa[5], sa[5], sa[0]
1460        v_xor_b32 va[1], va[1], va[0]
1461        v_xor_b32 va[2], va[2], va[0]
1462        .cf_ret
1463        s_setpc_b64 s[0:1]
1464       
1465bb1:    s_and_b32 sa[2], sa[2], sa[0]
1466        s_and_b32 sa[3], sa[3], sa[0]
1467        s_max_u32 sa[4], sa[4], sa[0]
1468        s_xor_b32 sa[5], sa[5], sa[0]
1469        v_xor_b32 va[1], va[1], va[0]
1470        v_xor_b32 va[2], va[2], va[0]
1471        .cf_ret
1472        s_setpc_b64 s[0:1]
1473
1474routine2:
1475        s_xor_b32 sa[6], sa[6], sa[1]
1476        s_xor_b32 sa[7], sa[7], sa[1]
1477        s_cbranch_vccz bb3
1478       
1479bb2:    s_min_u32 sa[6], sa[6], sa[1]
1480        s_min_u32 sa[7], sa[7], sa[1]
1481        s_max_u32 sa[8], sa[8], sa[1]
1482        s_xor_b32 sa[5], sa[5], sa[1]
1483        .cf_ret
1484        s_setpc_b64 s[0:1]
1485       
1486bb3:    s_and_b32 sa[6], sa[6], sa[1]
1487        s_and_b32 sa[7], sa[7], sa[1]
1488        s_max_u32 sa[8], sa[8], sa[1]
1489        s_xor_b32 sa[5], sa[5], sa[1]
1490        .cf_ret
1491        s_setpc_b64 s[0:1]
1492)ffDXD",
1493        {
1494            {   // block 0 - start
1495                0, 28,
1496                { { 9, true } },
1497                {
1498                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1499                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1500                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1501                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1502                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1503                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1504                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1505                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1506                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1507                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1508                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1509                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1510                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1511                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1512                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
1513                }, true, false, false },
1514            {   // block 1 - branch aa0-aa1
1515                28, 32,
1516                { { 2, false }, { 6, false } },
1517                {
1518                }, false, false, false },
1519            {   // block 2 - aa0
1520                32, 44,
1521                { { 12, true } },
1522                {
1523                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1524                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1525                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1526                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1527                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1528                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1529                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1530                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1531                }, true, false, false },
1532            {   // block 3 - branch aa2-aa3
1533                44, 48,
1534                { { 4, false }, { 5, false } },
1535                {
1536                }, false, false, false },
1537            {   // block 4 - aa2
1538                48, 68,
1539                { },
1540                {
1541                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1542                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1543                    { { "sa", 6 }, SSAInfo(0, 4, 4, 4, 1, false) },
1544                    { { "sa", 7 }, SSAInfo(2, 4, 4, 4, 1, true) },
1545                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1546                    { { "va", 1 }, SSAInfo(1, 4, 4, 4, 1, false) },
1547                    { { "va", 2 }, SSAInfo(1, 4, 4, 4, 1, false) }
1548                }, false, false, true },
1549            {   // block 5 - aa3
1550                68, 96,
1551                { },
1552                {
1553                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1554                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) },
1555                    { { "sa", 6 }, SSAInfo(2, 5, 5, 5, 1, true) },
1556                    { { "sa", 7 }, SSAInfo(2, 5, 5, 5, 1, true) },
1557                    { { "sa", 8 }, SSAInfo(1, 3, 3, 3, 1, true) },
1558                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
1559                    { { "va", 1 }, SSAInfo(2, 5, 5, 5, 1, true) },
1560                    { { "va", 2 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1561                }, false, false, true },
1562            {   // block 6 - aa1
1563                96, 116,
1564                { { 7, false }, { 8, false } },
1565                {
1566                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1567                    { { "sa", 2 }, SSAInfo(3, 6, 6, 7, 2, true) },
1568                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) },
1569                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
1570                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) }
1571                }, false, false, false },
1572            {   // block 7 - aa4
1573                116, 128,
1574                { },
1575                {
1576                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1577                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
1578                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1579                    { { "va", 1 }, SSAInfo(2, 6, 6, 6, 1, true) }
1580                }, false, false, true },
1581            {   // block 8 - aa5
1582                128, 136,
1583                { },
1584                {
1585                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1586                    { { "sa", 4 }, SSAInfo(2, 5, 5, 5, 1, true) }
1587                }, false, false, true },
1588            {   // block 9 - routine
1589                136, 148,
1590                { { 10, false }, { 11, false } },
1591                {
1592                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1593                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1594                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1595                }, false, false, false },
1596            {   // block 10 - bb0
1597                148, 176,
1598                { },
1599                {
1600                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1601                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1602                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1603                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1604                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1605                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1606                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1607                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1608                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1609                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1610                }, false, true, true },
1611            {   // block 11 - bb1
1612                176, 204,
1613                { },
1614                {
1615                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1616                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1617                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1618                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1619                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1620                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1621                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1622                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1623                    { { "va", 1 }, SSAInfo(1, 3, 3, 3, 1, true) },
1624                    { { "va", 2 }, SSAInfo(1, 3, 3, 3, 1, true) }
1625                }, false, true, true },
1626            {   // block 12 - routine2
1627                204, 216,
1628                { { 13, false }, { 14, false } },
1629                {
1630                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1631                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, true) },
1632                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, true) }
1633                }, false, false, false },
1634            {   // block 13 - bb2
1635                216, 236,
1636                { },
1637                {
1638                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1639                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1640                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1641                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
1642                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1643                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) },
1644                    { { "sa", 8 }, SSAInfo(0, 1, 1, 1, 1, true) }
1645                }, false, true, true },
1646            {   // block 14 - bb3
1647                236, 256,
1648                { },
1649                {
1650                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1651                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1652                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1653                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, true) },
1654                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1655                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) },
1656                    { { "sa", 8 }, SSAInfo(0, 2, 2, 2, 1, true) }
1657                }, false, true, true }
1658        },
1659        {   // SSA replaces
1660            { { "sa", 2 }, { { 4, 3 } } },
1661            { { "sa", 3 }, { { 4, 3 } } },
1662            { { "sa", 4 }, { { 3, 2 } } },
1663            { { "sa", 5 }, { { 3, 2 }, { 5, 4 } } },
1664            { { "sa", 6 }, { { 3, 2 } } },
1665            { { "sa", 7 }, { { 3, 2 } } },
1666            { { "sa", 8 }, { { 2, 1 } } },
1667            { { "va", 1 }, { { 3, 2 } } },
1668            { { "va", 2 }, { { 3, 2 } } }
1669        },
1670        true, ""
1671    },
1672    {   // 10 - retssa tests 2
1673        R"ffDXD(.regvar sa:s:10, va:v:8
1674        s_mov_b32 sa[2], s4
1675        s_mov_b32 sa[3], s5
1676        .cf_call routine
1677        s_swappc_b64 s[0:1], s[2:3]
1678       
1679        s_xor_b32 sa[4], sa[4], sa[1]
1680        s_cbranch_execz aa1
1681       
1682aa0:    .cf_call routine2
1683        s_swappc_b64 s[0:1], s[2:3]
1684       
1685        s_and_b32 sa[3], sa[3], sa[0]
1686        s_endpgm
1687       
1688aa1:    s_xor_b32 sa[4], sa[4], sa[1]
1689        s_and_b32 sa[2], sa[2], sa[0]
1690        s_endpgm
1691       
1692routine:
1693        s_xor_b32 sa[2], sa[2], sa[0]
1694        s_cbranch_vccz bb1
1695       
1696bb0:    s_min_u32 sa[2], sa[2], sa[0]
1697        .cf_ret
1698        s_setpc_b64 s[0:1]
1699       
1700bb1:    s_and_b32 sa[2], sa[2], sa[0]
1701        .cf_ret
1702        s_setpc_b64 s[0:1]
1703       
1704routine2:
1705        s_xor_b32 sa[2], sa[1], sa[0]
1706        s_xor_b32 sa[3], sa[3], sa[0]
1707        s_cbranch_vccz cc1
1708       
1709cc0:    s_min_u32 sa[3], sa[3], sa[0]
1710        s_xor_b32 sa[2], sa[1], sa[0]
1711        .cf_ret
1712        s_setpc_b64 s[0:1]
1713       
1714cc1:    s_and_b32 sa[3], sa[3], sa[0]
1715        s_xor_b32 sa[2], sa[1], sa[0]
1716        .cf_ret
1717        s_setpc_b64 s[0:1]
1718)ffDXD",
1719        {
1720            {   // block 0 - start
1721                0, 12,
1722                { { 5, true } },
1723                {
1724                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1725                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1726                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1727                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1728                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1729                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1730                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1731                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1732                }, true, false, false },
1733            {   // block 1 - after routine call
1734                12, 20,
1735                { { 2, false }, { 4, false } },
1736                {
1737                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1738                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
1739                }, false, false, false },
1740            {   // block 2 - aa0
1741                20, 24,
1742                { { 8, true } },
1743                {
1744                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1745                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1746                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1747                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1748                }, true, false, false },
1749            {   // block 3 - after routine2 call
1750                24, 32,
1751                { },
1752                {
1753                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1754                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1755                }, false, false, true },
1756            {   // block 4 - aa1
1757                32, 44,
1758                { },
1759                {
1760                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1761                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1762                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
1763                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1764                }, false, false, true },
1765            {   // block 5 - routine
1766                44, 52,
1767                { { 6, false }, { 7, false } },
1768                {
1769                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1770                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1771                }, false, false, false },
1772            {   // block 6 - bb0
1773                52, 60,
1774                { },
1775                {
1776                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1777                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1778                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1779                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
1780                }, false, true, true },
1781            {   // block 7 - bb1
1782                60, 68,
1783                { },
1784                {
1785                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1786                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1787                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1788                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) }
1789                }, false, true, true },
1790            {   // block 8 - routine2
1791                68, 80,
1792                { { 9, false }, { 10, false } },
1793                {
1794                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1795                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1796                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1797                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1798                }, false, false, false },
1799            {   // block 9 - cc0
1800                80, 92,
1801                { },
1802                {
1803                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1804                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1805                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1806                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1807                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, false) },
1808                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
1809                }, false, true, true },
1810            {   // block 10 - cc1
1811                92, 104,
1812                { },
1813                {
1814                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1815                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1816                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1817                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1818                    { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, false) },
1819                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
1820                }, false, true, true }
1821        },
1822        {   // SSA replaces
1823            { { "sa", 2 }, { { 4, 3 } } },
1824            { { "sa", 3 }, { { 4, 3 } } }
1825        },
1826        true, ""
1827    },
1828    {   // 11 - simple routine with loop
1829        R"ffDXD(.regvar sa:s:10, va:v:8
1830        s_mov_b32 sa[2], s4
1831        s_mov_b32 sa[3], s5
1832        s_mov_b32 sa[4], s6
1833        .cf_call routine
1834        s_swappc_b64 s[0:1], s[2:3]
1835       
1836        s_xor_b32 sa[2], sa[2], sa[0]
1837        s_xor_b32 sa[3], sa[3], sa[0]
1838        s_xor_b32 sa[4], sa[4], sa[1]
1839       
1840        .cf_call routine
1841        s_swappc_b64 s[0:1], s[2:3]
1842       
1843        s_xor_b32 sa[2], sa[2], sa[0]
1844        s_xor_b32 sa[3], sa[3], sa[0]
1845        s_xor_b32 sa[4], sa[4], sa[1]
1846        s_endpgm
1847       
1848routine:
1849        s_xor_b32 sa[2], sa[2], sa[0]
1850        s_xor_b32 sa[3], sa[3], sa[0]
1851       
1852loop0:  s_xor_b32 sa[2], sa[2], sa[0]
1853        s_xor_b32 sa[3], sa[3], sa[0]
1854        s_xor_b32 sa[4], sa[4], sa[1]
1855        s_cbranch_scc0 loop0
1856       
1857        s_xor_b32 sa[4], sa[4], sa[1]
1858        s_xor_b32 sa[2], sa[2], sa[0]
1859        .cf_ret
1860        s_setpc_b64 s[0:1]
1861)ffDXD",
1862        {
1863            {   // block 0 - start
1864                0, 16,
1865                { { 3, true } },
1866                {
1867                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1868                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1869                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1870                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1871                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1872                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1873                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1874                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1875                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1876                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
1877                }, true, false, false },
1878            {   // block 1 - after routine call
1879                16, 32,
1880                { { 3, true } },
1881                {
1882                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1883                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1884                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1885                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1886                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1887                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1888                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
1889                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
1890                    { { "sa", 4 }, SSAInfo(3, 4, 4, 4, 1, true) }
1891                }, true, false, false },
1892            {   // block 2 - end
1893                32, 48,
1894                { },
1895                {
1896                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1897                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1898                    { { "sa", 2 }, SSAInfo(4, 6, 6, 6, 1, true) },
1899                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
1900                    { { "sa", 4 }, SSAInfo(3, 5, 5, 5, 1, true) }
1901                }, false, false, true },
1902            {   // block 3 - routine
1903                48, 56,
1904                { },
1905                {
1906                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1907                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1908                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1909                }, false, false, false },
1910            {   // block 4 - loop0
1911                56, 72,
1912                { { 4, false }, { 5, false } },
1913                {
1914                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1915                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1916                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1917                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1918                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1919                }, false, false, false },
1920            {   // block 5 - routine end
1921                72, 84,
1922                { },
1923                {
1924                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1925                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1926                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1927                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1928                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
1929                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
1930                }, false, true, true }
1931        },
1932        {   // SSA replaces
1933            { { "sa", 2 }, { { 3, 2 }, { 5, 1 } } },
1934            { { "sa", 3 }, { { 3, 2 }, { 4, 1 } } },
1935            { { "sa", 4 }, { { 2, 1 }, { 4, 1 } } }
1936        },
1937        true, ""
1938    },
1939    {   // 12
1940        R"ffDXD(.regvar sa:s:10, va:v:8
1941        s_mov_b32 sa[2], s4
1942        s_mov_b32 sa[3], s5
1943        .cf_call routine
1944        s_swappc_b64 s[0:1], s[2:3]
1945       
1946        s_xor_b32 sa[2], sa[2], sa[0]
1947        s_xor_b32 sa[3], sa[3], sa[1]
1948        .cf_call routine2
1949        s_swappc_b64 s[0:1], s[2:3]
1950       
1951        .cf_call routine
1952        s_swappc_b64 s[0:1], s[2:3]
1953        s_endpgm
1954       
1955routine:
1956        s_xor_b32 sa[2], sa[2], sa[0]
1957        s_xor_b32 sa[3], sa[3], sa[1]
1958        s_cbranch_scc1 aa0
1959       
1960        s_xor_b32 sa[2], sa[2], sa[0]
1961        s_xor_b32 sa[3], sa[3], sa[1]
1962        .cf_ret
1963        s_setpc_b64 s[0:1]
1964       
1965aa0:    s_xor_b32 sa[2], sa[2], sa[0]
1966        s_xor_b32 sa[3], sa[3], sa[1]
1967        .cf_ret
1968        s_setpc_b64 s[0:1]
1969       
1970routine2:
1971        s_and_b32 sa[2], sa[2], sa[0]
1972        s_xor_b32 sa[3], sa[3], sa[1]
1973        s_cbranch_scc1 aa1
1974       
1975        s_xor_b32 sa[2], sa[2], sa[0]
1976        s_and_b32 sa[3], sa[3], sa[1]
1977        .cf_ret
1978        s_setpc_b64 s[0:1]
1979       
1980aa1:    s_and_b32 sa[2], sa[2], sa[0]
1981        s_xor_b32 sa[3], sa[3], sa[1]
1982        .cf_ret
1983        s_setpc_b64 s[0:1]
1984)ffDXD",
1985        {
1986            {   // block 0 - start
1987                0, 12,
1988                { { 4, true } },
1989                {
1990                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1991                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1992                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1993                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1994                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1995                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1996                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1997                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1998                }, true, false, false },
1999            {   // block 1 - after routine call
2000                12, 24,
2001                { { 7, true } },
2002                {
2003                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2004                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2005                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2006                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2007                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2008                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2009                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2010                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
2011                }, true, false, false },
2012            {   // block 2 - after routine2 call
2013                24, 28,
2014                { { 4, true } },
2015                {
2016                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2017                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2018                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2019                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
2020                }, true, false, false },
2021            {   // block 3 - end
2022                28, 32,
2023                { },
2024                { },
2025                false, false, true },
2026            {   // block 4 - routine
2027                32, 44,
2028                { { 5, false }, { 6, false } },
2029                {
2030                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2031                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2032                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2033                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
2034                }, false, false, false },
2035            {   // block 5 - first fork
2036                44, 56,
2037                { },
2038                {
2039                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2040                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2041                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2042                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2043                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2044                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2045                }, false, true, true },
2046            {   // block 6 - aa0 - second fork
2047                56, 68,
2048                { },
2049                {
2050                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2051                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2052                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2053                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2054                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2055                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
2056                }, false, true, true },
2057            {   // block 7 - routine2
2058                68, 80,
2059                { { 8, false }, { 9, false } },
2060                {
2061                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2062                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2063                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2064                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) }
2065                }, false, false, false },
2066            {   // block 8 - first fork
2067                80, 92,
2068                { },
2069                {
2070                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2071                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2072                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2073                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2074                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2075                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) }
2076                }, false, true, true },
2077            {   // block 9 - aa1 - second fork
2078                92, 104,
2079                { },
2080                {
2081                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2082                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2083                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2084                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2085                    { { "sa", 2 }, SSAInfo(6, 8, 8, 8, 1, true) },
2086                    { { "sa", 3 }, SSAInfo(6, 8, 8, 8, 1, true) }
2087                }, false, true, true }
2088        },
2089        {   // SSA replaces
2090            { { "sa", 2 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } },
2091            { { "sa", 3 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } }
2092        },
2093        true, ""
2094    },
2095    {   // 13 - routine with complex loop used twice
2096        R"ffDXD(.regvar sa:s:10, va:v:8
2097        s_mov_b32 sa[2], s4
2098        s_mov_b32 sa[3], s5
2099        s_mov_b32 sa[4], s6
2100        s_mov_b32 sa[5], s7
2101        s_mov_b32 sa[6], s8
2102        .cf_call routine
2103        s_swappc_b64 s[0:1], s[2:3]
2104       
2105        s_xor_b32 sa[2], sa[2], sa[0]
2106        s_xor_b32 sa[3], sa[3], sa[0]
2107        s_xor_b32 sa[4], sa[4], sa[1]
2108        s_xor_b32 sa[5], sa[5], sa[1]
2109        s_xor_b32 sa[6], sa[6], sa[0]
2110        s_endpgm
2111       
2112routine:
2113        s_xor_b32 sa[2], sa[2], sa[0]
2114        s_xor_b32 sa[3], sa[3], sa[0]
2115        s_xor_b32 sa[5], sa[5], sa[0]
2116        s_cbranch_vccz  subr1
2117       
2118loop0:  s_xor_b32 sa[2], sa[2], sa[0]
2119        s_cbranch_scc0 end1
2120       
2121        s_xor_b32 sa[3], sa[3], sa[0]
2122        s_cbranch_scc0 end2
2123       
2124        s_xor_b32 sa[4], sa[4], sa[1]
2125        s_cbranch_scc0 end3
2126       
2127        s_xor_b32 sa[5], sa[5], sa[1]
2128        s_branch loop0
2129       
2130end1:   s_xor_b32 sa[2], sa[2], sa[0]
2131        .cf_ret
2132        s_setpc_b64 s[0:1]
2133
2134end2:   s_xor_b32 sa[3], sa[3], sa[0]
2135        .cf_ret
2136        s_setpc_b64 s[0:1]
2137
2138end3:   s_xor_b32 sa[4], sa[4], sa[0]
2139        .cf_ret
2140        s_setpc_b64 s[0:1]
2141
2142subr1:
2143        s_xor_b32 sa[2], sa[2], sa[0]
2144        s_xor_b32 sa[3], sa[3], sa[0]
2145        s_xor_b32 sa[4], sa[4], sa[0]
2146        s_xor_b32 sa[5], sa[5], sa[1]
2147        s_xor_b32 sa[6], sa[6], sa[0]
2148        s_cbranch_execnz loop0
2149
2150subr2:
2151        s_xor_b32 sa[2], sa[2], sa[0]
2152        s_xor_b32 sa[3], sa[3], sa[0]
2153        s_xor_b32 sa[4], sa[4], sa[1]
2154        s_xor_b32 sa[5], sa[5], sa[1]
2155        s_xor_b32 sa[6], sa[6], sa[0]
2156        .cf_ret
2157        s_setpc_b64 s[0:1]
2158)ffDXD",
2159        {
2160            {   // block 0 - start
2161                0, 24,
2162                { { 2, true } },
2163                {
2164                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2165                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2166                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2167                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2168                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2169                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2170                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2171                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2172                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2173                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2174                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2175                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2176                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2177                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
2178                }, true, false, false },
2179            {   // block 1 - end
2180                24, 48,
2181                { },
2182                {
2183                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2184                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2185                    { { "sa", 2 }, SSAInfo(3, 7, 7, 7, 1, true) },
2186                    { { "sa", 3 }, SSAInfo(2, 7, 7, 7, 1, true) },
2187                    { { "sa", 4 }, SSAInfo(1, 6, 6, 6, 1, true) },
2188                    { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) },
2189                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
2190                }, false, false, true },
2191            {   // block 2 - routine
2192                48, 64,
2193                { { 3, false }, { 10, false } },
2194                {
2195                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2196                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2197                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2198                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2199                }, false, false, false },
2200            {   // block 3 - loop0
2201                64, 72,
2202                { { 4, false }, { 7, false } },
2203                {
2204                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2205                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2206                }, false, false, false },
2207            {   // block 4 - to end2
2208                72, 80,
2209                { { 5, false }, { 8, false } },
2210                {
2211                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2212                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2213                }, false, false, false },
2214            {   // block 5 - to end3
2215                80, 88,
2216                { { 6, false }, { 9, false } },
2217                {
2218                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2219                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2220                }, false, false, false },
2221            {   // block 6 - loop end
2222                88, 96,
2223                { { 3, false } },
2224                {
2225                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2226                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
2227                }, false, false, true },
2228            {   // block 7 - end1
2229                96, 104,
2230                { },
2231                {
2232                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2233                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2234                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2235                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2236                }, false, true, true },
2237            {   // block 8 - end2
2238                104, 112,
2239                { },
2240                {
2241                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2242                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2243                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2244                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2245                }, false, true, true },
2246            {   // block 9 - end3
2247                112, 120,
2248                { },
2249                {
2250                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2251                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2252                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2253                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2254                }, false, true, true },
2255            {   // block 10 - subr1
2256                120, 144,
2257                { { 3, false }, { 11, false } },
2258                {
2259                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2260                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2261                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
2262                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
2263                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2264                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
2265                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2266                }, false, false, false },
2267            {   // block 11 - subr2
2268                144, 168,
2269                { },
2270                {
2271                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2272                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2273                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2274                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2275                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2276                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
2277                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
2278                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
2279                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) }
2280                }, false, true, true }
2281        },
2282        {   // SSA replaces
2283            { { "sa", 2 }, { { 4, 3 }, { 6, 3 }, { 3, 2 }, { 5, 2 } } },
2284            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 } } },
2285            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
2286            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 } } },
2287            { { "sa", 6 }, { { 2, 1 }, { 3, 1 } } }
2288        },
2289        true, ""
2290    },
2291    {   // 14 - routine with double complex loop used four times
2292        R"ffDXD(.regvar sa:s:10, va:v:8
2293        s_mov_b32 sa[2], s4
2294        s_mov_b32 sa[3], s5
2295        s_mov_b32 sa[4], s6
2296        s_mov_b32 sa[5], s7
2297        s_mov_b32 sa[6], s8
2298        s_mov_b32 sa[7], s8
2299        .cf_call routine
2300        s_swappc_b64 s[0:1], s[2:3]
2301       
2302        s_xor_b32 sa[2], sa[2], sa[0]
2303        s_xor_b32 sa[3], sa[3], sa[0]
2304        s_xor_b32 sa[4], sa[4], sa[1]
2305        s_xor_b32 sa[5], sa[5], sa[1]
2306        s_xor_b32 sa[6], sa[6], sa[0]
2307        s_xor_b32 sa[7], sa[7], sa[0]
2308        s_endpgm
2309       
2310routine:
2311loop0:
2312        s_xor_b32 sa[2], sa[2], sa[0]
2313        s_xor_b32 sa[3], sa[3], sa[0]
2314        s_xor_b32 sa[5], sa[5], sa[0]
2315        s_cbranch_vccz  subr1
2316       
2317loop1:  s_xor_b32 sa[2], sa[2], sa[0]
2318        s_cbranch_scc0 end1
2319       
2320        s_xor_b32 sa[3], sa[3], sa[0]
2321        s_cbranch_scc0 end2
2322       
2323        s_xor_b32 sa[4], sa[4], sa[1]
2324        s_cbranch_scc0 end3
2325       
2326        s_xor_b32 sa[5], sa[5], sa[1]
2327        s_cbranch_vccnz loop1
2328       
2329        s_xor_b32 sa[6], sa[6], sa[1]
2330        s_branch loop0
2331       
2332end1:   s_xor_b32 sa[2], sa[2], sa[0]
2333        .cf_ret
2334        s_setpc_b64 s[0:1]
2335       
2336end2:   s_xor_b32 sa[3], sa[3], sa[0]
2337        .cf_ret
2338        s_setpc_b64 s[0:1]
2339       
2340end3:   s_xor_b32 sa[4], sa[4], sa[0]
2341        .cf_ret
2342        s_setpc_b64 s[0:1]
2343       
2344subr1:
2345        s_xor_b32 sa[2], sa[2], sa[0]
2346        s_xor_b32 sa[3], sa[3], sa[0]
2347        s_xor_b32 sa[4], sa[4], sa[0]
2348        s_xor_b32 sa[5], sa[5], sa[1]
2349        s_xor_b32 sa[6], sa[6], sa[0]
2350        s_xor_b32 sa[7], sa[7], sa[0]
2351        s_cbranch_execnz loop0
2352       
2353subr2:
2354        s_xor_b32 sa[2], sa[2], sa[0]
2355        s_xor_b32 sa[3], sa[3], sa[0]
2356        s_xor_b32 sa[4], sa[4], sa[1]
2357        s_xor_b32 sa[5], sa[5], sa[1]
2358        s_xor_b32 sa[6], sa[6], sa[0]
2359        s_xor_b32 sa[7], sa[7], sa[0]
2360        s_cbranch_execnz loop1
2361       
2362subr3:
2363        s_xor_b32 sa[2], sa[2], sa[0]
2364        s_xor_b32 sa[3], sa[3], sa[0]
2365        s_xor_b32 sa[4], sa[4], sa[1]
2366        s_xor_b32 sa[5], sa[5], sa[1]
2367        s_xor_b32 sa[6], sa[6], sa[0]
2368        s_xor_b32 sa[7], sa[7], sa[0]
2369        .cf_ret
2370        s_setpc_b64 s[0:1]
2371)ffDXD",
2372        {
2373            {   // block 0 - start
2374                0, 28,
2375                { { 2, true } },
2376                {
2377                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2378                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2379                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2380                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2381                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2382                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2383                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2384                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2385                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2386                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2387                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2388                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2389                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2390                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
2391                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
2392                }, true, false, false },
2393            {   // block 1 - end
2394                28, 56,
2395                { },
2396                {
2397                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2398                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2399                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
2400                    { { "sa", 3 }, SSAInfo(2, 8, 8, 8, 1, true) },
2401                    { { "sa", 4 }, SSAInfo(1, 7, 7, 7, 1, true) },
2402                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) },
2403                    { { "sa", 6 }, SSAInfo(1, 6, 6, 6, 1, true) },
2404                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, true) }
2405                }, false, false, true },
2406            {   // block 2 - routine/loop0
2407                56, 72,
2408                { { 3, false }, { 11, false } },
2409                {
2410                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2411                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2412                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2413                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2414                }, false, false, false },
2415            {   // block 3 - routine loop1
2416                72, 80,
2417                { { 4, false }, { 8, false } },
2418                {
2419                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2420                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2421                }, false, false, false },
2422            {   // block 4 - to end2
2423                80, 88,
2424                { { 5, false }, { 9, false } },
2425                {
2426                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2427                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2428                }, false, false, false },
2429            {   // block 5 - to end3
2430                88, 96,
2431                { { 6, false }, { 10, false } },
2432                {
2433                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2434                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2435                }, false, false, false },
2436            {   // block 6 - loop1 end
2437                96, 104,
2438                { { 3, false }, { 7, false } },
2439                {
2440                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2441                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
2442                }, false, false, false },
2443            {   // block 7 - loop0 end
2444                104, 112,
2445                { { 2, false } },
2446                {
2447                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2448                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2449                }, false, false, true },
2450            {   // block 8 - end1
2451                112, 120,
2452                { },
2453                {
2454                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2455                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2456                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2457                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2458                }, false, true, true },
2459            {   // block 9 - end2
2460                120, 128,
2461                { },
2462                {
2463                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2464                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2465                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2466                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2467                }, false, true, true },
2468            {   // block 10 - end3
2469                128, 136,
2470                { },
2471                {
2472                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2473                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2474                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2475                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2476                }, false, true, true },
2477            {   // block 11 - subr1
2478                136, 164,
2479                { { 2, false }, { 12, false } },
2480                {
2481                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2482                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2483                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
2484                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
2485                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2486                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
2487                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
2488                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
2489                }, false, false, false },
2490            {   // block 12 - subr2
2491                164, 192,
2492                { { 3, false }, { 13, false } },
2493                {
2494                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2495                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2496                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2497                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
2498                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
2499                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
2500                    { { "sa", 6 }, SSAInfo(3, 4, 4, 4, 1, true) },
2501                    { { "sa", 7 }, SSAInfo(2, 3, 3, 3, 1, true) }
2502                }, false, false, false },
2503            {   // block 13 - subr3
2504                192, 220,
2505                { },
2506                {
2507                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2508                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2509                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2510                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2511                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2512                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
2513                    { { "sa", 4 }, SSAInfo(5, 6, 6, 6, 1, true) },
2514                    { { "sa", 5 }, SSAInfo(5, 6, 6, 6, 1, true) },
2515                    { { "sa", 6 }, SSAInfo(4, 5, 5, 5, 1, true) },
2516                    { { "sa", 7 }, SSAInfo(3, 4, 4, 4, 1, true) }
2517                }, false, true, true }
2518        },
2519        {   // SSA replaces
2520            { { "sa", 2 }, { { 4, 3 }, { 7, 3 }, { 3, 2 }, { 3, 1 }, { 5, 1 }, { 6, 2 } } },
2521            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 6, 2 }, { 7, 2 }, { 3, 1 }, { 5, 1 } } },
2522            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 } } },
2523            { { "sa", 5 }, { { 3, 2 }, { 5, 2 }, { 6, 2 }, { 3, 1 }, { 4, 1 } } },
2524            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
2525            { { "sa", 7 }, { { 3, 1 }, { 4, 1 }, { 2, 1 } } }
2526        },
2527        true, ""
2528    },
2529    {   // 15 - routine with double complex loop used four times
2530        R"ffDXD(.regvar sa:s:10, va:v:8
2531        s_mov_b32 sa[2], s4
2532        s_mov_b32 sa[3], s5
2533        s_mov_b32 sa[4], s6
2534        s_mov_b32 sa[5], s7
2535        s_mov_b32 sa[6], s8
2536        s_mov_b32 sa[7], s8
2537        .cf_call routine
2538        s_swappc_b64 s[0:1], s[2:3]
2539       
2540        s_xor_b32 sa[2], sa[2], sa[0]
2541        s_xor_b32 sa[3], sa[3], sa[0]
2542        s_xor_b32 sa[4], sa[4], sa[1]
2543        s_xor_b32 sa[5], sa[5], sa[1]
2544        s_xor_b32 sa[6], sa[6], sa[0]
2545        s_xor_b32 sa[7], sa[7], sa[0]
2546        s_endpgm
2547       
2548routine:
2549        s_nop 7
2550loop0:
2551        s_xor_b32 sa[2], sa[2], sa[0]
2552        s_xor_b32 sa[3], sa[3], sa[0]
2553        s_xor_b32 sa[5], sa[5], sa[0]
2554        s_cbranch_vccz  subr1
2555       
2556loop1:  s_xor_b32 sa[2], sa[2], sa[0]
2557        s_cbranch_scc0 end1
2558       
2559        s_xor_b32 sa[3], sa[3], sa[0]
2560        s_cbranch_scc0 end2
2561       
2562        s_xor_b32 sa[4], sa[4], sa[1]
2563        s_cbranch_scc0 end3
2564       
2565        s_xor_b32 sa[5], sa[5], sa[1]
2566        s_cbranch_vccnz loop1
2567       
2568        s_xor_b32 sa[6], sa[6], sa[1]
2569        s_branch loop0
2570       
2571end1:   s_xor_b32 sa[2], sa[2], sa[0]
2572        .cf_ret
2573        s_setpc_b64 s[0:1]
2574       
2575end2:   s_xor_b32 sa[3], sa[3], sa[0]
2576        .cf_ret
2577        s_setpc_b64 s[0:1]
2578       
2579end3:   s_xor_b32 sa[4], sa[4], sa[0]
2580        .cf_ret
2581        s_setpc_b64 s[0:1]
2582       
2583subr1:
2584        s_xor_b32 sa[2], sa[2], sa[0]
2585        s_xor_b32 sa[3], sa[3], sa[0]
2586        s_xor_b32 sa[4], sa[4], sa[0]
2587        s_xor_b32 sa[5], sa[5], sa[1]
2588        s_xor_b32 sa[6], sa[6], sa[0]
2589        s_xor_b32 sa[7], sa[7], sa[0]
2590        s_cbranch_execnz loop0
2591       
2592subr2:
2593        s_xor_b32 sa[2], sa[2], sa[0]
2594        s_xor_b32 sa[3], sa[3], sa[0]
2595        s_xor_b32 sa[4], sa[4], sa[1]
2596        s_xor_b32 sa[5], sa[5], sa[1]
2597        s_xor_b32 sa[6], sa[6], sa[0]
2598        s_xor_b32 sa[7], sa[7], sa[0]
2599        s_cbranch_execnz loop1
2600       
2601subr3:
2602        s_xor_b32 sa[2], sa[2], sa[0]
2603        s_xor_b32 sa[3], sa[3], sa[0]
2604        s_xor_b32 sa[4], sa[4], sa[1]
2605        s_xor_b32 sa[5], sa[5], sa[1]
2606        s_xor_b32 sa[6], sa[6], sa[0]
2607        s_xor_b32 sa[7], sa[7], sa[0]
2608        .cf_ret
2609        s_setpc_b64 s[0:1]
2610)ffDXD",
2611        {
2612            {   // block 0 - start
2613                0, 28,
2614                { { 2, true } },
2615                {
2616                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2617                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2618                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2619                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2620                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2621                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2622                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2623                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2624                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2625                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2626                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2627                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2628                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2629                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
2630                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
2631                }, true, false, false },
2632            {   // block 1 - end
2633                28, 56,
2634                { },
2635                {
2636                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2637                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2638                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
2639                    { { "sa", 3 }, SSAInfo(2, 8, 8, 8, 1, true) },
2640                    { { "sa", 4 }, SSAInfo(1, 7, 7, 7, 1, true) },
2641                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) },
2642                    { { "sa", 6 }, SSAInfo(1, 6, 6, 6, 1, true) },
2643                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, true) }
2644                }, false, false, true },
2645            {   // block 2 - s_nop
2646                56, 60,
2647                { },
2648                { }, false, false, false },
2649            {   // block 3 - routine/loop0
2650                60, 76,
2651                { { 4, false }, { 12, false } },
2652                {
2653                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2654                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2655                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2656                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2657                }, false, false, false },
2658            {   // block 4 - routine loop1
2659                76, 84,
2660                { { 5, false }, { 9, false } },
2661                {
2662                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2663                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2664                }, false, false, false },
2665            {   // block 5 - to end2
2666                84, 92,
2667                { { 6, false }, { 10, false } },
2668                {
2669                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2670                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2671                }, false, false, false },
2672            {   // block 6 - to end3
2673                92, 100,
2674                { { 7, false }, { 11, false } },
2675                {
2676                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2677                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2678                }, false, false, false },
2679            {   // block 7 - loop1 end
2680                100, 108,
2681                { { 4, false }, { 8, false } },
2682                {
2683                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2684                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
2685                }, false, false, false },
2686            {   // block 8 - loop0 end
2687                108, 116,
2688                { { 3, false } },
2689                {
2690                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2691                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2692                }, false, false, true },
2693            {   // block 9 - end1
2694                116, 124,
2695                { },
2696                {
2697                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2698                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2699                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2700                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2701                }, false, true, true },
2702            {   // block 10 - end2
2703                124, 132,
2704                { },
2705                {
2706                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2707                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2708                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2709                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2710                }, false, true, true },
2711            {   // block 11 - end3
2712                132, 140,
2713                { },
2714                {
2715                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2716                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2717                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2718                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2719                }, false, true, true },
2720            {   // block 12 - subr1
2721                140, 168,
2722                { { 3, false }, { 13, false } },
2723                {
2724                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2725                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2726                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
2727                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
2728                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2729                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
2730                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
2731                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
2732                }, false, false, false },
2733            {   // block 13 - subr2
2734                168, 196,
2735                { { 4, false }, { 14, false } },
2736                {
2737                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2738                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2739                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2740                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
2741                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
2742                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
2743                    { { "sa", 6 }, SSAInfo(3, 4, 4, 4, 1, true) },
2744                    { { "sa", 7 }, SSAInfo(2, 3, 3, 3, 1, true) }
2745                }, false, false, false },
2746            {   // block 13 - subr3
2747                196, 224,
2748                { },
2749                {
2750                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2751                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2752                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2753                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2754                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2755                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
2756                    { { "sa", 4 }, SSAInfo(5, 6, 6, 6, 1, true) },
2757                    { { "sa", 5 }, SSAInfo(5, 6, 6, 6, 1, true) },
2758                    { { "sa", 6 }, SSAInfo(4, 5, 5, 5, 1, true) },
2759                    { { "sa", 7 }, SSAInfo(3, 4, 4, 4, 1, true) }
2760                }, false, true, true }
2761        },
2762        {   // SSA replaces
2763            { { "sa", 2 }, { { 4, 3 }, { 7, 3 }, { 3, 2 }, { 3, 1 }, { 5, 1 }, { 6, 2 } } },
2764            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 6, 2 }, { 7, 2 }, { 3, 1 }, { 5, 1 } } },
2765            //{ { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 5, 1 }, { 6, 1 }, { 4, 1 } } },
2766            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 } } },
2767            { { "sa", 5 }, { { 3, 2 }, { 5, 2 }, { 6, 2 }, { 3, 1 }, { 4, 1 } } },
2768            //{ { "sa", 6 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 3, 1 } } },
2769            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
2770            { { "sa", 7 }, { { 3, 1 }, { 4, 1 }, { 2, 1 } } }
2771        },
2772        true, ""
2773    },
2774    {   // 16 - routine with complex loop at start
2775        R"ffDXD(.regvar sa:s:10, va:v:8
2776        s_mov_b32 sa[2], s4
2777        s_mov_b32 sa[3], s5
2778        s_mov_b32 sa[4], s6
2779        s_mov_b32 sa[5], s7
2780        s_mov_b32 sa[6], s8
2781        .cf_call routine
2782        s_swappc_b64 s[0:1], s[2:3]
2783       
2784        s_xor_b32 sa[2], sa[2], sa[0]
2785        s_xor_b32 sa[3], sa[3], sa[0]
2786        s_xor_b32 sa[4], sa[4], sa[1]
2787        s_xor_b32 sa[5], sa[5], sa[1]
2788        s_xor_b32 sa[6], sa[6], sa[0]
2789        s_endpgm
2790       
2791routine:
2792loop0:  s_xor_b32 sa[2], sa[2], sa[0]
2793        s_cbranch_scc0 end1
2794       
2795        s_xor_b32 sa[3], sa[3], sa[0]
2796        s_cbranch_scc0 end2
2797       
2798        s_xor_b32 sa[4], sa[4], sa[1]
2799        s_cbranch_scc0 end3
2800       
2801        s_xor_b32 sa[5], sa[5], sa[1]
2802        s_branch loop0
2803       
2804end1:   s_xor_b32 sa[2], sa[2], sa[0]
2805        .cf_ret
2806        s_setpc_b64 s[0:1]
2807
2808end2:   s_xor_b32 sa[3], sa[3], sa[0]
2809        .cf_ret
2810        s_setpc_b64 s[0:1]
2811
2812end3:   s_xor_b32 sa[4], sa[4], sa[0]
2813        .cf_ret
2814        s_setpc_b64 s[0:1]
2815)ffDXD",
2816        {
2817            {   // block 0 - start
2818                0, 24,
2819                { { 2, true } },
2820                {
2821                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2822                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2823                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2824                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2825                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2826                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2827                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2828                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2829                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2830                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2831                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2832                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2833                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2834                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
2835                }, true, false, false },
2836            {   // block 1 - end
2837                24, 48,
2838                { },
2839                {
2840                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2841                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2842                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2843                    { { "sa", 3 }, SSAInfo(1, 4, 4, 4, 1, true) },
2844                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2845                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
2846                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2847                }, false, false, true },
2848            {   // block 2 - routine, loop
2849                48, 56,
2850                { { 3, false }, { 6, false } },
2851                {
2852                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2853                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
2854                }, false, false, false },
2855            {   // block 3 - to end2
2856                56, 64,
2857                { { 4, false }, { 7, false } },
2858                {
2859                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2860                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
2861                }, false, false, false },
2862            {   // block 4 - to end3
2863                64, 72,
2864                { { 5, false }, { 8, false } },
2865                {
2866                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2867                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2868                }, false, false, false },
2869            {   // block 5 - loop end
2870                72, 80,
2871                { { 2, false } },
2872                {
2873                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2874                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2875                }, false, false, true },
2876            {   // block 6 - end1
2877                80, 88,
2878                { },
2879                {
2880                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2881                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2882                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2883                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2884                }, false, true, true },
2885            {   // block 7 - end2
2886                88, 96,
2887                { },
2888                {
2889                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2890                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2891                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2892                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2893                }, false, true, true },
2894            {   // block 8 - end3
2895                96, 104,
2896                { },
2897                {
2898                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2899                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2900                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2901                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2902                }, false, true, true }
2903        },
2904        {   // SSA replaces
2905            { { "sa", 2 }, { { 3, 2 }, { 2, 1 } } },
2906            { { "sa", 3 }, { { 2, 1 }, { 3, 1 } } },
2907            { { "sa", 4 }, { { 2, 1 }, { 3, 1 } } },
2908            { { "sa", 5 }, { { 2, 1 } } }
2909        },
2910        true, ""
2911    },
2912    {   // 17 - routine with two consecutive complex loops
2913        R"ffDXD(.regvar sa:s:10, va:v:8
2914        s_mov_b32 sa[2], s4
2915        s_mov_b32 sa[3], s5
2916        s_mov_b32 sa[4], s6
2917        s_mov_b32 sa[5], s7
2918        s_mov_b32 sa[6], s8
2919        .cf_call routine
2920        s_swappc_b64 s[0:1], s[2:3]
2921       
2922        s_xor_b32 sa[2], sa[2], sa[0]
2923        s_xor_b32 sa[3], sa[3], sa[0]
2924        s_xor_b32 sa[4], sa[4], sa[1]
2925        s_xor_b32 sa[5], sa[5], sa[1]
2926        s_xor_b32 sa[6], sa[6], sa[0]
2927        s_endpgm
2928       
2929routine:
2930        s_xor_b32 sa[2], sa[2], sa[0]
2931        s_xor_b32 sa[3], sa[3], sa[0]
2932        s_xor_b32 sa[5], sa[5], sa[0]
2933        s_cbranch_vccz  subr1
2934       
2935loop0:  s_xor_b32 sa[2], sa[2], sa[0]
2936        s_cbranch_scc0 end1
2937       
2938        s_xor_b32 sa[3], sa[3], sa[0]
2939        s_cbranch_scc0 end2
2940       
2941        s_xor_b32 sa[4], sa[4], sa[1]
2942        s_cbranch_scc0 end3
2943       
2944        s_xor_b32 sa[5], sa[5], sa[1]
2945        s_cbranch_vccnz loop0
2946       
2947        s_xor_b32 sa[3], sa[3], sa[0]
2948        s_xor_b32 sa[4], sa[4], sa[0]
2949        s_xor_b32 sa[6], sa[6], sa[0]
2950        s_cbranch_vccz  subr2
2951
2952loop1:  s_xor_b32 sa[4], sa[4], sa[0]
2953        s_cbranch_scc0 end4
2954       
2955        s_xor_b32 sa[5], sa[5], sa[0]
2956        s_cbranch_scc0 end5
2957       
2958        s_xor_b32 sa[6], sa[6], sa[1]
2959        s_cbranch_scc0 end6
2960       
2961        s_xor_b32 sa[3], sa[3], sa[1]
2962        s_branch loop1
2963       
2964end1:   s_xor_b32 sa[2], sa[2], sa[0]
2965        .cf_ret
2966        s_setpc_b64 s[0:1]
2967       
2968end2:   s_xor_b32 sa[3], sa[3], sa[0]
2969        .cf_ret
2970        s_setpc_b64 s[0:1]
2971       
2972end3:   s_xor_b32 sa[4], sa[4], sa[0]
2973        .cf_ret
2974        s_setpc_b64 s[0:1]
2975       
2976end4:   s_xor_b32 sa[4], sa[4], sa[0]
2977        .cf_ret
2978        s_setpc_b64 s[0:1]
2979       
2980end5:   s_xor_b32 sa[5], sa[5], sa[0]
2981        .cf_ret
2982        s_setpc_b64 s[0:1]
2983       
2984end6:   s_xor_b32 sa[6], sa[6], sa[0]
2985        .cf_ret
2986        s_setpc_b64 s[0:1]
2987       
2988subr1:
2989        s_xor_b32 sa[2], sa[2], sa[0]
2990        s_xor_b32 sa[3], sa[3], sa[0]
2991        s_xor_b32 sa[4], sa[4], sa[0]
2992        s_xor_b32 sa[5], sa[5], sa[1]
2993        s_xor_b32 sa[6], sa[6], sa[0]
2994        s_cbranch_execnz loop0
2995       
2996subr2:
2997        s_xor_b32 sa[2], sa[2], sa[0]
2998        s_xor_b32 sa[3], sa[3], sa[0]
2999        s_xor_b32 sa[4], sa[4], sa[1]
3000        s_xor_b32 sa[5], sa[5], sa[1]
3001        s_xor_b32 sa[6], sa[6], sa[0]
3002        s_cbranch_execnz loop1
3003       
3004        s_xor_b32 sa[2], sa[2], sa[0]
3005        s_xor_b32 sa[3], sa[3], sa[0]
3006        s_xor_b32 sa[4], sa[4], sa[1]
3007        s_xor_b32 sa[5], sa[5], sa[1]
3008        s_xor_b32 sa[6], sa[6], sa[0]
3009        .cf_ret
3010        s_setpc_b64 s[0:1]
3011)ffDXD",
3012        {
3013            {   // block 0 - start
3014                0, 24,
3015                { { 2, true } },
3016                {
3017                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
3018                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
3019                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
3020                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
3021                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
3022                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
3023                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
3024                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
3025                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
3026                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
3027                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
3028                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
3029                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
3030                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
3031                }, true, false, false },
3032            {   // block 1 - end
3033                24, 48,
3034                { },
3035                {
3036                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3037                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3038                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
3039                    { { "sa", 3 }, SSAInfo(2, 10, 10, 10, 1, true) },
3040                    { { "sa", 4 }, SSAInfo(1, 10, 10, 10, 1, true) },
3041                    { { "sa", 5 }, SSAInfo(2, 9, 9, 9, 1, true) },
3042                    { { "sa", 6 }, SSAInfo(1, 8, 8, 8, 1, true) }
3043                }, false, false, true },
3044            {   // block 2 - routine
3045                48, 64,
3046                { { 3, false }, { 18, false } },
3047                {
3048                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3049                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
3050                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
3051                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
3052                }, false, false, false },
3053            {   // block 3 - loop0
3054                64, 72,
3055                { { 4, false }, { 12, false } },
3056                {
3057                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3058                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
3059                }, false, false, false },
3060            {   // block 4 - to end2
3061                72, 80,
3062                { { 5, false }, { 13, false } },
3063                {
3064                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3065                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
3066                }, false, false, false },
3067            {   // block 5 - to end3
3068                80, 88,
3069                { { 6, false }, { 14, false } },
3070                {
3071                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3072                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
3073                }, false, false, false },
3074            {   // block 6 - loop0 end
3075                88, 96,
3076                { { 3, false }, { 7, false } },
3077                {
3078                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3079                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
3080                }, false, false, false },
3081            {   // block 7 - after loop0
3082                96, 112,
3083                { { 8, false }, { 19, false } },
3084                {
3085                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3086                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
3087                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
3088                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
3089                }, false, false, false },
3090            {   // block 8 - loop1
3091                112, 120,
3092                { { 9, false }, { 15, false } },
3093                {
3094                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3095                    { { "sa", 4 }, SSAInfo(3, 4, 4, 4, 1, true) }
3096                }, false, false, false },
3097            {   // block 9 - to end5
3098                120, 128,
3099                { { 10, false }, { 16, false } },
3100                {
3101                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3102                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
3103                }, false, false, false },
3104            {   // block 10 - to end6
3105                128, 136,
3106                { { 11, false }, { 17, false } },
3107                {
3108                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3109                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) }
3110                }, false, false, false },
3111            {   // block 11 - loop1 end
3112                136, 144,
3113                { { 8, false } },
3114                {
3115                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3116                    { { "sa", 3 }, SSAInfo(4, 5, 5, 5, 1, true) }
3117                }, false, false, true },
3118            {   // block 12 - end1
3119                144, 152,
3120                { },
3121                {
3122                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3123                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3124                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3125                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) }
3126                }, false, true, true },
3127            {   // block 13 - end2
3128                152, 160,
3129                { },
3130                {
3131                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3132                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3133                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3134                    { { "sa", 3 }, SSAInfo(3, 8, 8, 8, 1, true) }
3135                }, false, true, true },
3136            {   // block 14 - end3
3137                160, 168,
3138                { },
3139                {
3140                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3141                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3142                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3143                    { { "sa", 4 }, SSAInfo(2, 8, 8, 8, 1, true) }
3144                }, false, true, true },
3145            {   // block 15 - end4
3146                168, 176,
3147                { },
3148                {
3149                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3150                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3151                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3152                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) }
3153                }, false, true, true },
3154            {   // block 16 - end5
3155                176, 184,
3156                { },
3157                {
3158                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3159                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3160                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3161                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) }
3162                }, false, true, true },
3163            {   // block 17 - end6
3164                184, 192,
3165                { },
3166                {
3167                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3168                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3169                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3170                    { { "sa", 6 }, SSAInfo(3, 4, 4, 4, 1, true) }
3171                }, false, true, true },
3172            {   // block 18 - subr1
3173                192, 216,
3174                { { 3, false }, { 19, false } },
3175                {
3176                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3177                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3178                    { { "sa", 2 }, SSAInfo(2, 7, 7, 7, 1, true) },
3179                    { { "sa", 3 }, SSAInfo(2, 9, 9, 9, 1, true) },
3180                    { { "sa", 4 }, SSAInfo(1, 9, 9, 9, 1, true) },
3181                    { { "sa", 5 }, SSAInfo(2, 8, 8, 8, 1, true) },
3182                    { { "sa", 6 }, SSAInfo(1, 7, 7, 7, 1, true) }
3183                }, false, false, false },
3184            {   // block 19 - subr2
3185                216, 240,
3186                { { 8, false }, { 20, false } },
3187                {
3188                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3189                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3190                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
3191                    { { "sa", 3 }, SSAInfo(4, 6, 6, 6, 1, true) },
3192                    { { "sa", 4 }, SSAInfo(3, 6, 6, 6, 1, true) },
3193                    { { "sa", 5 }, SSAInfo(3, 6, 6, 6, 1, true) },
3194                    { { "sa", 6 }, SSAInfo(2, 5, 5, 5, 1, true) }
3195                }, false, false, false },
3196            {   // block 20 - after subr2
3197                240, 264,
3198                { },
3199                {
3200                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3201                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3202                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3203                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3204                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
3205                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
3206                    { { "sa", 4 }, SSAInfo(6, 7, 7, 7, 1, true) },
3207                    { { "sa", 5 }, SSAInfo(6, 7, 7, 7, 1, true) },
3208                    { { "sa", 6 }, SSAInfo(5, 6, 6, 6, 1, true) }
3209                }, false, true, true }
3210        },
3211        {   // SSA replaces
3212            { { "sa", 2 }, { { 4, 3 }, { 5, 3 }, { 6, 3 }, { 7, 3 }, { 3, 2 }, { 7, 2 } } },
3213            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 }, { 8, 2 },
3214                        { 9, 2 }, { 5, 4 }, { 6, 4 }, { 9, 4 } } },
3215            { { "sa", 4 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 },
3216                        { 4, 3 }, { 6, 3 }, { 9, 3 } } },
3217            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 }, { 8, 2 },
3218                        { 4, 3 }, { 6, 3 }, { 8, 3 } } },
3219            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1 },
3220                        { 3, 2 }, { 5, 2 }, { 7, 2 } } }
3221        },
3222        true, ""
3223    },
3224    {   // 18 - routine with nested loops
3225        R"ffDXD(.regvar sa:s:10, va:v:8
3226        s_mov_b32 sa[2], s4
3227        s_mov_b32 sa[3], s5
3228        s_mov_b32 sa[4], s6
3229        s_mov_b32 sa[5], s7
3230        s_mov_b32 sa[6], s8
3231        .cf_call routine
3232        s_swappc_b64 s[0:1], s[2:3]
3233       
3234        s_xor_b32 sa[2], sa[2], sa[0]
3235        s_xor_b32 sa[3], sa[3], sa[0]
3236        s_xor_b32 sa[4], sa[4], sa[1]
3237        s_xor_b32 sa[5], sa[5], sa[1]
3238        s_xor_b32 sa[6], sa[6], sa[0]
3239        s_endpgm
3240       
3241routine:
3242        s_xor_b32 sa[2], sa[2], sa[0]
3243        s_xor_b32 sa[3], sa[3], sa[0]
3244        s_xor_b32 sa[5], sa[5], sa[0]
3245        s_cbranch_vccz  subr1
3246       
3247loop0:  s_xor_b32 sa[2], sa[2], sa[0]
3248        s_cbranch_scc0 end1
3249       
3250        s_xor_b32 sa[3], sa[3], sa[0]
3251        s_cbranch_scc0 end2
3252       
3253        s_xor_b32 sa[6], sa[6], sa[0]
3254       
3255loop1:  s_xor_b32 sa[4], sa[4], sa[0]
3256        s_cbranch_scc0 end4
3257       
3258        s_xor_b32 sa[5], sa[5], sa[0]
3259        s_cbranch_scc0 end5
3260       
3261        s_xor_b32 sa[6], sa[6], sa[1]
3262        s_cbranch_scc0 end6
3263       
3264        s_xor_b32 sa[3], sa[3], sa[1]
3265        s_cbranch_execnz loop1
3266       
3267        s_xor_b32 sa[4], sa[4], sa[1]
3268        s_cbranch_scc0 end3
3269       
3270        s_xor_b32 sa[5], sa[5], sa[1]
3271        s_cbranch_vccnz loop0
3272       
3273        .cf_ret
3274        s_setpc_b64 s[0:1]
3275       
3276end1:   s_xor_b32 sa[2], sa[2], sa[0]
3277        .cf_ret
3278        s_setpc_b64 s[0:1]
3279       
3280end2:   s_xor_b32 sa[3], sa[3], sa[0]
3281        .cf_ret
3282        s_setpc_b64 s[0:1]
3283       
3284end3:   s_xor_b32 sa[4], sa[4], sa[0]
3285        .cf_ret
3286        s_setpc_b64 s[0:1]
3287       
3288end4:   s_xor_b32 sa[4], sa[4], sa[0]
3289        .cf_ret
3290        s_setpc_b64 s[0:1]
3291       
3292end5:   s_xor_b32 sa[5], sa[5], sa[0]
3293        .cf_ret
3294        s_setpc_b64 s[0:1]
3295       
3296end6:   s_xor_b32 sa[6], sa[6], sa[0]
3297        .cf_ret
3298        s_setpc_b64 s[0:1]
3299       
3300subr1:
3301        s_xor_b32 sa[2], sa[2], sa[0]
3302        s_xor_b32 sa[3], sa[3], sa[0]
3303        s_xor_b32 sa[4], sa[4], sa[0]
3304        s_xor_b32 sa[5], sa[5], sa[1]
3305        s_xor_b32 sa[6], sa[6], sa[0]
3306        s_cbranch_execnz loop0
3307       
3308        s_xor_b32 sa[2], sa[2], sa[0]
3309        s_xor_b32 sa[3], sa[3], sa[0]
3310        s_xor_b32 sa[4], sa[4], sa[0]
3311        s_xor_b32 sa[5], sa[5], sa[1]
3312        s_xor_b32 sa[6], sa[6], sa[0]
3313        s_cbranch_execnz loop1
3314       
3315        s_xor_b32 sa[2], sa[2], sa[0]
3316        s_xor_b32 sa[3], sa[3], sa[0]
3317        s_xor_b32 sa[4], sa[4], sa[0]
3318        s_xor_b32 sa[5], sa[5], sa[1]
3319        s_xor_b32 sa[6], sa[6], sa[0]
3320        .cf_ret
3321        s_setpc_b64 s[0:1]
3322)ffDXD",
3323        {
3324            {   // block 0 - start
3325                0, 24,
3326                { { 2, true } },
3327                {
3328                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
3329                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
3330                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
3331                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
3332                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
3333                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
3334                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
3335                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
3336                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
3337                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
3338                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
3339                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
3340                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
3341                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
3342                }, true, false, false },
3343            {   // block 1 - end
3344                24, 48,
3345                { },
3346                {
3347                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3348                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3349                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
3350                    { { "sa", 3 }, SSAInfo(2, 9, 9, 9, 1, true) },
3351                    { { "sa", 4 }, SSAInfo(1, 9, 9, 9, 1, true) },
3352                    { { "sa", 5 }, SSAInfo(2, 9, 9, 9, 1, true) },
3353                    { { "sa", 6 }, SSAInfo(1, 8, 8, 8, 1, true) }
3354                }, false, false, true },
3355            {   // block 2 - routine
3356                48, 64,
3357                { { 3, false }, { 19, false } },
3358                {
3359                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3360                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
3361                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
3362                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
3363                }, false, false, false },
3364            {   // block 3 - loop0
3365                64, 72,
3366                { { 4, false }, { 13, false } },
3367                {
3368                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3369                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
3370                }, false, false, false },
3371            {   // block 4 - to end2
3372                72, 80,
3373                { { 5, false }, { 14, false } },
3374                {
3375                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3376                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
3377                }, false, false, false },
3378            {   // block 5 - before loop1
3379                80, 84,
3380                { },
3381                {
3382                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3383                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
3384                }, false, false, false },
3385            {   // block 6 - loop1
3386                84, 92,
3387                { { 7, false }, { 16, false } },
3388                {
3389                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3390                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
3391                }, false, false, false },
3392            {   // block 7 - to end5
3393                92, 100,
3394                { { 8, false }, { 17, false } },
3395                {
3396                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3397                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
3398                }, false, false, false },
3399            {   // block 8 - to end6
3400                100, 108,
3401                { { 9, false }, { 18,