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

Last change on this file since 3917 was 3917, checked in by matszpk, 15 months ago

CLRadeonExtender: AsmRegAlloc?: Apply calls from last entry position to stackVarMap (resolveSSAConflicts). Update testcases.

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