source: CLRX/CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase3.cpp @ 3974

Last change on this file since 3974 was 3974, checked in by matszpk, 7 months ago

CLRadeonExtender: AsmRegAlloc?: Add new testcases: routine with program ends.

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