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

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

CLRadeonExtender: AsmRegAlloc?: Add new testcases: second to test using loops inside routine.

File size: 92.7 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#if 0
531    {   // 3 - routine with loop
532        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
533        s_mov_b32 sa[2], s4
534        s_mov_b32 sa[3], s5
535        s_mov_b32 sa[4], s6
536        s_mov_b32 sa[5], s7
537       
538        .cf_call routine
539        s_swappc_b64 s[0:1], s[2:3]
540       
541        s_xor_b32 sa[5], sa[5], sa[0]
542        s_xor_b32 sa[2], sa[2], sa[0]
543       
544        .cf_call routine
545        s_swappc_b64 s[0:1], s[2:3]
546       
547        s_endpgm
548       
549routine:
550        s_add_u32 sa[2], sa[2], sa[0]
551        s_add_u32 sa[3], sa[3], sa[1]
552       
553loop0:
554        s_add_u32 sa[4], sa[3], sa[0]
555        s_add_u32 sa[5], sa[3], sa[5]
556        s_cbranch_scc1 j1
557       
558j0:     s_add_u32 sa[2], sa[3], sa[0]
559        s_branch loopend
560
561j1:     s_add_u32 sa[5], sa[2], sa[0]
562
563loopend:
564        s_add_u32 sa[5], sa[5], sa[1]
565        s_cbranch_scc0 loop0
566       
567        s_add_u32 sa[5], sa[5], sa[0]
568        s_add_u32 sa[3], sa[3], sa[1]
569        .cf_ret
570        s_setpc_b64 s[0:1]
571)ffDXD",
572        {
573            {   // block 0 - start
574                0, 20,
575                { { 3, true } },
576                {
577                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
578                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
579                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
580                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
581                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
582                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
583                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
584                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
585                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
586                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
587                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
588                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
589                }, true, false, false },
590            {   // block 1 - before second call
591                20, 32,
592                { { 3, true } },
593                {
594                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
595                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
596                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
597                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
598                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
599                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
600                    { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) }
601                }, true, false, false },
602            {   // block 2 - end
603                32, 36,
604                { },
605                { }, false, false, true },
606            {   // block 3 - routine
607                36, 44,
608                { },
609                {
610                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
611                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
612                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
613                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
614                }, false, false, false },
615            {   // block 4 - loop
616                44, 56,
617                { { 5, false }, { 6, false } },
618                {
619                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
620                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
621                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
622                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
623                },
624                false, false, false },
625            {   // block 5 - j0
626                56, 64,
627                { { 7, false } },
628                {
629                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
630                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
631                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) }
632                }, false, false, true },
633            {   // block 6 - j1
634                64, 68,
635                { },
636                {
637                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
638                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
639                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, false) }
640                }, false, false, false },
641            {   // block 7 - loopend
642                68, 76,
643                { { 4, false }, { 8, false } },
644                {
645                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
646                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
647                }, false, false, false },
648            {   // block 8 - routine end
649                76, 88,
650                { },
651                {
652                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
653                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
654                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
655                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
656                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
657                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
658                }, false, true, true }
659        },
660        {   // SSA replaces
661            { { "sa", 2 }, { { 3, 2 }, { 3, 2 }, { 4, 1 } } },
662            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 3, 1 }, { 5, 2 }, { 6, 1 } } }
663        },
664        true, ""
665    }
666#endif
667    {   // 4 - routine with condition
668        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
669        s_mov_b32 sa[2], s4
670        s_mov_b32 sa[3], s5
671        s_mov_b32 sa[4], s6
672        s_mov_b32 sa[5], s7
673       
674        .cf_call routine
675        s_swappc_b64 s[0:1], s[2:3]
676       
677        s_xor_b32 sa[5], sa[5], sa[0]
678        s_xor_b32 sa[2], sa[2], sa[0]
679       
680        .cf_call routine
681        s_swappc_b64 s[0:1], s[2:3]
682       
683        s_endpgm
684       
685routine:
686        s_add_u32 sa[2], sa[2], sa[0]
687        s_add_u32 sa[3], sa[3], sa[1]
688       
689        s_add_u32 sa[4], sa[3], sa[0]
690        s_add_u32 sa[5], sa[3], sa[5]
691        s_cbranch_scc1 j1
692       
693j0:     s_add_u32 sa[2], sa[3], sa[0]
694        s_add_u32 sa[4], sa[3], sa[1]
695        s_branch rend
696
697j1:     s_add_u32 sa[5], sa[2], sa[0]
698        s_add_u32 sa[4], sa[3], sa[1]
699
700rend:
701        s_add_u32 sa[5], sa[5], sa[0]
702        s_add_u32 sa[3], sa[3], sa[1]
703        .cf_ret
704        s_setpc_b64 s[0:1]
705)ffDXD",
706        {
707            {   // block 0 - start
708                0, 20,
709                { { 3, true } },
710                {
711                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
712                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
713                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
714                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
715                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
716                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
717                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
718                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
719                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
720                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
721                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
722                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
723                }, true, false, false },
724            {   // block 1 - before second call
725                20, 32,
726                { { 3, true } },
727                {
728                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
729                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
730                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
731                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
732                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
733                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
734                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
735                }, true, false, false },
736            {   // block 2 - end
737                32, 36,
738                { },
739                { }, false, false, true },
740            {   // block 3 - routine
741                36, 56,
742                { { 4, false }, { 5, false } },
743                {
744                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
745                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
746                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
747                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
748                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
749                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
750                }, false, false, false },
751            {   // block 4 - j0
752                56, 68,
753                { { 6, false } },
754                {
755                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
756                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
757                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
758                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
759                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, false) }
760                },
761                false, false, true },
762            {   // block 5 - j1
763                68, 76,
764                { },
765                {
766                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
767                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
768                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
769                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
770                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, false) },
771                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, false) }
772                }, false, false, false },
773            {   // block 6 - end
774                76, 88,
775                { },
776                {
777                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
778                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
779                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
780                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
781                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
782                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
783                }, false, true, true }
784        },
785        {   // SSA replaces
786            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
787            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
788        },
789        true, ""
790    },
791    {   // 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, 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(2, 6, 6, 6, 1, true) }
1183                }, false, false, true },
1184            {   // block 8 - routine
1185                96, 108,
1186                { { 9, false }, { 10, false }, { 11, false } },
1187                {
1188                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1189                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1190                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1191                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1192                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1193                }, false, false, false },
1194            {   // block 9 - bb0
1195                108, 136,
1196                { },
1197                {
1198                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1199                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1200                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1201                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1202                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1203                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1204                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1205                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1206                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
1207                }, false, true, true },
1208            {   // block 10 - bb1
1209                136, 164,
1210                { },
1211                {
1212                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1213                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1214                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1215                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1216                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1217                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1218                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1219                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1220                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) }
1221                }, false, true, true },
1222            {   // block 11 - bb2
1223                164, 192,
1224                { },
1225                {
1226                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1227                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1228                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1229                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1230                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1231                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1232                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1233                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) },
1234                    { { "sa", 7 }, SSAInfo(1, 4, 4, 4, 1, true) }
1235                }, false, true, true }
1236        },
1237        {   // SSA replaces
1238            { { "sa", 2 }, { { 4, 3 }, { 5, 3 }, { 6, 1 } } },
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        },
1245        true, ""
1246    },
1247    {   // 8 - retssa tests
1248        R"ffDXD(.regvar sa:s:8, va:v:8
1249        s_mov_b32 sa[2], s4
1250        s_mov_b32 sa[3], s5
1251        s_mov_b32 sa[4], s6
1252        s_mov_b32 sa[5], s5
1253        s_mov_b32 sa[6], s6
1254       
1255        .cf_call routine
1256        s_swappc_b64 s[0:1], s[2:3]
1257       
1258        s_lshl_b32 sa[2], sa[2], 3
1259        s_lshl_b32 sa[3], sa[1], 4
1260        s_cbranch_scc1 aa1
1261       
1262aa0:    s_lshl_b32 sa[2], sa[2], 3
1263        s_lshl_b32 sa[4], sa[3], 3
1264        s_lshl_b32 sa[6], sa[5], 3
1265        s_endpgm
1266
1267aa1:    s_lshl_b32 sa[2], sa[1], 3
1268        s_lshl_b32 sa[2], sa[3], 3
1269        s_lshl_b32 sa[4], sa[4], 3
1270        s_lshl_b32 sa[6], sa[6], 3
1271        s_endpgm
1272       
1273routine:
1274        s_xor_b32 sa[2], sa[2], sa[0]
1275        s_xor_b32 sa[3], sa[3], sa[0]
1276        .cf_cjump bb1, bb2
1277        s_setpc_b64 s[0:1]
1278       
1279bb0:    s_min_u32 sa[2], sa[2], sa[0]
1280        s_min_u32 sa[3], sa[3], sa[0]
1281        s_max_u32 sa[4], sa[4], sa[0]
1282        s_xor_b32 sa[5], sa[5], sa[0]
1283        s_xor_b32 sa[6], sa[6], sa[0]
1284        .cf_ret
1285        s_setpc_b64 s[0:1]
1286       
1287bb1:    s_and_b32 sa[2], sa[2], sa[0]
1288        s_and_b32 sa[3], sa[3], sa[0]
1289        s_max_u32 sa[4], sa[4], sa[0]
1290        s_xor_b32 sa[5], sa[5], sa[0]
1291        s_xor_b32 sa[6], sa[6], sa[0]
1292        .cf_ret
1293        s_setpc_b64 s[0:1]
1294
1295bb2:    s_and_b32 sa[2], sa[2], sa[0]
1296        s_and_b32 sa[3], sa[3], sa[0]
1297        s_max_u32 sa[4], sa[4], sa[0]
1298        s_xor_b32 sa[5], sa[5], sa[0]
1299        s_xor_b32 sa[6], sa[6], sa[0]
1300        .cf_ret
1301        s_setpc_b64 s[0:1]
1302)ffDXD",
1303        {
1304            {   // block 0 - start
1305                0, 24,
1306                { { 4, true } },
1307                {
1308                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1309                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1310                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1311                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1312                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1313                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1314                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1315                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1316                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1317                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1318                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1319                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1320                }, true, false, false },
1321            {   // block 1 - after call
1322                24, 36,
1323                { { 2, false }, { 3, false } },
1324                {
1325                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1326                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1327                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1328                }, false, false, false },
1329            {   // block 2 - aa0
1330                36, 52,
1331                { },
1332                {
1333                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
1334                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1335                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1336                    { { "sa", 5 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) },
1337                    { { "sa", 6 }, SSAInfo(1, 5, 5, 5, 1, false) }
1338                }, false, false, true },
1339            {   // block 3 - aa1
1340                52, 72,
1341                { },
1342                {
1343                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1344                    { { "sa", 2 }, SSAInfo(6, 8, 8, 9, 2, false) },
1345                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1346                    { { "sa", 4 }, SSAInfo(2, 6, 6, 6, 1, true) },
1347                    { { "sa", 6 }, SSAInfo(2, 6, 6, 6, 1, true) }
1348                }, false, false, true },
1349            {   // block 4 - routine
1350                72, 84,
1351                { { 5, false }, { 6, false }, { 7, false } },
1352                {
1353                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1354                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1355                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1356                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1357                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1358                }, false, false, false },
1359            {   // block 5 - bb0
1360                84, 108,
1361                { },
1362                {
1363                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1364                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1365                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1366                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1367                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1368                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1369                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1370                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1371                }, false, true, true },
1372            {   // block 6 - bb1
1373                108, 132,
1374                { },
1375                {
1376                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1377                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1378                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1379                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1380                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1381                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1382                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1383                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1384                }, false, true, true },
1385            {   // block 7 - bb2
1386                132, 156,
1387                { },
1388                {
1389                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1390                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1391                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1392                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1393                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1394                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1395                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1396                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
1397                }, false, true, true }
1398        },
1399        {   // SSA replaces
1400            { { "sa", 2 }, { { 4, 3 }, { 5, 3 } } },
1401            { { "sa", 4 }, { { 3, 2 }, { 4, 2 } } },
1402            { { "sa", 5 }, { { 3, 2 }, { 4, 2 } } },
1403            { { "sa", 6 }, { { 3, 2 }, { 4, 2 } } }
1404        },
1405        true, ""
1406    },
1407    {   // 9 - retssa tests
1408        R"ffDXD(.regvar sa:s:10, va:v:8
1409        s_mov_b32 sa[2], s4
1410        s_mov_b32 sa[3], s5
1411        s_mov_b32 sa[4], s6
1412        s_mov_b32 sa[5], s5
1413        v_mov_b32 va[1], v0
1414        v_mov_b32 va[2], v1
1415       
1416        .cf_call routine
1417        s_swappc_b64 s[0:1], s[2:3]
1418        s_cbranch_vccnz aa1
1419aa0:    s_xor_b32 sa[2], sa[1], sa[0]
1420        s_xor_b32 sa[3], sa[3], sa[0]
1421       
1422        .cf_call routine2
1423        s_swappc_b64 s[0:1], s[2:3]
1424       
1425        s_cbranch_vccnz aa3
1426aa2:    s_xor_b32 sa[6], sa[1], sa[0]
1427        s_xor_b32 sa[7], sa[7], sa[0]
1428        v_xor_b32 va[1], va[0], va[0]
1429        v_xor_b32 va[2], va[0], va[0]
1430        s_endpgm
1431       
1432aa3:    s_xor_b32 sa[6], sa[6], sa[0]
1433        s_xor_b32 sa[7], sa[7], sa[0]
1434        s_xor_b32 sa[8], sa[8], sa[0]
1435        s_xor_b32 sa[5], sa[5], sa[0]
1436        v_xor_b32 va[1], va[1], va[0]
1437        v_xor_b32 va[0], va[2], va[0]
1438        s_endpgm
1439       
1440aa1:    s_xor_b32 sa[2], sa[2], sa[0]
1441        s_xor_b32 sa[3], sa[3], sa[0]
1442        s_xor_b32 sa[2], sa[4], sa[0]
1443        s_xor_b32 sa[5], sa[5], sa[0]
1444        s_cbranch_execz aa5
1445       
1446aa4:    s_xor_b32 sa[4], sa[4], sa[0]
1447        v_xor_b32 va[1], va[1], va[0]
1448        s_endpgm
1449       
1450aa5:    s_xor_b32 sa[4], sa[4], sa[0]
1451        s_endpgm
1452       
1453routine:
1454        s_xor_b32 sa[2], sa[2], sa[0]
1455        s_xor_b32 sa[3], sa[3], sa[0]
1456        s_cbranch_vccz bb1
1457       
1458bb0:    s_min_u32 sa[2], sa[2], sa[0]
1459        s_min_u32 sa[3], sa[3], sa[0]
1460        s_max_u32 sa[4], sa[4], sa[0]
1461        s_xor_b32 sa[5], sa[5], sa[0]
1462        v_xor_b32 va[1], va[1], va[0]
1463        v_xor_b32 va[2], va[2], va[0]
1464        .cf_ret
1465        s_setpc_b64 s[0:1]
1466       
1467bb1:    s_and_b32 sa[2], sa[2], sa[0]
1468        s_and_b32 sa[3], sa[3], sa[0]
1469        s_max_u32 sa[4], sa[4], sa[0]
1470        s_xor_b32 sa[5], sa[5], sa[0]
1471        v_xor_b32 va[1], va[1], va[0]
1472        v_xor_b32 va[2], va[2], va[0]
1473        .cf_ret
1474        s_setpc_b64 s[0:1]
1475
1476routine2:
1477        s_xor_b32 sa[6], sa[6], sa[1]
1478        s_xor_b32 sa[7], sa[7], sa[1]
1479        s_cbranch_vccz bb3
1480       
1481bb2:    s_min_u32 sa[6], sa[6], sa[1]
1482        s_min_u32 sa[7], sa[7], sa[1]
1483        s_max_u32 sa[8], sa[8], sa[1]
1484        s_xor_b32 sa[5], sa[5], sa[1]
1485        .cf_ret
1486        s_setpc_b64 s[0:1]
1487       
1488bb3:    s_and_b32 sa[6], sa[6], sa[1]
1489        s_and_b32 sa[7], sa[7], sa[1]
1490        s_max_u32 sa[8], sa[8], sa[1]
1491        s_xor_b32 sa[5], sa[5], sa[1]
1492        .cf_ret
1493        s_setpc_b64 s[0:1]
1494)ffDXD",
1495        {
1496            {   // block 0 - start
1497                0, 28,
1498                { { 9, true } },
1499                {
1500                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1501                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1502                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1503                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1504                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1505                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1506                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1507                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1508                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1509                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1510                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1511                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1512                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1513                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1514                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
1515                }, true, false, false },
1516            {   // block 1 - branch aa0-aa1
1517                28, 32,
1518                { { 2, false }, { 6, false } },
1519                {
1520                }, false, false, false },
1521            {   // block 2 - aa0
1522                32, 44,
1523                { { 12, true } },
1524                {
1525                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1526                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1527                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1528                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1529                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1530                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1531                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1532                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1533                }, true, false, false },
1534            {   // block 3 - branch aa2-aa3
1535                44, 48,
1536                { { 4, false }, { 5, false } },
1537                {
1538                }, false, false, false },
1539            {   // block 4 - aa2
1540                48, 68,
1541                { },
1542                {
1543                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1544                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1545                    { { "sa", 6 }, SSAInfo(0, 4, 4, 4, 1, false) },
1546                    { { "sa", 7 }, SSAInfo(2, 4, 4, 4, 1, true) },
1547                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1548                    { { "va", 1 }, SSAInfo(1, 4, 4, 4, 1, false) },
1549                    { { "va", 2 }, SSAInfo(1, 4, 4, 4, 1, false) }
1550                }, false, false, true },
1551            {   // block 5 - aa3
1552                68, 96,
1553                { },
1554                {
1555                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1556                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) },
1557                    { { "sa", 6 }, SSAInfo(2, 5, 5, 5, 1, true) },
1558                    { { "sa", 7 }, SSAInfo(2, 5, 5, 5, 1, true) },
1559                    { { "sa", 8 }, SSAInfo(1, 3, 3, 3, 1, true) },
1560                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
1561                    { { "va", 1 }, SSAInfo(2, 5, 5, 5, 1, true) },
1562                    { { "va", 2 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1563                }, false, false, true },
1564            {   // block 6 - aa1
1565                96, 116,
1566                { { 7, false }, { 8, false } },
1567                {
1568                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1569                    { { "sa", 2 }, SSAInfo(3, 6, 6, 7, 2, true) },
1570                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) },
1571                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
1572                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) }
1573                }, false, false, false },
1574            {   // block 7 - aa4
1575                116, 128,
1576                { },
1577                {
1578                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1579                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
1580                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1581                    { { "va", 1 }, SSAInfo(2, 6, 6, 6, 1, true) }
1582                }, false, false, true },
1583            {   // block 8 - aa5
1584                128, 136,
1585                { },
1586                {
1587                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1588                    { { "sa", 4 }, SSAInfo(2, 5, 5, 5, 1, true) }
1589                }, false, false, true },
1590            {   // block 9 - routine
1591                136, 148,
1592                { { 10, false }, { 11, false } },
1593                {
1594                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1595                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1596                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1597                }, false, false, false },
1598            {   // block 10 - bb0
1599                148, 176,
1600                { },
1601                {
1602                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1603                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1604                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1605                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1606                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1607                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1608                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1609                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1610                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1611                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1612                }, false, true, true },
1613            {   // block 11 - bb1
1614                176, 204,
1615                { },
1616                {
1617                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1618                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1619                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1620                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1621                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1622                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1623                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1624                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1625                    { { "va", 1 }, SSAInfo(1, 3, 3, 3, 1, true) },
1626                    { { "va", 2 }, SSAInfo(1, 3, 3, 3, 1, true) }
1627                }, false, true, true },
1628            {   // block 12 - routine2
1629                204, 216,
1630                { { 13, false }, { 14, false } },
1631                {
1632                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1633                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, true) },
1634                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, true) }
1635                }, false, false, false },
1636            {   // block 13 - bb2
1637                216, 236,
1638                { },
1639                {
1640                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1641                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1642                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1643                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
1644                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1645                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) },
1646                    { { "sa", 8 }, SSAInfo(0, 1, 1, 1, 1, true) }
1647                }, false, true, true },
1648            {   // block 14 - bb3
1649                236, 256,
1650                { },
1651                {
1652                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1653                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1654                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1655                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, true) },
1656                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1657                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) },
1658                    { { "sa", 8 }, SSAInfo(0, 2, 2, 2, 1, true) }
1659                }, false, true, true }
1660        },
1661        {   // SSA replaces
1662            { { "sa", 2 }, { { 4, 3 } } },
1663            { { "sa", 3 }, { { 4, 3 } } },
1664            { { "sa", 4 }, { { 3, 2 } } },
1665            { { "sa", 5 }, { { 3, 2 }, { 5, 4 } } },
1666            { { "sa", 6 }, { { 3, 2 } } },
1667            { { "sa", 7 }, { { 3, 2 } } },
1668            { { "sa", 8 }, { { 2, 1 } } },
1669            { { "va", 1 }, { { 3, 2 } } },
1670            { { "va", 2 }, { { 3, 2 } } }
1671        },
1672        true, ""
1673    },
1674    {   // 10 - retssa tests 2
1675        R"ffDXD(.regvar sa:s:10, va:v:8
1676        s_mov_b32 sa[2], s4
1677        s_mov_b32 sa[3], s5
1678        .cf_call routine
1679        s_swappc_b64 s[0:1], s[2:3]
1680       
1681        s_xor_b32 sa[4], sa[4], sa[1]
1682        s_cbranch_execz aa1
1683       
1684aa0:    .cf_call routine2
1685        s_swappc_b64 s[0:1], s[2:3]
1686       
1687        s_and_b32 sa[3], sa[3], sa[0]
1688        s_endpgm
1689       
1690aa1:    s_xor_b32 sa[4], sa[4], sa[1]
1691        s_and_b32 sa[2], sa[2], sa[0]
1692        s_endpgm
1693       
1694routine:
1695        s_xor_b32 sa[2], sa[2], sa[0]
1696        s_cbranch_vccz bb1
1697       
1698bb0:    s_min_u32 sa[2], sa[2], sa[0]
1699        .cf_ret
1700        s_setpc_b64 s[0:1]
1701       
1702bb1:    s_and_b32 sa[2], sa[2], sa[0]
1703        .cf_ret
1704        s_setpc_b64 s[0:1]
1705       
1706routine2:
1707        s_xor_b32 sa[2], sa[1], sa[0]
1708        s_xor_b32 sa[3], sa[3], sa[0]
1709        s_cbranch_vccz cc1
1710       
1711cc0:    s_min_u32 sa[3], sa[3], sa[0]
1712        s_xor_b32 sa[2], sa[1], sa[0]
1713        .cf_ret
1714        s_setpc_b64 s[0:1]
1715       
1716cc1:    s_and_b32 sa[3], sa[3], sa[0]
1717        s_xor_b32 sa[2], sa[1], sa[0]
1718        .cf_ret
1719        s_setpc_b64 s[0:1]
1720)ffDXD",
1721        {
1722            {   // block 0 - start
1723                0, 12,
1724                { { 5, true } },
1725                {
1726                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1727                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1728                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1729                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1730                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1731                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1732                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1733                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1734                }, true, false, false },
1735            {   // block 1 - after routine call
1736                12, 20,
1737                { { 2, false }, { 4, false } },
1738                {
1739                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1740                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
1741                }, false, false, false },
1742            {   // block 2 - aa0
1743                20, 24,
1744                { { 8, true } },
1745                {
1746                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1747                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1748                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1749                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1750                }, true, false, false },
1751            {   // block 3 - after routine2 call
1752                24, 32,
1753                { },
1754                {
1755                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1756                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1757                }, false, false, true },
1758            {   // block 4 - aa1
1759                32, 44,
1760                { },
1761                {
1762                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1763                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1764                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
1765                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1766                }, false, false, true },
1767            {   // block 5 - routine
1768                44, 52,
1769                { { 6, false }, { 7, false } },
1770                {
1771                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1772                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1773                }, false, false, false },
1774            {   // block 6 - bb0
1775                52, 60,
1776                { },
1777                {
1778                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1779                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1780                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1781                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
1782                }, false, true, true },
1783            {   // block 7 - bb1
1784                60, 68,
1785                { },
1786                {
1787                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1788                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1789                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1790                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) }
1791                }, false, true, true },
1792            {   // block 8 - routine2
1793                68, 80,
1794                { { 9, false }, { 10, false } },
1795                {
1796                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1797                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1798                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1799                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1800                }, false, false, false },
1801            {   // block 9 - cc0
1802                80, 92,
1803                { },
1804                {
1805                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1806                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1807                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1808                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1809                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, false) },
1810                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
1811                }, false, true, true },
1812            {   // block 10 - cc1
1813                92, 104,
1814                { },
1815                {
1816                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1817                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1818                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1819                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1820                    { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, false) },
1821                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
1822                }, false, true, true }
1823        },
1824        {   // SSA replaces
1825            { { "sa", 2 }, { { 4, 3 } } },
1826            { { "sa", 3 }, { { 4, 3 } } }
1827        },
1828        true, ""
1829    },
1830    {   // 11 - simple routine with loop
1831        R"ffDXD(.regvar sa:s:10, va:v:8
1832        s_mov_b32 sa[2], s4
1833        s_mov_b32 sa[3], s5
1834        s_mov_b32 sa[4], s6
1835        .cf_call routine
1836        s_swappc_b64 s[0:1], s[2:3]
1837       
1838        s_xor_b32 sa[2], sa[2], sa[0]
1839        s_xor_b32 sa[3], sa[3], sa[0]
1840        s_xor_b32 sa[4], sa[4], sa[1]
1841       
1842        .cf_call routine
1843        s_swappc_b64 s[0:1], s[2:3]
1844       
1845        s_xor_b32 sa[2], sa[2], sa[0]
1846        s_xor_b32 sa[3], sa[3], sa[0]
1847        s_xor_b32 sa[4], sa[4], sa[1]
1848        s_endpgm
1849       
1850routine:
1851        s_xor_b32 sa[2], sa[2], sa[0]
1852        s_xor_b32 sa[3], sa[3], sa[0]
1853       
1854loop0:  s_xor_b32 sa[2], sa[2], sa[0]
1855        s_xor_b32 sa[3], sa[3], sa[0]
1856        s_xor_b32 sa[4], sa[4], sa[1]
1857        s_cbranch_scc0 loop0
1858       
1859        s_xor_b32 sa[4], sa[4], sa[1]
1860        s_xor_b32 sa[2], sa[2], sa[0]
1861        .cf_ret
1862        s_setpc_b64 s[0:1]
1863)ffDXD",
1864        {
1865            {   // block 0 - start
1866                0, 16,
1867                { { 3, true } },
1868                {
1869                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1870                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1871                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1872                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1873                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1874                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1875                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1876                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1877                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1878                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
1879                }, true, false, false },
1880            {   // block 1 - after routine call
1881                16, 32,
1882                { { 3, true } },
1883                {
1884                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1885                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1886                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1887                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1888                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1889                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1890                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
1891                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
1892                    { { "sa", 4 }, SSAInfo(3, 4, 4, 4, 1, true) }
1893                }, true, false, false },
1894            {   // block 2 - end
1895                32, 48,
1896                { },
1897                {
1898                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1899                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1900                    { { "sa", 2 }, SSAInfo(4, 6, 6, 6, 1, true) },
1901                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
1902                    { { "sa", 4 }, SSAInfo(3, 5, 5, 5, 1, true) }
1903                }, false, false, true },
1904            {   // block 3 - routine
1905                48, 56,
1906                { },
1907                {
1908                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1909                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1910                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1911                }, false, false, false },
1912            {   // block 4 - loop0
1913                56, 72,
1914                { { 4, false }, { 5, false } },
1915                {
1916                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1917                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1918                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1919                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1920                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1921                }, false, false, false },
1922            {   // block 5 - routine end
1923                72, 84,
1924                { },
1925                {
1926                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1927                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1928                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1929                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1930                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
1931                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
1932                }, false, true, true }
1933        },
1934        {   // SSA replaces
1935            { { "sa", 2 }, { { 3, 2 }, { 5, 1 } } },
1936            { { "sa", 3 }, { { 3, 2 }, { 4, 1 } } },
1937            { { "sa", 4 }, { { 2, 1 }, { 4, 1 } } }
1938        },
1939        true, ""
1940    },
1941    {
1942        R"ffDXD(.regvar sa:s:10, va:v:8
1943        s_mov_b32 sa[2], s4
1944        s_mov_b32 sa[3], s5
1945        .cf_call routine
1946        s_swappc_b64 s[0:1], s[2:3]
1947       
1948        s_xor_b32 sa[2], sa[2], sa[0]
1949        s_xor_b32 sa[3], sa[3], sa[1]
1950        .cf_call routine2
1951        s_swappc_b64 s[0:1], s[2:3]
1952       
1953        .cf_call routine
1954        s_swappc_b64 s[0:1], s[2:3]
1955        s_endpgm
1956       
1957routine:
1958        s_xor_b32 sa[2], sa[2], sa[0]
1959        s_xor_b32 sa[3], sa[3], sa[1]
1960        s_cbranch_scc1 aa0
1961       
1962        s_xor_b32 sa[2], sa[2], sa[0]
1963        s_xor_b32 sa[3], sa[3], sa[1]
1964        .cf_ret
1965        s_setpc_b64 s[0:1]
1966       
1967aa0:    s_xor_b32 sa[2], sa[2], sa[0]
1968        s_xor_b32 sa[3], sa[3], sa[1]
1969        .cf_ret
1970        s_setpc_b64 s[0:1]
1971       
1972routine2:
1973        s_and_b32 sa[2], sa[2], sa[0]
1974        s_xor_b32 sa[3], sa[3], sa[1]
1975        s_cbranch_scc1 aa1
1976       
1977        s_xor_b32 sa[2], sa[2], sa[0]
1978        s_and_b32 sa[3], sa[3], sa[1]
1979        .cf_ret
1980        s_setpc_b64 s[0:1]
1981       
1982aa1:    s_and_b32 sa[2], sa[2], sa[0]
1983        s_xor_b32 sa[3], sa[3], sa[1]
1984        .cf_ret
1985        s_setpc_b64 s[0:1]
1986)ffDXD",
1987        {
1988            {   // block 0 - start
1989                0, 12,
1990                { { 4, true } },
1991                {
1992                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1993                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1994                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1995                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1996                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1997                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1998                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1999                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2000                }, true, false, false },
2001            {   // block 1 - after routine call
2002                12, 24,
2003                { { 7, true } },
2004                {
2005                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2006                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2007                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2008                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2009                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2010                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2011                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2012                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
2013                }, true, false, false },
2014            {   // block 2 - after routine2 call
2015                24, 28,
2016                { { 4, true } },
2017                {
2018                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2019                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2020                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2021                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
2022                }, true, false, false },
2023            {   // block 3 - end
2024                28, 32,
2025                { },
2026                { },
2027                false, false, true },
2028            {   // block 4 - routine
2029                32, 44,
2030                { { 5, false }, { 6, false } },
2031                {
2032                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2033                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2034                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2035                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
2036                }, false, false, false },
2037            {   // block 5 - first fork
2038                44, 56,
2039                { },
2040                {
2041                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2042                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2043                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2044                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2045                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2046                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2047                }, false, true, true },
2048            {   // block 6 - aa0 - second fork
2049                56, 68,
2050                { },
2051                {
2052                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2053                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2054                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2055                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2056                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2057                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
2058                }, false, true, true },
2059            {   // block 7 - routine2
2060                68, 80,
2061                { { 8, false }, { 9, false } },
2062                {
2063                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2064                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2065                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2066                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) }
2067                }, false, false, false },
2068            {   // block 8 - first fork
2069                80, 92,
2070                { },
2071                {
2072                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2073                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2074                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2075                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2076                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2077                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) }
2078                }, false, true, true },
2079            {   // block 9 - aa1 - second fork
2080                92, 104,
2081                { },
2082                {
2083                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2084                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2085                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2086                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2087                    { { "sa", 2 }, SSAInfo(6, 8, 8, 8, 1, true) },
2088                    { { "sa", 3 }, SSAInfo(6, 8, 8, 8, 1, true) }
2089                }, false, true, true }
2090        },
2091        {   // SSA replaces
2092            { { "sa", 2 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } },
2093            { { "sa", 3 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } }
2094        },
2095        true, ""
2096    },
2097    {   // 11 - routine with complex loop used twice
2098        R"ffDXD(.regvar sa:s:10, va:v:8
2099        s_mov_b32 sa[2], s4
2100        s_mov_b32 sa[3], s5
2101        s_mov_b32 sa[4], s6
2102        s_mov_b32 sa[5], s7
2103        s_mov_b32 sa[6], s8
2104        .cf_call routine
2105        s_swappc_b64 s[0:1], s[2:3]
2106       
2107        s_xor_b32 sa[2], sa[2], sa[0]
2108        s_xor_b32 sa[3], sa[3], sa[0]
2109        s_xor_b32 sa[4], sa[4], sa[1]
2110        s_xor_b32 sa[5], sa[5], sa[1]
2111        s_xor_b32 sa[6], sa[6], sa[0]
2112        s_endpgm
2113       
2114routine:
2115        s_xor_b32 sa[2], sa[2], sa[0]
2116        s_xor_b32 sa[3], sa[3], sa[0]
2117        s_xor_b32 sa[5], sa[5], sa[0]
2118        s_cbranch_vccz  subr1
2119       
2120loop0:  s_xor_b32 sa[2], sa[2], sa[0]
2121        s_cbranch_scc0 end1
2122       
2123        s_xor_b32 sa[3], sa[3], sa[0]
2124        s_cbranch_scc0 end2
2125       
2126        s_xor_b32 sa[4], sa[4], sa[1]
2127        s_cbranch_scc0 end3
2128       
2129        s_xor_b32 sa[5], sa[5], sa[1]
2130        s_branch loop0
2131       
2132end1:   s_xor_b32 sa[2], sa[2], sa[0]
2133        .cf_ret
2134        s_setpc_b64 s[0:1]
2135
2136end2:   s_xor_b32 sa[3], sa[3], sa[0]
2137        .cf_ret
2138        s_setpc_b64 s[0:1]
2139
2140end3:   s_xor_b32 sa[4], sa[4], sa[0]
2141        .cf_ret
2142        s_setpc_b64 s[0:1]
2143
2144subr1:
2145        s_xor_b32 sa[2], sa[2], sa[0]
2146        s_xor_b32 sa[3], sa[3], sa[0]
2147        s_xor_b32 sa[4], sa[4], sa[0]
2148        s_xor_b32 sa[5], sa[5], sa[1]
2149        s_xor_b32 sa[6], sa[6], sa[0]
2150        s_cbranch_execnz loop0
2151
2152swubr2:
2153        s_xor_b32 sa[2], sa[2], sa[0]
2154        s_xor_b32 sa[3], sa[3], sa[0]
2155        s_xor_b32 sa[4], sa[4], sa[1]
2156        s_xor_b32 sa[5], sa[5], sa[1]
2157        s_xor_b32 sa[6], sa[6], sa[0]
2158        .cf_ret
2159        s_setpc_b64 s[0:1]
2160)ffDXD",
2161        {
2162            {   // block 0 - start
2163                0, 24,
2164                { { 2, true } },
2165                {
2166                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2167                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2168                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2169                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2170                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2171                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2172                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2173                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2174                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2175                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2176                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2177                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2178                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2179                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
2180                }, true, false, false },
2181            {   // block 1 - end
2182                24, 48,
2183                { },
2184                {
2185                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2186                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2187                    { { "sa", 2 }, SSAInfo(3, 7, 7, 7, 1, true) },
2188                    { { "sa", 3 }, SSAInfo(2, 7, 7, 7, 1, true) },
2189                    { { "sa", 4 }, SSAInfo(1, 6, 6, 6, 1, true) },
2190                    { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) },
2191                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
2192                }, false, false, true },
2193            {   // block 2 - routine
2194                48, 64,
2195                { { 3, false }, { 10, false } },
2196                {
2197                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2198                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2199                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2200                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2201                }, false, false, false },
2202            {   // block 3 - loop0
2203                64, 72,
2204                { { 4, false }, { 7, false } },
2205                {
2206                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2207                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2208                }, false, false, false },
2209            {   // block 4 - to end2
2210                72, 80,
2211                { { 5, false }, { 8, false } },
2212                {
2213                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2214                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2215                }, false, false, false },
2216            {   // block 5 - to end3
2217                80, 88,
2218                { { 6, false }, { 9, false } },
2219                {
2220                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2221                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2222                }, false, false, false },
2223            {   // block 6 - loop end
2224                88, 96,
2225                { { 3, false } },
2226                {
2227                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2228                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
2229                }, false, false, true },
2230            {   // block 7 - end1
2231                96, 104,
2232                { },
2233                {
2234                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2235                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2236                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2237                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2238                }, false, true, true },
2239            {   // block 8 - end2
2240                104, 112,
2241                { },
2242                {
2243                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2244                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2245                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2246                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2247                }, false, true, true },
2248            {   // block 9 - end3
2249                112, 120,
2250                { },
2251                {
2252                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2253                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2254                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2255                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2256                }, false, true, true },
2257            {   // block 10 - subr1
2258                120, 144,
2259                { { 3, false }, { 11, false } },
2260                {
2261                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2262                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2263                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
2264                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
2265                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2266                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
2267                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2268                }, false, false, false },
2269            {   // block 11 - subr2
2270                144, 168,
2271                { },
2272                {
2273                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2274                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2275                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2276                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2277                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2278                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
2279                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
2280                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
2281                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) }
2282                }, false, true, true }
2283        },
2284        {   // SSA replaces
2285            { { "sa", 2 }, { { 4, 3 }, { 6, 3 }, { 3, 2 }, { 5, 2 } } },
2286            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 } } },
2287            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
2288            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 } } },
2289            { { "sa", 6 }, { { 2, 1 }, { 3, 1 } } }
2290        },
2291        true, ""
2292    },
2293    { nullptr }
2294};
Note: See TracBrowser for help on using the repository browser.