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

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

CLRadeonExtender: AsmRegAlloc?: Fixed infinite recursion if forks/join encountered inside loop inside routine.
Enable tescase with routine with loop with fork/join.

File size: 92.6 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2018 Mateusz Szpakowski
4 *
5 *  This library is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Lesser General Public
7 *  License as published by the Free Software Foundation; either
8 *  version 2.1 of the License, or (at your option) any later version.
9 *
10 *  This library is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 *  Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public
16 *  License along with this library; if not, write to the Free Software
17 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20#include <CLRX/Config.h>
21#include <CLRX/utils/Utilities.h>
22#include <CLRX/amdasm/Assembler.h>
23#include <CLRX/utils/Containers.h>
24#include "../TestUtils.h"
25#include "AsmRegAlloc.h"
26
27const AsmSSADataCase ssaDataTestCases2Tbl[] =
28{
29    {   // 0 - conflicts inside routines
30        R"ffDXD(.regvar sa:s:8, va:v:8
31        s_mov_b32 sa[2], s4
32        s_mov_b32 sa[3], s5
33        s_mov_b32 sa[4], s6
34        s_cbranch_scc1 aa0
35       
36        s_getpc_b64 s[2:3]
37        s_add_u32 s2, s2, routine1-.
38        s_add_u32 s3, s3, routine1-.+4
39        .cf_call routine1
40        s_swappc_b64 s[0:1], s[2:3]
41       
42        s_and_b32 sa[5], sa[5], s0
43       
44aa0:    s_getpc_b64 s[2:3]
45        s_add_u32 s2, s2, routine2-.
46        s_add_u32 s3, s3, routine2-.+4
47        .cf_call routine2
48        s_swappc_b64 s[0:1], s[2:3]
49       
50        s_lshr_b32 sa[2], sa[2], 2
51        s_min_u32 sa[2], sa[2], sa[3]
52        s_lshr_b32 sa[3], sa[3], 2
53        s_endpgm
54       
55routine1:
56        s_xor_b32 sa[2], sa[2], sa[6]
57        s_xor_b32 sa[3], sa[3], sa[6]
58        s_cbranch_scc1 bb1
59       
60        s_min_u32 sa[2], sa[2], sa[6]
61        s_and_b32 sa[4], sa[4], sa[6]
62        .cf_ret
63        s_setpc_b64 s[0:1]
64       
65bb1:    s_and_b32 sa[2], sa[2], sa[6]
66        s_and_b32 sa[4], sa[4], sa[6]
67        .cf_ret
68        s_setpc_b64 s[0:1]
69       
70routine2:
71        s_xor_b32 sa[2], sa[2], sa[6]
72        s_xor_b32 sa[3], sa[3], sa[6]
73        s_cbranch_scc1 bb2
74       
75        s_min_u32 sa[2], sa[2], sa[6]
76        s_max_u32 sa[4], sa[4], sa[6]
77        .cf_ret
78        s_setpc_b64 s[0:1]
79       
80bb2:    s_and_b32 sa[3], sa[3], sa[6]
81        .cf_ret
82        s_setpc_b64 s[0:1]
83)ffDXD",
84        {
85            // block 0 - start
86            { 0, 16,
87                { { 1, false }, { 3, false } },
88                {
89                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
90                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
91                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
92                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
93                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
94                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
95                }, false, false, false },
96            // block 1 - call routine1
97            { 16, 40,
98                { { 5, true } },
99                {
100                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
101                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
102                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
103                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
104                }, true, false, false },
105            // block 2 - before aa0
106            { 40, 44,
107                { },
108                {
109                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
110                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) }
111                }, false, false, false },
112            // block 3 - aa0
113            { 44, 68,
114                { { 8, true } },
115                {
116                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
117                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
118                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
119                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
120                }, true, false, false },
121            // block 4 - end
122            { 68, 84,
123                { },
124                {
125                    { { "sa", 2 }, SSAInfo(5, 7, 7, 8, 2, true) },
126                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
127                }, false, false, true },
128            // block 5 - routine1
129            { 84, 96,
130                { { 6, false }, { 7, false } },
131                {
132                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
133                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
134                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
135                }, false, false, false },
136            // block 6 - routine1 way 1
137            { 96, 108,
138                { },
139                {
140                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
141                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
142                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
143                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
144                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
145                }, false, true, true },
146            // block 7 - routine1 way 2
147            { 108, 120,
148                { },
149                {
150                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
151                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
152                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
153                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
154                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
155                }, false, true, true },
156            // block 8 - routine 2
157            { 120, 132,
158                { { 9, false }, { 10, false } },
159                {
160                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
161                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
162                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
163                }, false, false, false },
164            // block 9 - routine 2 way 0
165            { 132, 144,
166                { },
167                {
168                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
169                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
170                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
171                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
172                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
173                }, false, true, true },
174            // block 10 - routine 2 way 1
175            { 144, 152,
176                { },
177                {
178                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
179                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
180                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
181                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
182                }, false, true, true }
183        },
184        {   // SSA replaces
185            { { "sa", 2 }, { { 4, 3 }, { 6, 5 }, { 3, 1 } } },
186            { { "sa", 3 }, { { 4, 3 }, { 2, 1 } } },
187            { { "sa", 4 }, { { 3, 2 }, { 2, 1 } } }
188        },
189        true, ""
190    },
191    {  // 1 - res second point cache test 1
192        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
193        s_mov_b32 sa[2], s4
194        s_mov_b32 sa[3], s5
195        s_mov_b32 sa[4], s6
196        .cf_cjump aa0, bb0, cc0
197        s_setpc_b64 s[0:1]
198       
199        s_mov_b32 sa[3], s3
200        s_mov_b32 sa[6], s3
201        s_branch mainx
202       
203aa0:    s_mov_b32 sa[2], s2
204        s_mov_b32 sa[6], s2
205        s_cbranch_scc0 mainx
206       
207        s_mov_b32 sa[4], s5
208        s_branch mainx
209
210bb0:    v_mov_b32 va[3], 4
211        v_mov_b32 va[2], v6
212        s_cbranch_scc0 mainy
213       
214        v_mov_b32 va[0], v6
215        v_mov_b32 va[4], v6
216        s_branch mainy
217       
218cc0:    s_mov_b32 xa[3], 4
219        s_mov_b32 xa[4], 4
220        s_cbranch_scc0 mainz
221       
222        s_mov_b32 xa[0], s6
223        s_mov_b32 xa[3], s6
224        s_cbranch_scc0 mainz
225       
226        s_mov_b32 xa[0], s6
227       
228mainx:
229        s_add_u32 sa[2], sa[2], sa[7]
230        s_add_u32 sa[3], sa[3], sa[7]
231        s_sub_u32 sa[4], sa[4], sa[7]
232        s_add_u32 sa[5], sa[5], sa[7]
233       
234        v_xor_b32 va[2], va[2], va[1]
235        s_add_u32 xa[0], xa[0], xa[7]
236        s_cbranch_scc0 mainz
237       
238mainy:
239        v_xor_b32 va[0], va[0], va[1]
240        v_xor_b32 va[2], va[2], va[1]
241        v_xor_b32 va[3], va[3], va[1]
242        v_xor_b32 va[4], va[4], va[1]
243        s_endpgm
244       
245mainz:
246        s_add_u32 xa[0], xa[0], xa[7]
247        s_add_u32 xa[3], xa[3], xa[7]
248        s_sub_u32 xa[4], xa[4], xa[7]
249        s_add_u32 xa[5], xa[5], xa[7]
250        s_add_u32 sa[6], sa[6], sa[7]
251        s_add_u32 sa[3], sa[3], sa[7]
252        s_sub_u32 sa[4], sa[4], sa[7]
253        s_add_u32 sa[5], sa[5], sa[7]
254        s_endpgm
255)ffDXD",
256        {
257            {   // block 0 - start
258                0, 16,
259                { { 1, false }, { 2, false }, { 4, false }, { 6, false } },
260                {
261                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
262                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
263                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
264                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
265                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
266                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
267                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
268                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
269                }, false, false, false },
270            {   // block 1 - before aa0
271                16, 28,
272                { { 9, false } },
273                {
274                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
275                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
276                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
277                }, false, false, true },
278            {   // block 2 - aa0
279                28, 40,
280                { { 3, false }, { 9, false } },
281                {
282                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
283                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, false) },
284                    { { "sa", 6 }, SSAInfo(0, 3, 3, 3, 1, false) }
285                }, false, false, false },
286            {   // block 3 - after aa0
287                40, 48,
288                { { 9, false } },
289                {
290                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
291                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) }
292                }, false, false, true },
293            {   // block 4 - bb0
294                48, 60,
295                { { 5, false }, { 10, false } },
296                {
297                    { { "", 256+6 }, SSAInfo(0, 0, 0, 0, 0, true) },
298                    { { "va", 2 }, SSAInfo(0, 3, 3, 3, 1, false) },
299                    { { "va", 3 }, SSAInfo(0, 2, 2, 2, 1, false) }
300                }, false, false, false },
301            {   // block 5 - after bb0
302                60, 72,
303                { { 10, false } },
304                {
305                    { { "", 256+6 }, SSAInfo(0, 0, 0, 0, 0, true) },
306                    { { "va", 0 }, SSAInfo(0, 2, 2, 2, 1, false) },
307                    { { "va", 4 }, SSAInfo(0, 2, 2, 2, 1, false) }
308                }, false, false, true },
309            {   // block 6 - cc0
310                72, 84,
311                { { 7, false }, { 11, false } },
312                {
313                    { { "xa", 3 }, SSAInfo(0, 2, 2, 2, 1, false) },
314                    { { "xa", 4 }, SSAInfo(0, 2, 2, 2, 1, false) }
315                }, false, false, false },
316            {   // block 7 - after cc0
317                84, 96,
318                { { 8, false }, { 11, false } },
319                {
320                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
321                    { { "xa", 0 }, SSAInfo(0, 3, 3, 3, 1, false) },
322                    { { "xa", 3 }, SSAInfo(2, 3, 3, 3, 1, false) }
323                }, false, false, false },
324            {   // block 8 - before mainx
325                96, 100,
326                { },
327                {
328                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
329                    { { "xa", 0 }, SSAInfo(3, 4, 4, 4, 1, false) }
330                }, false, false, false },
331            {   // block 9 - mainx
332                100, 128,
333                { { 10, false }, { 11, false } },
334                {
335                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
336                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
337                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
338                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) },
339                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
340                    { { "va", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
341                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, true) },
342                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
343                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
344                }, false, false, false },
345            {   // block 10 - mainy
346                128, 148,
347                { },
348                {
349                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
350                    { { "va", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
351                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
352                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, true) },
353                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
354                }, false, false, true },
355            {   // block 11 - mainz
356                148, 184,
357                { },
358                {
359                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
360                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
361                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
362                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
363                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
364                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
365                    { { "xa", 3 }, SSAInfo(0, 1, 1, 1, 1, true) },
366                    { { "xa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) },
367                    { { "xa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) },
368                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
369                }, false, false, true },
370        },
371        {   // SSA replaces
372            { { "sa", 2 }, { { 3, 1 } } },
373            { { "sa", 3 }, { { 2, 1 }, { 3, 1 } } },
374            { { "sa", 4 }, { { 4, 1 }, { 2, 1 } } },
375            { { "sa", 6 }, { { 3, 1 }, } },
376            { { "va", 0 }, { { 2, 0 } } },
377            { { "va", 2 }, { { 3, 1 }, } },
378            { { "va", 3 }, { { 2, 0 } } },
379            { { "va", 4 }, { { 2, 0 } } },
380            { { "xa", 0 }, { { 4, 0 }, { 3, 1 } } },
381            { { "xa", 3 }, { { 3, 0 }, { 2, 0 } } },
382            { { "xa", 4 }, { { 2, 0 } } }
383        },
384        true, ""
385    },
386    {   // 2 - cache test 2: loop
387        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
388        s_mov_b32 sa[2], s4
389        s_mov_b32 sa[3], s5
390        s_mov_b32 sa[4], s6
391        s_mov_b32 sa[5], s7
392        s_mov_b32 xa[0], s4
393        .cf_cjump aa0, aa1, aa2, aa3
394        s_setpc_b64 s[0:1]
395       
396loop:   s_xor_b32 sa[2], sa[2], sa[7]
397        s_xor_b32 xa[0], xa[0], xa[7]
398       
399l1:     s_xor_b32 sa[3], sa[3], sa[7]
400        s_xor_b32 xa[0], xa[0], xa[7]
401       
402l2:     s_xor_b32 sa[4], sa[4], sa[7]
403        s_xor_b32 xa[0], xa[0], xa[7]
404
405l3:     s_xor_b32 sa[5], sa[5], sa[7]
406        s_xor_b32 xa[0], xa[0], xa[7]
407        s_cbranch_scc0 loop
408       
409        s_endpgm
410       
411aa0:    s_xor_b32 sa[5], sa[5], sa[7]
412        s_xor_b32 xa[0], xa[0], xa[7]
413        s_branch loop
414
415aa1:    s_xor_b32 sa[2], sa[2], sa[7]
416        s_xor_b32 xa[0], xa[0], xa[7]
417        s_branch l1
418
419aa2:    s_xor_b32 sa[3], sa[3], sa[7]
420        s_xor_b32 xa[0], xa[0], xa[7]
421        s_branch l2
422
423aa3:    s_xor_b32 sa[4], sa[4], sa[7]
424        s_xor_b32 xa[0], xa[0], xa[7]
425        s_branch l3
426)ffDXD",
427        {
428            {   // block 0 - start
429                0, 24,
430                { { 1, false }, { 6, false }, { 7, false }, { 8, false }, { 9, false } },
431                {
432                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
433                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
434                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
435                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
436                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
437                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
438                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
439                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
440                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
441                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
442                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) }
443                }, false, false, false },
444            {   // block 1 - loop
445                24, 32,
446                { },
447                {
448                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
449                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
450                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
451                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
452                }, false, false, false },
453            {   // block 2 - l1
454                32, 40,
455                { },
456                {
457                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
458                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
459                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
460                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
461                }, false, false, false },
462            {   // block 3 - l2
463                40, 48,
464                { },
465                {
466                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
467                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
468                    { { "xa", 0 }, SSAInfo(3, 4, 4, 4, 1, true) },
469                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
470                }, false, false, false },
471            {   // block 4 - l3
472                48, 60,
473                { { 1, false }, { 5, false } },
474                {
475                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
476                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
477                    { { "xa", 0 }, SSAInfo(4, 5, 5, 5, 1, true) },
478                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
479                }, false, false, false },
480            {   // block 5 - end
481                60, 64,
482                { },
483                { }, false, false, true },
484            {   // block 6 - aa0
485                64, 76,
486                { { 1, false } },
487                {
488                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
489                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
490                    { { "xa", 0 }, SSAInfo(1, 6, 6, 6, 1, true) },
491                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
492                }, false, false, true },
493            {   // block 7 - aa1
494                76, 88,
495                { { 2, false } },
496                {
497                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) },
498                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
499                    { { "xa", 0 }, SSAInfo(1, 7, 7, 7, 1, true) },
500                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
501                }, false, false, true },
502            {   // block 9 - aa2
503                88, 100,
504                { { 3, false } },
505                {
506                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
507                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
508                    { { "xa", 0 }, SSAInfo(1, 8, 8, 8, 1, true) },
509                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
510                }, false, false, true },
511            {   // block 10 - aa3
512                100, 112,
513                { { 4, false } },
514                {
515                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
516                    { { "sa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
517                    { { "xa", 0 }, SSAInfo(1, 9, 9, 9, 1, true) },
518                    { { "xa", 7 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
519                }, false, false, true }
520        },
521        {   // SSA replaces
522            { { "sa", 2 }, { { 2, 1 }, { 3, 1 } } },
523            { { "sa", 3 }, { { 2, 1 }, { 3, 1 } } },
524            { { "sa", 4 }, { { 2, 1 }, { 3, 1 } } },
525            { { "sa", 5 }, { { 2, 1 }, { 3, 1 } } },
526            { { "xa", 0 }, { { 5, 1 }, { 6, 1 }, { 7, 2 }, { 8, 3 }, { 9, 4 } } }
527        },
528        true, ""
529    },
530    {   // 3 - routine with loop
531        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
532        s_mov_b32 sa[2], s4
533        s_mov_b32 sa[3], s5
534        s_mov_b32 sa[4], s6
535        s_mov_b32 sa[5], s7
536       
537        .cf_call routine
538        s_swappc_b64 s[0:1], s[2:3]
539       
540        s_xor_b32 sa[5], sa[5], sa[0]
541        s_xor_b32 sa[2], sa[2], sa[0]
542       
543        .cf_call routine
544        s_swappc_b64 s[0:1], s[2:3]
545       
546        s_endpgm
547       
548routine:
549        s_add_u32 sa[2], sa[2], sa[0]
550        s_add_u32 sa[3], sa[3], sa[1]
551       
552loop0:
553        s_add_u32 sa[4], sa[3], sa[0]
554        s_add_u32 sa[5], sa[3], sa[5]
555        s_cbranch_scc1 j1
556       
557j0:     s_add_u32 sa[2], sa[3], sa[0]
558        s_branch loopend
559
560j1:     s_add_u32 sa[5], sa[2], sa[0]
561
562loopend:
563        s_add_u32 sa[5], sa[5], sa[1]
564        s_cbranch_scc0 loop0
565       
566        s_add_u32 sa[5], sa[5], sa[0]
567        s_add_u32 sa[3], sa[3], sa[1]
568        .cf_ret
569        s_setpc_b64 s[0:1]
570)ffDXD",
571        {
572            {   // block 0 - start
573                0, 20,
574                { { 3, true } },
575                {
576                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
577                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
578                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
579                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
580                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
581                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
582                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
583                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
584                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
585                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
586                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
587                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
588                }, true, false, false },
589            {   // block 1 - before second call
590                20, 32,
591                { { 3, true } },
592                {
593                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
594                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
595                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
596                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
597                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
598                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
599                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) }
600                }, true, false, false },
601            {   // block 2 - end
602                32, 36,
603                { },
604                { }, false, false, true },
605            {   // block 3 - routine
606                36, 44,
607                { },
608                {
609                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
610                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
611                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
612                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
613                }, false, false, false },
614            {   // block 4 - loop
615                44, 56,
616                { { 5, false }, { 6, false } },
617                {
618                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
619                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
620                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
621                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
622                },
623                false, false, false },
624            {   // block 5 - j0
625                56, 64,
626                { { 7, false } },
627                {
628                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
629                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
630                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) }
631                }, false, false, true },
632            {   // block 6 - j1
633                64, 68,
634                { },
635                {
636                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
637                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
638                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, false) }
639                }, false, false, false },
640            {   // block 7 - loopend
641                68, 76,
642                { { 4, false }, { 8, false } },
643                {
644                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
645                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
646                }, false, false, false },
647            {   // block 8 - routine end
648                76, 88,
649                { },
650                {
651                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
652                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
653                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
654                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
655                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
656                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
657                }, false, true, true }
658        },
659        {   // SSA replaces
660            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
661            { { "sa", 5 }, { { 3, 1 }, { 5, 2 }, { 6, 1 } } }
662        },
663        true, ""
664    },
665    {   // 4 - routine with condition
666        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
667        s_mov_b32 sa[2], s4
668        s_mov_b32 sa[3], s5
669        s_mov_b32 sa[4], s6
670        s_mov_b32 sa[5], s7
671       
672        .cf_call routine
673        s_swappc_b64 s[0:1], s[2:3]
674       
675        s_xor_b32 sa[5], sa[5], sa[0]
676        s_xor_b32 sa[2], sa[2], sa[0]
677       
678        .cf_call routine
679        s_swappc_b64 s[0:1], s[2:3]
680       
681        s_endpgm
682       
683routine:
684        s_add_u32 sa[2], sa[2], sa[0]
685        s_add_u32 sa[3], sa[3], sa[1]
686       
687        s_add_u32 sa[4], sa[3], sa[0]
688        s_add_u32 sa[5], sa[3], sa[5]
689        s_cbranch_scc1 j1
690       
691j0:     s_add_u32 sa[2], sa[3], sa[0]
692        s_add_u32 sa[4], sa[3], sa[1]
693        s_branch rend
694
695j1:     s_add_u32 sa[5], sa[2], sa[0]
696        s_add_u32 sa[4], sa[3], sa[1]
697
698rend:
699        s_add_u32 sa[5], sa[5], sa[0]
700        s_add_u32 sa[3], sa[3], sa[1]
701        .cf_ret
702        s_setpc_b64 s[0:1]
703)ffDXD",
704        {
705            {   // block 0 - start
706                0, 20,
707                { { 3, true } },
708                {
709                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
710                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
711                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
712                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
713                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
714                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
715                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
716                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
717                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
718                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
719                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
720                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
721                }, true, false, false },
722            {   // block 1 - before second call
723                20, 32,
724                { { 3, true } },
725                {
726                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
727                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
728                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
729                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
730                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
731                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
732                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
733                }, true, false, false },
734            {   // block 2 - end
735                32, 36,
736                { },
737                { }, false, false, true },
738            {   // block 3 - routine
739                36, 56,
740                { { 4, false }, { 5, false } },
741                {
742                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
743                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
744                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
745                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
746                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
747                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
748                }, false, false, false },
749            {   // block 4 - j0
750                56, 68,
751                { { 6, false } },
752                {
753                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
754                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
755                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
756                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
757                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, false) }
758                },
759                false, false, true },
760            {   // block 5 - j1
761                68, 76,
762                { },
763                {
764                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
765                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
766                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
767                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
768                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, false) },
769                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, false) }
770                }, false, false, false },
771            {   // block 6 - end
772                76, 88,
773                { },
774                {
775                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
776                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
777                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
778                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
779                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
780                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
781                }, false, true, true }
782        },
783        {   // SSA replaces
784            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
785            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
786        },
787        true, ""
788    },
789    {   // 5 - two routines with common code
790        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
791        s_mov_b32 sa[2], s4
792        s_mov_b32 sa[3], s5
793        s_mov_b32 sa[4], s6
794        s_mov_b32 sa[5], s7
795        s_mov_b32 sa[6], s8
796        s_mov_b32 xa[0], s9
797        s_mov_b32 xa[1], s10
798       
799        .cf_call routine1
800        s_swappc_b64 s[0:1], s[2:3]
801       
802        s_xor_b32 sa[5], sa[5], sa[0]
803        s_xor_b32 sa[2], sa[2], sa[0]
804       
805        .cf_call routine2
806        s_swappc_b64 s[0:1], s[2:3]
807       
808        s_xor_b32 sa[5], sa[5], sa[0]
809        s_xor_b32 sa[2], sa[2], sa[0]
810        s_xor_b32 sa[6], sa[6], sa[0]
811        s_xor_b32 xa[0], xa[0], sa[0]
812        s_xor_b32 xa[1], xa[1], sa[0]
813        s_endpgm
814       
815routine1:
816        s_add_u32 sa[2], sa[2], sa[0]
817        s_add_u32 sa[3], sa[3], sa[1]
818       
819        s_add_u32 sa[4], sa[3], sa[0]
820        s_add_u32 sa[5], sa[3], sa[5]
821        s_add_u32 sa[6], sa[6], sa[1]
822       
823        s_xor_b32 xa[1], xa[1], sa[0]
824       
825common:
826        s_add_u32 sa[5], sa[5], sa[0]
827        s_add_u32 sa[3], sa[3], sa[1]
828        s_xor_b32 sa[4], sa[4], sa[2]
829        .cf_ret
830        s_setpc_b64 s[0:1]
831
832routine2:
833        s_add_u32 sa[2], sa[2], sa[0]
834        s_add_u32 sa[3], sa[3], sa[1]
835       
836        s_add_u32 sa[4], sa[1], sa[2]
837        s_add_u32 sa[5], sa[3], sa[5]
838       
839        s_xor_b32 xa[0], xa[0], sa[0]
840        s_branch common
841)ffDXD",
842        {
843            {   // block 0 - start
844                0, 32,
845                { { 3, true } },
846                {
847                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
848                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
849                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
850                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
851                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
852                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
853                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
854                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
855                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
856                    { { "", 9 }, SSAInfo(0, 0, 0, 0, 0, true) },
857                    { { "", 10 }, SSAInfo(0, 0, 0, 0, 0, true) },
858                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
859                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
860                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
861                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
862                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
863                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
864                    { { "xa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
865                }, true, false, false },
866            {   // block 1 - after routine1 call
867                32, 44,
868                { { 5, true } },
869                {
870                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
871                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
872                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
873                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
874                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
875                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
876                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
877                }, true, false, false },
878            {   // block 2 - after routine2 call
879                44, 68,
880                { },
881                {
882                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
883                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
884                    { { "sa", 5 }, SSAInfo(3, 6, 6, 6, 1, true) },
885                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) },
886                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
887                    { { "xa", 1 }, SSAInfo(2, 3, 3, 3, 1, true) }
888                }, false, false, true },
889            {   // block 3 - routine1
890                68, 92,
891                { },
892                {
893                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
894                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
895                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
896                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
897                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
898                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
899                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
900                    { { "xa", 1 }, SSAInfo(1, 2, 2, 2, 1, true) }
901                }, false, false, false },
902            {   // block 4 - common part
903                92, 108,
904                { },
905                {
906                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
907                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
908                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
909                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
910                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
911                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
912                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
913                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
914                }, false, true, true },
915            {   // block 5 - routine2
916                108, 132,
917                { { 4, false } },
918                {
919                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
920                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
921                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
922                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
923                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) },
924                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
925                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) }
926                }, false, false, true }
927        },
928        {   // SSA replaces
929            { { "sa", 2 }, { { 4, 2 } } },
930            { { "sa", 3 }, { { 4, 2 } } },
931            { { "sa", 4 }, { { 4, 2 } } },
932            { { "sa", 5 }, { { 5, 2 } } }
933        },
934        true, ""
935    },
936    {   // 6 - simple call, more complex routine (reduce with reads)
937        R"ffDXD(.regvar sa:s:8, va:v:8
938        s_mov_b32 sa[2], s4
939        s_mov_b32 sa[3], s5
940        s_mov_b32 sa[5], s6
941        s_mov_b32 sa[6], s7
942       
943        s_getpc_b64 s[2:3]
944        s_add_u32 s2, s2, routine-.
945        s_add_u32 s3, s3, routine-.+4
946        .cf_call routine
947        s_swappc_b64 s[0:1], s[2:3]
948       
949        s_lshl_b32 sa[2], sa[2], 3
950        s_lshl_b32 sa[3], sa[3], 4
951        s_lshl_b32 sa[5], sa[5], 4
952        s_lshl_b32 sa[6], sa[6], 4
953        s_endpgm
954       
955routine:
956        s_xor_b32 sa[2], sa[2], sa[4]
957        s_xor_b32 sa[3], sa[3], sa[4]
958        s_cbranch_scc1 bb1
959       
960        s_min_u32 sa[2], sa[2], sa[4]
961        s_min_u32 sa[3], sa[3], sa[4]
962        s_xor_b32 sa[5], sa[5], sa[4]
963        .cf_ret
964        s_setpc_b64 s[0:1]
965       
966bb1:    s_and_b32 sa[2], sa[2], sa[4]
967        s_and_b32 sa[3], sa[3], sa[4]
968        s_xor_b32 sa[6], sa[6], sa[4]
969        .cf_ret
970        s_setpc_b64 s[0:1]
971)ffDXD",
972        {
973            { 0, 40,
974                { { 2, true } },
975                {
976                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
977                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
978                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
979                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
980                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
981                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
982                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
983                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
984                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
985                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
986                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
987                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
988                }, true, false, false },
989            // block 1 - after call
990            { 40, 60,
991                { },
992                {
993                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
994                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
995                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
996                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
997                }, false, false, true },
998            // block 2 - routine
999            { 60, 72,
1000                { { 3, false }, { 4, false } },
1001                {
1002                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1003                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
1004                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1005                }, false, false, false },
1006            // block 3 - first return
1007            { 72, 88,
1008                { },
1009                {
1010                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1011                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1012                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1013                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1014                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1015                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
1016                }, false, true, true },
1017            // block 4 - second return
1018            { 88, 104,
1019                { },
1020                {
1021                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1022                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1023                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1024                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1025                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1026                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1027                }, false, true, true }
1028        },
1029        {   // SSA replaces
1030            { { "sa", 2 }, { { 4, 3 } } },
1031            { { "sa", 3 }, { { 4, 3 } } },
1032            { { "sa", 5 }, { { 2, 1 } } },
1033            { { "sa", 6 }, { { 2, 1 } } }
1034        },
1035        true, ""
1036    },
1037    {   // 7 - retssa tests
1038        R"ffDXD(.regvar sa:s:8, va:v:8
1039        s_mov_b32 sa[2], s4
1040        s_mov_b32 sa[3], s5
1041        s_mov_b32 sa[4], s6
1042        s_mov_b32 sa[5], s6
1043        s_mov_b32 sa[6], s7
1044        s_mov_b32 sa[7], s7
1045       
1046        .cf_call routine
1047        s_swappc_b64 s[0:1], s[2:3]
1048       
1049        s_lshl_b32 sa[2], sa[2], 3
1050        s_lshl_b32 sa[3], sa[1], 4
1051        s_cbranch_scc1 aa1
1052       
1053aa0:    s_lshl_b32 sa[5], sa[1], 4
1054        s_lshl_b32 sa[4], sa[1], 4
1055        s_branch ca0
1056       
1057aa1:    s_lshl_b32 sa[6], sa[1], 4
1058        s_lshl_b32 sa[3], sa[3], 4
1059        s_lshl_b32 sa[5], sa[1], 4
1060       
1061ca0:    .cf_call routine
1062        s_swappc_b64 s[0:1], s[2:3]
1063
1064        s_lshl_b32 sa[6], sa[3], 4
1065        s_lshl_b32 sa[6], sa[4], 4
1066        s_cbranch_execz aa3
1067       
1068aa2:    s_lshr_b32 sa[7], sa[1], 4
1069        s_endpgm
1070       
1071aa3:    s_ashr_i32 sa[7], sa[7], 4
1072        s_endpgm
1073       
1074routine:
1075        s_xor_b32 sa[2], sa[2], sa[0]
1076        s_xor_b32 sa[3], sa[3], sa[0]
1077        .cf_cjump bb1, bb2
1078        s_setpc_b64 s[0:1]
1079       
1080bb0:    s_min_u32 sa[2], sa[2], sa[0]
1081        s_min_u32 sa[3], sa[3], sa[0]
1082        s_max_u32 sa[4], sa[4], sa[0]
1083        s_xor_b32 sa[5], sa[5], sa[0]
1084        s_xor_b32 sa[6], sa[6], sa[0]
1085        s_xor_b32 sa[7], sa[7], sa[0]
1086        .cf_ret
1087        s_setpc_b64 s[0:1]
1088       
1089bb1:    s_and_b32 sa[2], sa[2], sa[0]
1090        s_and_b32 sa[3], sa[3], sa[0]
1091        s_max_u32 sa[4], sa[4], sa[0]
1092        s_xor_b32 sa[5], sa[5], sa[0]
1093        s_xor_b32 sa[6], sa[6], sa[0]
1094        s_xor_b32 sa[7], sa[7], sa[0]
1095        .cf_ret
1096        s_setpc_b64 s[0:1]
1097
1098bb2:    s_and_b32 sa[2], sa[2], sa[0]
1099        s_and_b32 sa[3], sa[3], sa[0]
1100        s_max_u32 sa[4], sa[4], sa[0]
1101        s_xor_b32 sa[5], sa[5], sa[0]
1102        s_xor_b32 sa[6], sa[6], sa[0]
1103        s_xor_b32 sa[7], sa[7], sa[0]
1104        .cf_ret
1105        s_setpc_b64 s[0:1]
1106)ffDXD",
1107        {
1108            {   // block 0 - start
1109                0, 28,
1110                { { 8, true } },
1111                {
1112                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1113                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1114                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1115                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1116                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1117                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1118                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1119                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1120                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1121                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1122                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1123                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1124                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
1125                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
1126                }, true, false, false },
1127            {   // block 1 - after call
1128                28, 40,
1129                { { 2, false }, { 3, false } },
1130                {
1131                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1132                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1133                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1134                }, false, false, false },
1135            {   // block 2 - aa0
1136                40, 52,
1137                { { 4, false } },
1138                {
1139                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1140                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1141                    { { "sa", 5 }, SSAInfo(1, 5, 5, 5, 1, false) }
1142                }, false, false, true },
1143            {   // block 3 - aa1
1144                52, 64,
1145                { },
1146                {
1147                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1148                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
1149                    { { "sa", 5 }, SSAInfo(1, 6, 6, 6, 1, false) },
1150                    { { "sa", 6 }, SSAInfo(1, 7, 7, 7, 1, false) }
1151                }, false, false, false },
1152            {   // block 4 - ca0
1153                64, 68,
1154                { { 8, true } },
1155                {
1156                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1157                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1158                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1159                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1160                }, true, false, false },
1161            {   // block 5 - last cond
1162                68, 80,
1163                { { 6, false }, { 7, false } },
1164                {
1165                    { { "sa", 3 }, SSAInfo(3, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1166                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1167                    { { "sa", 6 }, SSAInfo(1, 5, 5, 6, 2, false) }
1168                }, false, false, false },
1169            {   // block 6 - end1
1170                80, 88,
1171                { },
1172                {
1173                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1174                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, false) }
1175                }, false, false, true },
1176            {   // block 7 - end2
1177                88, 96,
1178                { },
1179                {
1180                    { { "sa", 7 }, SSAInfo(2, 6, 6, 6, 1, true) }
1181                }, false, false, true },
1182            {   // block 8 - routine
1183                96, 108,
1184                { { 9, false }, { 10, false }, { 11, false } },
1185                {
1186                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1187                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1188                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1189                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1190                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1191                }, false, false, false },
1192            {   // block 9 - bb0
1193                108, 136,
1194                { },
1195                {
1196                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1197                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1198                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1199                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1200                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1201                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1202                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1203                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1204                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
1205                }, false, true, true },
1206            {   // block 10 - bb1
1207                136, 164,
1208                { },
1209                {
1210                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1211                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1212                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1213                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1214                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1215                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1216                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1217                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1218                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) }
1219                }, false, true, true },
1220            {   // block 11 - bb2
1221                164, 192,
1222                { },
1223                {
1224                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1225                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1226                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1227                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1228                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1229                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1230                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1231                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) },
1232                    { { "sa", 7 }, SSAInfo(1, 4, 4, 4, 1, true) }
1233                }, false, true, true }
1234        },
1235        {   // SSA replaces
1236            { { "sa", 2 }, { { 4, 3 }, { 5, 3 }, { 6, 1 } } },
1237            { { "sa", 3 }, { { 4, 3 }, { 5, 3 }, { 6, 1 }, { 7, 1 } } },
1238            { { "sa", 4 }, { { 3, 2 }, { 4, 2 }, { 5, 1 }, { 2, 1 } } },
1239            { { "sa", 5 }, { { 5, 1 }, { 6, 1 } } },
1240            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 7, 1 } } },
1241            { { "sa", 7 }, { { 3, 2 }, { 4, 2 }, { 2, 1 } } }
1242        },
1243        true, ""
1244    },
1245    {   // 8 - retssa tests
1246        R"ffDXD(.regvar sa:s:8, va:v:8
1247        s_mov_b32 sa[2], s4
1248        s_mov_b32 sa[3], s5
1249        s_mov_b32 sa[4], s6
1250        s_mov_b32 sa[5], s5
1251        s_mov_b32 sa[6], s6
1252       
1253        .cf_call routine
1254        s_swappc_b64 s[0:1], s[2:3]
1255       
1256        s_lshl_b32 sa[2], sa[2], 3
1257        s_lshl_b32 sa[3], sa[1], 4
1258        s_cbranch_scc1 aa1
1259       
1260aa0:    s_lshl_b32 sa[2], sa[2], 3
1261        s_lshl_b32 sa[4], sa[3], 3
1262        s_lshl_b32 sa[6], sa[5], 3
1263        s_endpgm
1264
1265aa1:    s_lshl_b32 sa[2], sa[1], 3
1266        s_lshl_b32 sa[2], sa[3], 3
1267        s_lshl_b32 sa[4], sa[4], 3
1268        s_lshl_b32 sa[6], sa[6], 3
1269        s_endpgm
1270       
1271routine:
1272        s_xor_b32 sa[2], sa[2], sa[0]
1273        s_xor_b32 sa[3], sa[3], sa[0]
1274        .cf_cjump bb1, bb2
1275        s_setpc_b64 s[0:1]
1276       
1277bb0:    s_min_u32 sa[2], sa[2], sa[0]
1278        s_min_u32 sa[3], sa[3], sa[0]
1279        s_max_u32 sa[4], sa[4], sa[0]
1280        s_xor_b32 sa[5], sa[5], sa[0]
1281        s_xor_b32 sa[6], sa[6], sa[0]
1282        .cf_ret
1283        s_setpc_b64 s[0:1]
1284       
1285bb1:    s_and_b32 sa[2], sa[2], sa[0]
1286        s_and_b32 sa[3], sa[3], sa[0]
1287        s_max_u32 sa[4], sa[4], sa[0]
1288        s_xor_b32 sa[5], sa[5], sa[0]
1289        s_xor_b32 sa[6], sa[6], sa[0]
1290        .cf_ret
1291        s_setpc_b64 s[0:1]
1292
1293bb2:    s_and_b32 sa[2], sa[2], sa[0]
1294        s_and_b32 sa[3], sa[3], sa[0]
1295        s_max_u32 sa[4], sa[4], sa[0]
1296        s_xor_b32 sa[5], sa[5], sa[0]
1297        s_xor_b32 sa[6], sa[6], sa[0]
1298        .cf_ret
1299        s_setpc_b64 s[0:1]
1300)ffDXD",
1301        {
1302            {   // block 0 - start
1303                0, 24,
1304                { { 4, true } },
1305                {
1306                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1307                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1308                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1309                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1310                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1311                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1312                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1313                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1314                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1315                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1316                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1317                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1318                }, true, false, false },
1319            {   // block 1 - after call
1320                24, 36,
1321                { { 2, false }, { 3, false } },
1322                {
1323                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1324                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) },
1325                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, false) }
1326                }, false, false, false },
1327            {   // block 2 - aa0
1328                36, 52,
1329                { },
1330                {
1331                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
1332                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1333                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, false) },
1334                    { { "sa", 5 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) },
1335                    { { "sa", 6 }, SSAInfo(1, 5, 5, 5, 1, false) }
1336                }, false, false, true },
1337            {   // block 3 - aa1
1338                52, 72,
1339                { },
1340                {
1341                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1342                    { { "sa", 2 }, SSAInfo(6, 8, 8, 9, 2, false) },
1343                    { { "sa", 3 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1344                    { { "sa", 4 }, SSAInfo(2, 6, 6, 6, 1, true) },
1345                    { { "sa", 6 }, SSAInfo(2, 6, 6, 6, 1, true) }
1346                }, false, false, true },
1347            {   // block 4 - routine
1348                72, 84,
1349                { { 5, false }, { 6, false }, { 7, false } },
1350                {
1351                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1352                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1353                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1354                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1355                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1356                }, false, false, false },
1357            {   // block 5 - bb0
1358                84, 108,
1359                { },
1360                {
1361                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1362                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1363                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1364                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1365                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1366                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1367                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1368                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
1369                }, false, true, true },
1370            {   // block 6 - bb1
1371                108, 132,
1372                { },
1373                {
1374                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1375                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1376                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1377                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1378                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1379                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1380                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1381                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1382                }, false, true, true },
1383            {   // block 7 - bb2
1384                132, 156,
1385                { },
1386                {
1387                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1388                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1389                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1390                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
1391                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
1392                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
1393                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
1394                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
1395                }, false, true, true }
1396        },
1397        {   // SSA replaces
1398            { { "sa", 2 }, { { 4, 3 }, { 5, 3 } } },
1399            { { "sa", 4 }, { { 3, 2 }, { 4, 2 } } },
1400            { { "sa", 5 }, { { 3, 2 }, { 4, 2 } } },
1401            { { "sa", 6 }, { { 3, 2 }, { 4, 2 } } }
1402        },
1403        true, ""
1404    },
1405    {   // 9 - retssa tests
1406        R"ffDXD(.regvar sa:s:10, va:v:8
1407        s_mov_b32 sa[2], s4
1408        s_mov_b32 sa[3], s5
1409        s_mov_b32 sa[4], s6
1410        s_mov_b32 sa[5], s5
1411        v_mov_b32 va[1], v0
1412        v_mov_b32 va[2], v1
1413       
1414        .cf_call routine
1415        s_swappc_b64 s[0:1], s[2:3]
1416        s_cbranch_vccnz aa1
1417aa0:    s_xor_b32 sa[2], sa[1], sa[0]
1418        s_xor_b32 sa[3], sa[3], sa[0]
1419       
1420        .cf_call routine2
1421        s_swappc_b64 s[0:1], s[2:3]
1422       
1423        s_cbranch_vccnz aa3
1424aa2:    s_xor_b32 sa[6], sa[1], sa[0]
1425        s_xor_b32 sa[7], sa[7], sa[0]
1426        v_xor_b32 va[1], va[0], va[0]
1427        v_xor_b32 va[2], va[0], va[0]
1428        s_endpgm
1429       
1430aa3:    s_xor_b32 sa[6], sa[6], sa[0]
1431        s_xor_b32 sa[7], sa[7], sa[0]
1432        s_xor_b32 sa[8], sa[8], sa[0]
1433        s_xor_b32 sa[5], sa[5], sa[0]
1434        v_xor_b32 va[1], va[1], va[0]
1435        v_xor_b32 va[0], va[2], va[0]
1436        s_endpgm
1437       
1438aa1:    s_xor_b32 sa[2], sa[2], sa[0]
1439        s_xor_b32 sa[3], sa[3], sa[0]
1440        s_xor_b32 sa[2], sa[4], sa[0]
1441        s_xor_b32 sa[5], sa[5], sa[0]
1442        s_cbranch_execz aa5
1443       
1444aa4:    s_xor_b32 sa[4], sa[4], sa[0]
1445        v_xor_b32 va[1], va[1], va[0]
1446        s_endpgm
1447       
1448aa5:    s_xor_b32 sa[4], sa[4], sa[0]
1449        s_endpgm
1450       
1451routine:
1452        s_xor_b32 sa[2], sa[2], sa[0]
1453        s_xor_b32 sa[3], sa[3], sa[0]
1454        s_cbranch_vccz bb1
1455       
1456bb0:    s_min_u32 sa[2], sa[2], sa[0]
1457        s_min_u32 sa[3], sa[3], sa[0]
1458        s_max_u32 sa[4], sa[4], sa[0]
1459        s_xor_b32 sa[5], sa[5], sa[0]
1460        v_xor_b32 va[1], va[1], va[0]
1461        v_xor_b32 va[2], va[2], va[0]
1462        .cf_ret
1463        s_setpc_b64 s[0:1]
1464       
1465bb1:    s_and_b32 sa[2], sa[2], sa[0]
1466        s_and_b32 sa[3], sa[3], sa[0]
1467        s_max_u32 sa[4], sa[4], sa[0]
1468        s_xor_b32 sa[5], sa[5], sa[0]
1469        v_xor_b32 va[1], va[1], va[0]
1470        v_xor_b32 va[2], va[2], va[0]
1471        .cf_ret
1472        s_setpc_b64 s[0:1]
1473
1474routine2:
1475        s_xor_b32 sa[6], sa[6], sa[1]
1476        s_xor_b32 sa[7], sa[7], sa[1]
1477        s_cbranch_vccz bb3
1478       
1479bb2:    s_min_u32 sa[6], sa[6], sa[1]
1480        s_min_u32 sa[7], sa[7], sa[1]
1481        s_max_u32 sa[8], sa[8], sa[1]
1482        s_xor_b32 sa[5], sa[5], sa[1]
1483        .cf_ret
1484        s_setpc_b64 s[0:1]
1485       
1486bb3:    s_and_b32 sa[6], sa[6], sa[1]
1487        s_and_b32 sa[7], sa[7], sa[1]
1488        s_max_u32 sa[8], sa[8], sa[1]
1489        s_xor_b32 sa[5], sa[5], sa[1]
1490        .cf_ret
1491        s_setpc_b64 s[0:1]
1492)ffDXD",
1493        {
1494            {   // block 0 - start
1495                0, 28,
1496                { { 9, true } },
1497                {
1498                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1499                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1500                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1501                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1502                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1503                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1504                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1505                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1506                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1507                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1508                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1509                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1510                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
1511                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1512                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
1513                }, true, false, false },
1514            {   // block 1 - branch aa0-aa1
1515                28, 32,
1516                { { 2, false }, { 6, false } },
1517                {
1518                }, false, false, false },
1519            {   // block 2 - aa0
1520                32, 44,
1521                { { 12, true } },
1522                {
1523                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1524                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1525                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1526                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1527                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1528                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1529                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1530                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1531                }, true, false, false },
1532            {   // block 3 - branch aa2-aa3
1533                44, 48,
1534                { { 4, false }, { 5, false } },
1535                {
1536                }, false, false, false },
1537            {   // block 4 - aa2
1538                48, 68,
1539                { },
1540                {
1541                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1542                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1543                    { { "sa", 6 }, SSAInfo(0, 4, 4, 4, 1, false) },
1544                    { { "sa", 7 }, SSAInfo(2, 4, 4, 4, 1, true) },
1545                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1546                    { { "va", 1 }, SSAInfo(1, 4, 4, 4, 1, false) },
1547                    { { "va", 2 }, SSAInfo(1, 4, 4, 4, 1, false) }
1548                }, false, false, true },
1549            {   // block 5 - aa3
1550                68, 96,
1551                { },
1552                {
1553                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1554                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) },
1555                    { { "sa", 6 }, SSAInfo(2, 5, 5, 5, 1, true) },
1556                    { { "sa", 7 }, SSAInfo(2, 5, 5, 5, 1, true) },
1557                    { { "sa", 8 }, SSAInfo(1, 3, 3, 3, 1, true) },
1558                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, true) },
1559                    { { "va", 1 }, SSAInfo(2, 5, 5, 5, 1, true) },
1560                    { { "va", 2 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1561                }, false, false, true },
1562            {   // block 6 - aa1
1563                96, 116,
1564                { { 7, false }, { 8, false } },
1565                {
1566                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1567                    { { "sa", 2 }, SSAInfo(3, 6, 6, 7, 2, true) },
1568                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) },
1569                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
1570                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) }
1571                }, false, false, false },
1572            {   // block 7 - aa4
1573                116, 128,
1574                { },
1575                {
1576                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1577                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
1578                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1579                    { { "va", 1 }, SSAInfo(2, 6, 6, 6, 1, true) }
1580                }, false, false, true },
1581            {   // block 8 - aa5
1582                128, 136,
1583                { },
1584                {
1585                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1586                    { { "sa", 4 }, SSAInfo(2, 5, 5, 5, 1, true) }
1587                }, false, false, true },
1588            {   // block 9 - routine
1589                136, 148,
1590                { { 10, false }, { 11, false } },
1591                {
1592                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1593                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1594                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1595                }, false, false, false },
1596            {   // block 10 - bb0
1597                148, 176,
1598                { },
1599                {
1600                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1601                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1602                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1603                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1604                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1605                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
1606                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
1607                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1608                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1609                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1610                }, false, true, true },
1611            {   // block 11 - bb1
1612                176, 204,
1613                { },
1614                {
1615                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1616                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1617                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1618                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
1619                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1620                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
1621                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
1622                    { { "va", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1623                    { { "va", 1 }, SSAInfo(1, 3, 3, 3, 1, true) },
1624                    { { "va", 2 }, SSAInfo(1, 3, 3, 3, 1, true) }
1625                }, false, true, true },
1626            {   // block 12 - routine2
1627                204, 216,
1628                { { 13, false }, { 14, false } },
1629                {
1630                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1631                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, true) },
1632                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, true) }
1633                }, false, false, false },
1634            {   // block 13 - bb2
1635                216, 236,
1636                { },
1637                {
1638                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1639                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1640                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1641                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
1642                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
1643                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) },
1644                    { { "sa", 8 }, SSAInfo(0, 1, 1, 1, 1, true) }
1645                }, false, true, true },
1646            {   // block 14 - bb3
1647                236, 256,
1648                { },
1649                {
1650                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1651                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1652                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1653                    { { "sa", 5 }, SSAInfo(2, 5, 5, 5, 1, true) },
1654                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
1655                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) },
1656                    { { "sa", 8 }, SSAInfo(0, 2, 2, 2, 1, true) }
1657                }, false, true, true }
1658        },
1659        {   // SSA replaces
1660            { { "sa", 2 }, { { 4, 3 } } },
1661            { { "sa", 3 }, { { 4, 3 } } },
1662            { { "sa", 4 }, { { 3, 2 } } },
1663            { { "sa", 5 }, { { 3, 2 }, { 5, 4 } } },
1664            { { "sa", 6 }, { { 3, 2 } } },
1665            { { "sa", 7 }, { { 3, 2 } } },
1666            { { "sa", 8 }, { { 2, 1 } } },
1667            { { "va", 1 }, { { 3, 2 } } },
1668            { { "va", 2 }, { { 3, 2 } } }
1669        },
1670        true, ""
1671    },
1672    {   // 10 - retssa tests 2
1673        R"ffDXD(.regvar sa:s:10, va:v:8
1674        s_mov_b32 sa[2], s4
1675        s_mov_b32 sa[3], s5
1676        .cf_call routine
1677        s_swappc_b64 s[0:1], s[2:3]
1678       
1679        s_xor_b32 sa[4], sa[4], sa[1]
1680        s_cbranch_execz aa1
1681       
1682aa0:    .cf_call routine2
1683        s_swappc_b64 s[0:1], s[2:3]
1684       
1685        s_and_b32 sa[3], sa[3], sa[0]
1686        s_endpgm
1687       
1688aa1:    s_xor_b32 sa[4], sa[4], sa[1]
1689        s_and_b32 sa[2], sa[2], sa[0]
1690        s_endpgm
1691       
1692routine:
1693        s_xor_b32 sa[2], sa[2], sa[0]
1694        s_cbranch_vccz bb1
1695       
1696bb0:    s_min_u32 sa[2], sa[2], sa[0]
1697        .cf_ret
1698        s_setpc_b64 s[0:1]
1699       
1700bb1:    s_and_b32 sa[2], sa[2], sa[0]
1701        .cf_ret
1702        s_setpc_b64 s[0:1]
1703       
1704routine2:
1705        s_xor_b32 sa[2], sa[1], sa[0]
1706        s_xor_b32 sa[3], sa[3], sa[0]
1707        s_cbranch_vccz cc1
1708       
1709cc0:    s_min_u32 sa[3], sa[3], sa[0]
1710        s_xor_b32 sa[2], sa[1], sa[0]
1711        .cf_ret
1712        s_setpc_b64 s[0:1]
1713       
1714cc1:    s_and_b32 sa[3], sa[3], sa[0]
1715        s_xor_b32 sa[2], sa[1], sa[0]
1716        .cf_ret
1717        s_setpc_b64 s[0:1]
1718)ffDXD",
1719        {
1720            {   // block 0 - start
1721                0, 12,
1722                { { 5, true } },
1723                {
1724                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1725                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1726                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1727                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1728                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1729                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1730                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1731                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1732                }, true, false, false },
1733            {   // block 1 - after routine call
1734                12, 20,
1735                { { 2, false }, { 4, false } },
1736                {
1737                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1738                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
1739                }, false, false, false },
1740            {   // block 2 - aa0
1741                20, 24,
1742                { { 8, true } },
1743                {
1744                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1745                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1746                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1747                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1748                }, true, false, false },
1749            {   // block 3 - after routine2 call
1750                24, 32,
1751                { },
1752                {
1753                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1754                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1755                }, false, false, true },
1756            {   // block 4 - aa1
1757                32, 44,
1758                { },
1759                {
1760                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1761                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1762                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
1763                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1764                }, false, false, true },
1765            {   // block 5 - routine
1766                44, 52,
1767                { { 6, false }, { 7, false } },
1768                {
1769                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1770                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
1771                }, false, false, false },
1772            {   // block 6 - bb0
1773                52, 60,
1774                { },
1775                {
1776                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1777                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1778                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1779                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
1780                }, false, true, true },
1781            {   // block 7 - bb1
1782                60, 68,
1783                { },
1784                {
1785                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1786                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1787                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1788                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) }
1789                }, false, true, true },
1790            {   // block 8 - routine2
1791                68, 80,
1792                { { 9, false }, { 10, false } },
1793                {
1794                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1795                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1796                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, false) },
1797                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1798                }, false, false, false },
1799            {   // block 9 - cc0
1800                80, 92,
1801                { },
1802                {
1803                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1804                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1805                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1806                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1807                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, false) },
1808                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
1809                }, false, true, true },
1810            {   // block 10 - cc1
1811                92, 104,
1812                { },
1813                {
1814                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1815                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1816                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1817                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1818                    { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, false) },
1819                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
1820                }, false, true, true }
1821        },
1822        {   // SSA replaces
1823            { { "sa", 2 }, { { 4, 3 } } },
1824            { { "sa", 3 }, { { 4, 3 } } }
1825        },
1826        true, ""
1827    },
1828    {   // 11 - simple routine with loop
1829        R"ffDXD(.regvar sa:s:10, va:v:8
1830        s_mov_b32 sa[2], s4
1831        s_mov_b32 sa[3], s5
1832        s_mov_b32 sa[4], s6
1833        .cf_call routine
1834        s_swappc_b64 s[0:1], s[2:3]
1835       
1836        s_xor_b32 sa[2], sa[2], sa[0]
1837        s_xor_b32 sa[3], sa[3], sa[0]
1838        s_xor_b32 sa[4], sa[4], sa[1]
1839       
1840        .cf_call routine
1841        s_swappc_b64 s[0:1], s[2:3]
1842       
1843        s_xor_b32 sa[2], sa[2], sa[0]
1844        s_xor_b32 sa[3], sa[3], sa[0]
1845        s_xor_b32 sa[4], sa[4], sa[1]
1846        s_endpgm
1847       
1848routine:
1849        s_xor_b32 sa[2], sa[2], sa[0]
1850        s_xor_b32 sa[3], sa[3], sa[0]
1851       
1852loop0:  s_xor_b32 sa[2], sa[2], sa[0]
1853        s_xor_b32 sa[3], sa[3], sa[0]
1854        s_xor_b32 sa[4], sa[4], sa[1]
1855        s_cbranch_scc0 loop0
1856       
1857        s_xor_b32 sa[4], sa[4], sa[1]
1858        s_xor_b32 sa[2], sa[2], sa[0]
1859        .cf_ret
1860        s_setpc_b64 s[0:1]
1861)ffDXD",
1862        {
1863            {   // block 0 - start
1864                0, 16,
1865                { { 3, true } },
1866                {
1867                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1868                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1869                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1870                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1871                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1872                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1873                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1874                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1875                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1876                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
1877                }, true, false, false },
1878            {   // block 1 - after routine call
1879                16, 32,
1880                { { 3, true } },
1881                {
1882                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1883                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1884                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1885                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1886                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1887                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1888                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
1889                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
1890                    { { "sa", 4 }, SSAInfo(3, 4, 4, 4, 1, true) }
1891                }, true, false, false },
1892            {   // block 2 - end
1893                32, 48,
1894                { },
1895                {
1896                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1897                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1898                    { { "sa", 2 }, SSAInfo(4, 6, 6, 6, 1, true) },
1899                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
1900                    { { "sa", 4 }, SSAInfo(3, 5, 5, 5, 1, true) }
1901                }, false, false, true },
1902            {   // block 3 - routine
1903                48, 56,
1904                { },
1905                {
1906                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1907                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1908                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1909                }, false, false, false },
1910            {   // block 4 - loop0
1911                56, 72,
1912                { { 4, false }, { 5, false } },
1913                {
1914                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1915                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1916                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1917                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
1918                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1919                }, false, false, false },
1920            {   // block 5 - routine end
1921                72, 84,
1922                { },
1923                {
1924                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1925                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1926                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1927                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1928                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
1929                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
1930                }, false, true, true }
1931        },
1932        {   // SSA replaces
1933            { { "sa", 2 }, { { 3, 2 }, { 5, 1 } } },
1934            { { "sa", 3 }, { { 3, 2 }, { 4, 1 } } },
1935            { { "sa", 4 }, { { 2, 1 }, { 4, 1 } } }
1936        },
1937        true, ""
1938    },
1939    {
1940        R"ffDXD(.regvar sa:s:10, va:v:8
1941        s_mov_b32 sa[2], s4
1942        s_mov_b32 sa[3], s5
1943        .cf_call routine
1944        s_swappc_b64 s[0:1], s[2:3]
1945       
1946        s_xor_b32 sa[2], sa[2], sa[0]
1947        s_xor_b32 sa[3], sa[3], sa[1]
1948        .cf_call routine2
1949        s_swappc_b64 s[0:1], s[2:3]
1950       
1951        .cf_call routine
1952        s_swappc_b64 s[0:1], s[2:3]
1953        s_endpgm
1954       
1955routine:
1956        s_xor_b32 sa[2], sa[2], sa[0]
1957        s_xor_b32 sa[3], sa[3], sa[1]
1958        s_cbranch_scc1 aa0
1959       
1960        s_xor_b32 sa[2], sa[2], sa[0]
1961        s_xor_b32 sa[3], sa[3], sa[1]
1962        .cf_ret
1963        s_setpc_b64 s[0:1]
1964       
1965aa0:    s_xor_b32 sa[2], sa[2], sa[0]
1966        s_xor_b32 sa[3], sa[3], sa[1]
1967        .cf_ret
1968        s_setpc_b64 s[0:1]
1969       
1970routine2:
1971        s_and_b32 sa[2], sa[2], sa[0]
1972        s_xor_b32 sa[3], sa[3], sa[1]
1973        s_cbranch_scc1 aa1
1974       
1975        s_xor_b32 sa[2], sa[2], sa[0]
1976        s_and_b32 sa[3], sa[3], sa[1]
1977        .cf_ret
1978        s_setpc_b64 s[0:1]
1979       
1980aa1:    s_and_b32 sa[2], sa[2], sa[0]
1981        s_xor_b32 sa[3], sa[3], sa[1]
1982        .cf_ret
1983        s_setpc_b64 s[0:1]
1984)ffDXD",
1985        {
1986            {   // block 0 - start
1987                0, 12,
1988                { { 4, true } },
1989                {
1990                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1991                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1992                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1993                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1994                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1995                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1996                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1997                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1998                }, true, false, false },
1999            {   // block 1 - after routine call
2000                12, 24,
2001                { { 7, true } },
2002                {
2003                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2004                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2005                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2006                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2007                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2008                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2009                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2010                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
2011                }, true, false, false },
2012            {   // block 2 - after routine2 call
2013                24, 28,
2014                { { 4, true } },
2015                {
2016                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2017                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2018                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2019                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
2020                }, true, false, false },
2021            {   // block 3 - end
2022                28, 32,
2023                { },
2024                { },
2025                false, false, true },
2026            {   // block 4 - routine
2027                32, 44,
2028                { { 5, false }, { 6, false } },
2029                {
2030                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2031                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2032                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2033                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
2034                }, false, false, false },
2035            {   // block 5 - first fork
2036                44, 56,
2037                { },
2038                {
2039                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2040                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2041                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2042                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2043                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2044                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2045                }, false, true, true },
2046            {   // block 6 - aa0 - second fork
2047                56, 68,
2048                { },
2049                {
2050                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2051                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2052                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2053                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2054                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2055                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
2056                }, false, true, true },
2057            {   // block 7 - routine2
2058                68, 80,
2059                { { 8, false }, { 9, false } },
2060                {
2061                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2062                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2063                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2064                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) }
2065                }, false, false, false },
2066            {   // block 8 - first fork
2067                80, 92,
2068                { },
2069                {
2070                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2071                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2072                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2073                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2074                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2075                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) }
2076                }, false, true, true },
2077            {   // block 9 - aa1 - second fork
2078                92, 104,
2079                { },
2080                {
2081                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2082                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2083                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2084                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2085                    { { "sa", 2 }, SSAInfo(6, 8, 8, 8, 1, true) },
2086                    { { "sa", 3 }, SSAInfo(6, 8, 8, 8, 1, true) }
2087                }, false, true, true }
2088        },
2089        {   // SSA replaces
2090            { { "sa", 2 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } },
2091            { { "sa", 3 }, { { 4, 3 }, { 7, 1 }, { 8, 1 } } }
2092        },
2093        true, ""
2094    },
2095    {   // 11 - routine with complex loop used twice
2096        R"ffDXD(.regvar sa:s:10, va:v:8
2097        s_mov_b32 sa[2], s4
2098        s_mov_b32 sa[3], s5
2099        s_mov_b32 sa[4], s6
2100        s_mov_b32 sa[5], s7
2101        s_mov_b32 sa[6], s8
2102        .cf_call routine
2103        s_swappc_b64 s[0:1], s[2:3]
2104       
2105        s_xor_b32 sa[2], sa[2], sa[0]
2106        s_xor_b32 sa[3], sa[3], sa[0]
2107        s_xor_b32 sa[4], sa[4], sa[1]
2108        s_xor_b32 sa[5], sa[5], sa[1]
2109        s_xor_b32 sa[6], sa[6], sa[0]
2110        s_endpgm
2111       
2112routine:
2113        s_xor_b32 sa[2], sa[2], sa[0]
2114        s_xor_b32 sa[3], sa[3], sa[0]
2115        s_xor_b32 sa[5], sa[5], sa[0]
2116        s_cbranch_vccz  subr1
2117       
2118loop0:  s_xor_b32 sa[2], sa[2], sa[0]
2119        s_cbranch_scc0 end1
2120       
2121        s_xor_b32 sa[3], sa[3], sa[0]
2122        s_cbranch_scc0 end2
2123       
2124        s_xor_b32 sa[4], sa[4], sa[1]
2125        s_cbranch_scc0 end3
2126       
2127        s_xor_b32 sa[5], sa[5], sa[1]
2128        s_branch loop0
2129       
2130end1:   s_xor_b32 sa[2], sa[2], sa[0]
2131        .cf_ret
2132        s_setpc_b64 s[0:1]
2133
2134end2:   s_xor_b32 sa[3], sa[3], sa[0]
2135        .cf_ret
2136        s_setpc_b64 s[0:1]
2137
2138end3:   s_xor_b32 sa[4], sa[4], sa[0]
2139        .cf_ret
2140        s_setpc_b64 s[0:1]
2141
2142subr1:
2143        s_xor_b32 sa[2], sa[2], sa[0]
2144        s_xor_b32 sa[3], sa[3], sa[0]
2145        s_xor_b32 sa[4], sa[4], sa[0]
2146        s_xor_b32 sa[5], sa[5], sa[1]
2147        s_xor_b32 sa[6], sa[6], sa[0]
2148        s_cbranch_execnz loop0
2149
2150swubr2:
2151        s_xor_b32 sa[2], sa[2], sa[0]
2152        s_xor_b32 sa[3], sa[3], sa[0]
2153        s_xor_b32 sa[4], sa[4], sa[1]
2154        s_xor_b32 sa[5], sa[5], sa[1]
2155        s_xor_b32 sa[6], sa[6], sa[0]
2156        .cf_ret
2157        s_setpc_b64 s[0:1]
2158)ffDXD",
2159        {
2160            {   // block 0 - start
2161                0, 24,
2162                { { 2, true } },
2163                {
2164                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2165                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2166                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
2167                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
2168                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2169                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2170                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
2171                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
2172                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
2173                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2174                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
2175                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
2176                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
2177                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
2178                }, true, false, false },
2179            {   // block 1 - end
2180                24, 48,
2181                { },
2182                {
2183                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2184                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2185                    { { "sa", 2 }, SSAInfo(3, 7, 7, 7, 1, true) },
2186                    { { "sa", 3 }, SSAInfo(2, 7, 7, 7, 1, true) },
2187                    { { "sa", 4 }, SSAInfo(1, 6, 6, 6, 1, true) },
2188                    { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) },
2189                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
2190                }, false, false, true },
2191            {   // block 2 - routine
2192                48, 64,
2193                { { 3, false }, { 10, false } },
2194                {
2195                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2196                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2197                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2198                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
2199                }, false, false, false },
2200            {   // block 3 - loop0
2201                64, 72,
2202                { { 4, false }, { 7, false } },
2203                {
2204                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2205                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
2206                }, false, false, false },
2207            {   // block 4 - to end2
2208                72, 80,
2209                { { 5, false }, { 8, false } },
2210                {
2211                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2212                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2213                }, false, false, false },
2214            {   // block 5 - to end3
2215                80, 88,
2216                { { 6, false }, { 9, false } },
2217                {
2218                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2219                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
2220                }, false, false, false },
2221            {   // block 6 - loop end
2222                88, 96,
2223                { { 3, false } },
2224                {
2225                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2226                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
2227                }, false, false, true },
2228            {   // block 7 - end1
2229                96, 104,
2230                { },
2231                {
2232                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2233                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2234                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2235                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2236                }, false, true, true },
2237            {   // block 8 - end2
2238                104, 112,
2239                { },
2240                {
2241                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2242                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2243                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2244                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2245                }, false, true, true },
2246            {   // block 9 - end3
2247                112, 120,
2248                { },
2249                {
2250                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2251                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2252                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2253                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
2254                }, false, true, true },
2255            {   // block 10 - subr1
2256                120, 144,
2257                { { 3, false }, { 11, false } },
2258                {
2259                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2260                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2261                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
2262                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
2263                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
2264                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
2265                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2266                }, false, false, false },
2267            {   // block 11 - subr2
2268                144, 168,
2269                { },
2270                {
2271                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2272                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2273                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2274                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2275                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
2276                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
2277                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
2278                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
2279                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) }
2280                }, false, true, true }
2281        },
2282        {   // SSA replaces
2283            { { "sa", 2 }, { { 4, 3 }, { 6, 3 }, { 3, 2 }, { 5, 2 } } },
2284            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 } } },
2285            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
2286            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 } } },
2287            { { "sa", 6 }, { { 2, 1 }, { 3, 1 } } }
2288        },
2289        true, ""
2290    },
2291    { nullptr }
2292};
Note: See TracBrowser for help on using the repository browser.