source: CLRX/CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase1.cpp @ 4071

Last change on this file since 4071 was 4071, checked in by matszpk, 6 months ago

CLRadeonExtender: AsmRegAlloc?: Missing: Add yet another testcase for createSSAData (loop with fork, regvar used only in these forks).
Add testcase for createLivenesses: first loop test. Disable debugdump.

File size: 117.2 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2018 Mateusz Szpakowski
4 *
5 *  This library is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Lesser General Public
7 *  License as published by the Free Software Foundation; either
8 *  version 2.1 of the License, or (at your option) any later version.
9 *
10 *  This library is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 *  Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public
16 *  License along with this library; if not, write to the Free Software
17 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20#include <CLRX/Config.h>
21#include <CLRX/utils/Utilities.h>
22#include <CLRX/amdasm/Assembler.h>
23#include <CLRX/utils/Containers.h>
24#include "../TestUtils.h"
25#include "AsmRegAlloc.h"
26
27const AsmCodeStructCase codeStructTestCases1Tbl[] =
28{
29    {   // 0
30        "v_mov_b32 v1, v2\n"
31        "v_mov_b32 v1, v3\n",
32        {
33            { 0, 8, { }, false, false, true }
34        },
35        true, ""
36    },
37    {   // 1
38        "v_mov_b32 v1, v2\n"
39        "v_mov_b32 v1, v3\n"
40        ".cf_end\n"
41        ".cf_start\n"
42        "v_mov_b32 v4, v2\n"
43        "v_mov_b32 v8, v3\n"
44        "v_mov_b32 v8, v3\n"
45        ".cf_end\n",
46        {
47            { 0, 8, { }, false, false, true },
48            { 8, 20, { }, false, false, true }
49        },
50        true, ""
51    },
52    {   // 2 - ignore cf_start to cf_end (except first)
53        "v_mov_b32 v1, v2\n"
54        "v_mov_b32 v1, v3\n"
55        ".cf_start\n"
56        "v_mov_b32 v4, v2\n"
57        "v_mov_b32 v8, v3\n"
58        ".cf_start\n"
59        "v_mov_b32 v8, v3\n"
60        ".cf_end\n"
61        ".cf_start\n"
62        "v_and_b32 v6, v1, v2\n"
63        ".cf_start\n"
64        "v_and_b32 v9, v1, v3\n"
65        ".cf_end\n",
66        {
67            { 0, 20, { }, false, false, true },
68            { 20, 28, { }, false, false, true }
69        },
70        true, ""
71    },
72    {   // 3 - ignore cf_end
73        "v_mov_b32 v1, v2\n"
74        "v_mov_b32 v1, v3\n"
75        ".cf_end\n"
76        "v_mov_b32 v4, v2\n"
77        "v_mov_b32 v8, v3\n"
78        "v_mov_b32 v8, v3\n"
79        ".cf_end\n"
80        ".cf_start\n"
81        "v_and_b32 v9, v1, v3\n"
82        ".cf_end\n",
83        {
84            { 0, 8, { }, false, false, true },
85            { 20, 24, { }, false, false, true }
86        },
87        true, ""
88    },
89    {   /* 4 - cond jump */
90        "v_mov_b32 v1, v2\n"
91        "v_mov_b32 v1, v3\n"
92        "label2:\n"
93        "v_mov_b32 v1, v3\n"
94        "v_mov_b32 v1, v3\n"
95        "s_cbranch_vccz label2\n"
96        "s_xor_b32 s3, s5, s8\n"
97        "s_endpgm\n",
98        {
99            { 0, 8, { }, false, false, false },
100            { 8, 20,
101              { { 1, false }, { 2, false } },
102              false, false, false },
103            { 20, 28, { }, false, false, true }
104        },
105        true, ""
106    },
107    {   /* 5 - jump */
108        "v_mov_b32 v1, v2\n"
109        "v_mov_b32 v1, v3\n"
110        "label2:\n"
111        "v_mov_b32 v1, v3\n"
112        "v_mov_b32 v1, v3\n"
113        "s_branch label2\n"
114        "s_xor_b32 s3, s5, s8\n"
115        "s_endpgm\n",
116        {
117            { 0, 8, { }, false, false, false },
118            { 8, 20,
119              { { 1, false } },
120              false, false, true }
121        },
122        true, ""
123    },
124    {
125        /* 6 - jump */
126        "v_mov_b32 v1, v2\n"
127        "v_mov_b32 v1, v3\n"
128        "lstart:\n"
129        ".cf_jump l0, l1, l2\n"
130        "s_setpc_b64 s[0:1]\n"
131        "l0:\n"
132        "v_add_f32 v1, v2, v3\n"
133        "s_branch lend\n"
134        "l1:\n"
135        "v_add_f32 v1, v2, v3\n"
136        "s_branch lend\n"
137        "l2:\n"
138        "v_add_f32 v1, v2, v3\n"
139        "s_branch lend\n"
140        "lend:\n"
141        "s_cbranch_vccz lstart\n"
142        "s_endpgm\n",
143        {
144            { 0, 8, { }, false, false, false },
145            { 8, 12,
146              { { 2, false }, { 3, false }, { 4, false } },
147              false, false, true },
148            { 12, 20,
149              { { 5, false } },
150              false, false, true },
151            { 20, 28,
152              { { 5, false } },
153              false, false, true },
154            { 28, 36,
155              { { 5, false } },
156              false, false, true },
157            { 36, 40,
158              { { 1, false }, { 6, false } },
159              false, false, false },
160            { 40, 44, { }, false, false, true }
161        },
162        true, ""
163    },
164    {   /* 7 - subroutines */
165        R"ffDXD(
166        v_mov_b32 v1, v2
167        v_mov_b32 v1, v3
168        .cf_call l0, l1, l2
169        s_setpc_b64 s[0:1]
170        v_sub_f32 v1, v3, v6    # 12
171        s_branch j0
172b0:     v_add_u32 v4, vcc, v6, v11  # 20
173        v_mac_f32 v6, v6, v6
174        s_endpgm
175l0:     # 32
176        v_add_f32 v1, v2, v3
177        v_add_f32 v1, v2, v3
178        .cf_ret
179        s_swappc_b64 s[0:1], s[0:1]
180l1:     # 44
181        v_add_f32 v1, v2, v3
182        v_add_f32 v1, v2, v3
183        v_add_f32 v1, v2, v3
184        .cf_ret
185        s_swappc_b64 s[0:1], s[0:1]
186l2:     # 60
187        v_add_f32 v1, v2, v3
188        v_add_f32 v1, v2, v3
189        v_add_f32 v1, v2, v3
190        v_add_f32 v1, v2, v3
191        v_add_f32 v1, v2, v3
192        .cf_ret
193        s_swappc_b64 s[0:1], s[0:1]
194j0:     # 84
195        v_lshrrev_b32 v4, 3, v2
196        v_lshrrev_b32 v4, 3, v2
197        s_branch b0
198)ffDXD",
199        {
200            { 0, 12,
201                { { 3, true }, { 4, true }, { 5, true } },
202                true, false, false },
203            { 12, 20, { { 6, false } }, false, false, true },
204            { 20, 32, { }, false, false, true },
205            { 32, 44, { }, false, true, true },
206            { 44, 60, { }, false, true, true },
207            { 60, 84, { }, false, true, true },
208            { 84, 96, { { 2, false } }, false, false, true }
209        },
210        true, ""
211    },
212    {   /* 8 - subroutines 2 - more complex */
213        R"ffDXD(
214        v_mov_b32 v1, v2    # 0
215        v_mov_b32 v1, v3
216loop:   s_mov_b32 s5, s0    # 8
217        .cf_call c1,c2,c3
218        s_swappc_b64 s[0:1], s[0:1]
219        v_and_b32 v4, v5, v4    # 16
220        v_and_b32 v4, v5, v3
221        v_and_b32 v4, v5, v4
222        .cf_call c5,c6
223        s_swappc_b64 s[0:1], s[0:1]
224        v_and_b32 v4, v5, v3    # 32
225        v_and_b32 v4, v5, v9
226        s_add_i32 s3, s3, s1
227        s_cbranch_vccnz loop
228        v_mac_f32 v4, v6, v7    # 48
229        s_endpgm
230.p2align 4
231c1:     v_xor_b32 v3, v4, v3    # 64
232        v_xor_b32 v3, v4, v7
233        v_xor_b32 v3, v4, v8
234        .cf_ret
235        s_swappc_b64 s[0:1], s[0:1]
236.p2align 4
237c2:     v_xor_b32 v3, v4, v3    # 80
238        v_xor_b32 v3, v4, v7
239c5:     v_xor_b32 v3, v4, v8    # 88
240        .cf_call c4
241        s_swappc_b64 s[0:1], s[0:1]
242        v_or_b32 v3, v11, v9    # 96
243        .cf_ret
244        s_swappc_b64 s[0:1], s[0:1]
245.p2align 4
246c3:     v_xor_b32 v3, v4, v3    # 112
247        v_xor_b32 v3, v4, v8
248        .cf_ret
249        s_swappc_b64 s[0:1], s[0:1]
250.p2align 4
251c4:     v_xor_b32 v3, v4, v3    # 128
252        v_xor_b32 v3, v9, v8
253c6: loop2:
254        v_xor_b32 v3, v9, v8    # 136
255        v_xor_b32 v3, v9, v8
256        s_add_i32 s4, 1, s34
257        s_cbranch_vccz loop2
258        v_lshlrev_b32 v3, 4, v2 # 152
259        .cf_ret
260        s_swappc_b64 s[0:1], s[0:1]
261)ffDXD",
262        {
263            { 0, 8, { }, false, false, false },
264            { 8, 16,
265                { { 5, true }, { 6, true }, { 9, true } },
266                true, false, false },
267            // 2
268            { 16, 32,
269                { { 7, true }, { 11, true } },
270                true, false, false },
271            { 32, 48,
272                { { 1, false }, { 4, false } },
273                false, false, false },
274            // 4
275            { 48, 56, { }, false, false, true },
276            // 5 - c1 subroutine
277            { 64, 80, { }, false, true, true },
278            // 6 - c2 subroutine
279            { 80, 88, { }, false, false, false },
280            { 88, 96, { { 10, true } },
281                true, false, false },
282            { 96, 104, { }, false, true, true },
283            // 9 - c3 subroutine
284            { 112, 124, { }, false, true, true },
285            // 10 - c4 subroutine
286            { 128, 136, { }, false, false, false },
287            { 136, 152,
288                { { 11, false }, { 12, false } },
289                false, false, false },
290            { 152, 160, { }, false, true, true }
291        },
292        true, ""
293    },
294    {   // 9 - switch
295        R"ffDXD(
296            v_mac_f32 v6, v9, v8    # 0
297            v_xor_b32 v3, v9, v8
298            .cf_jump j1, j2, j3, j4
299            s_setpc_b64 s[0:1]
300           
301j1:         v_xor_b32 v3, v9, v8    # 12
302            v_xor_b32 v3, v9, v8
303            v_xor_b32 v3, v9, v8
304            s_branch b0
305
306j2:         v_xor_b32 v3, v9, v8    # 28
307            v_xor_b32 v1, v5, v8
308            v_and_b32 v2, v9, v8
309            v_xor_b32 v3, v9, v8
310            s_branch b0
311
312j3:         v_xor_b32 v3, v9, v8    # 48
313            v_xor_b32 v1, v5, v8
314            s_branch b0
315
316j4:         v_xor_b32 v3, v9, v8    # 60
317            v_xor_b32 v1, v5, v8
318            v_xor_b32 v1, v5, v8
319b0:         s_sub_u32 s0, s1, s2    # 72
320            s_endpgm
321)ffDXD",
322        {
323            { 0, 12,
324                { { 1, false }, { 2, false }, { 3, false }, { 4, false } },
325                false, false, true },
326            { 12, 28, { { 5, false } }, false, false, true },
327            { 28, 48, { { 5, false } }, false, false, true },
328            { 48, 60, { { 5, false } }, false, false, true },
329            { 60, 72, { }, false, false, false },
330            { 72, 80, { }, false, false, true }
331        },
332        true, ""
333    },
334    {   // 10 - multiple kernels
335        R"ffDXD(
336            .cf_start
337            v_mac_f32 v6, v9, v8    # 0
338            v_xor_b32 v3, v9, v8
339            .cf_end
340.p2align 6
341            .cf_start
342            v_xor_b32 v3, v9, v8
343            v_xor_b32 v1, v5, v8
344            v_xor_b32 v1, v5, v8
345            v_xor_b32 v1, v5, v8
346            s_endpgm
347.p2align 6
348            .cf_start       # empty block, ignored
349            .cf_end
350            .cf_start
351            v_xor_b32 v3, v9, v8
352            v_xor_b32 v1, v5, v8
353            v_xor_b32 v3, v9, v8
354            v_or_b32 v3, v9, v8
355            v_or_b32 v3, v9, v8
356            s_endpgm
357            .cf_end
358            .cf_start
359            v_or_b32 v3, v9, v8
360            .cf_end
361            .cf_start   # empty block, ignored
362            .cf_end
363)ffDXD",
364        {
365            { 0, 8, { }, false, false, true },
366            { 64, 84, { }, false, false, true },
367            { 128, 152, { }, false, false, true },
368            { 152, 156, { }, false, false, true }
369        },
370        true, ""
371    },
372    {   // 11 - different type of jumps
373        R"ffDXD(
374            v_mac_f32 v6, v9, v8    # 0
375            v_xor_b32 v3, v9, v8
376            .cf_jump j1, j4
377            .cf_cjump j2, j3
378            s_setpc_b64 s[0:1]
379           
380            v_mov_b32 v5, v3
381            .cf_jump j1, j4
382            .cf_cjump j2, j3
383            s_setpc_b64 s[0:1]
384            .cf_end
385           
386j1:         v_xor_b32 v3, v9, v8    # 20
387            v_xor_b32 v3, v9, v8
388            v_xor_b32 v3, v9, v8
389            s_branch b0
390
391j2:         v_xor_b32 v3, v9, v8    # 36
392            v_xor_b32 v1, v5, v8
393            v_and_b32 v2, v9, v8
394            v_xor_b32 v3, v9, v8
395            s_branch b0
396
397j3:         v_xor_b32 v3, v9, v8    # 56
398            v_xor_b32 v1, v5, v8
399            s_branch b0
400
401j4:         v_xor_b32 v3, v9, v8    # 68
402            v_xor_b32 v1, v5, v8
403            v_xor_b32 v1, v5, v8
404b0:         s_sub_u32 s0, s1, s2    # 80
405            s_endpgm
406)ffDXD",
407        {
408            { 0, 12,
409                { { 1, false }, { 2, false }, { 3, false },
410                  { 4, false }, { 5, false } },
411                false, false, false },
412            { 12, 20,
413                { { 2, false }, { 3, false }, { 4, false }, { 5, false } },
414                false, false, true }, // have cf_end, force haveEnd
415            { 20, 36, { { 6, false } }, false, false, true },
416            { 36, 56, { { 6, false } }, false, false, true },
417            { 56, 68, { { 6, false } }, false, false, true },
418            { 68, 80, { }, false, false, false },
419            { 80, 88, { }, false, false, true }
420        },
421        true, ""
422    },
423    {   // 12 - many jumps to same place
424        R"ffDXD(
425            v_mac_f32 v6, v9, v8    # 0
426            v_xor_b32 v3, v9, v8
427            s_cbranch_vccz j1
428            v_mov_b32 v4, v3        # 12
429            v_mov_b32 v4, v3
430            s_cbranch_execz j1
431            v_mov_b32 v4, v3        # 24
432            v_mov_b32 v4, v3
433            s_cbranch_execnz b0
434            s_branch j2             # 36
435b0:         v_mov_b32 v4, v3        # 40
436            v_mov_b32 v5, v3
437            v_mov_b32 v5, v4
438            s_branch j2
439j1:         v_max_u32 v4, v1, v6    # 56
440            s_endpgm
441j2:         v_min_i32 v4, v1, v6    # 64
442            v_min_i32 v3, v1, v6
443            .cf_call c1
444            s_swappc_b64 s[0:1], s[0:1]
445            v_min_i32 v3, v1, v6    # 76
446            .cf_call c1
447            s_swappc_b64 s[0:1], s[0:1]
448            v_min_i32 v3, v1, v6    # 84
449            s_endpgm
450c1:         v_add_f32 v6, v1, v4    # 92
451            v_add_f32 v6, v1, v4
452            .cf_ret
453            s_swappc_b64 s[0:1], s[0:1]
454)ffDXD",
455        {
456            { 0, 12,
457                { { 1, false }, { 5, false } },
458                false, false, false },
459            { 12, 24,
460                { { 2, false }, { 5, false } },
461                false, false, false },
462            { 24, 36,
463                { { 3, false }, { 4, false } },
464                false, false, false },
465            { 36, 40, { { 6, false } }, false, false, true },
466            { 40, 56, { { 6, false } }, false, false, true },
467            // 5
468            { 56, 64, { }, false, false, true },
469            { 64, 76,
470                { { 9, true } },
471                true, false, false },
472            { 76, 84,
473                { { 9, true } },
474                true, false, false },
475            { 84, 92, { }, false, false, true },
476            // 9 - subroutine
477            { 92, 104, { }, false, true, true }
478        },
479        true, ""
480    },
481    {   /* 13 - subroutines 2 (one is jump) */
482        R"ffDXD(
483        v_mov_b32 v1, v2
484        v_mov_b32 v1, v3
485        .cf_call l0, l1
486        .cf_jump l2
487        s_setpc_b64 s[0:1]
488        v_sub_f32 v1, v3, v6    # 12
489        s_branch j0
490b0:     v_add_u32 v4, vcc, v6, v11  # 20
491        v_mac_f32 v6, v6, v6
492        s_endpgm
493l0:     # 32
494        v_add_f32 v1, v2, v3
495        v_add_f32 v1, v2, v3
496        .cf_ret
497        s_swappc_b64 s[0:1], s[0:1]
498l1:     # 44
499        v_add_f32 v1, v2, v3
500        v_add_f32 v1, v2, v3
501        v_add_f32 v1, v2, v3
502        .cf_ret
503        s_swappc_b64 s[0:1], s[0:1]
504l2:     # 60
505        v_add_f32 v1, v2, v3
506        v_add_f32 v1, v2, v3
507        v_add_f32 v1, v2, v3
508        v_add_f32 v1, v2, v3
509        v_add_f32 v1, v2, v3
510        .cf_ret
511        s_swappc_b64 s[0:1], s[0:1]
512j0:     # 84
513        v_lshrrev_b32 v4, 3, v2
514        v_lshrrev_b32 v4, 3, v2
515        s_branch b0
516)ffDXD",
517        {
518            { 0, 12,
519                { { 5, false }, { 3, true }, { 4, true } },
520                true, false, true },
521            { 12, 20, { { 6, false } }, false, false, true },
522            { 20, 32, { }, false, false, true },
523            { 32, 44, { }, false, true, true },
524            { 44, 60, { }, false, true, true },
525            { 60, 84, { }, false, true, true },
526            { 84, 96, { { 2, false } }, false, false, true }
527        },
528        true, ""
529    },
530    {   /* 14 - empty */
531        ".regvar sa:s:8, va:v:12, vb:v:10\n",
532        { },
533        true, ""
534    },
535    {   // 15 - switch (empty block at end)
536        R"ffDXD(
537            v_mac_f32 v6, v9, v8    # 0
538            v_xor_b32 v3, v9, v8
539            .cf_jump j1, j2, j3, j4
540            s_setpc_b64 s[0:1]
541           
542j1:         v_xor_b32 v3, v9, v8    # 12
543            v_xor_b32 v3, v9, v8
544            v_xor_b32 v3, v9, v8
545            s_branch b0
546
547j2:         v_xor_b32 v3, v9, v8    # 28
548            v_xor_b32 v1, v5, v8
549            v_and_b32 v2, v9, v8
550            v_xor_b32 v3, v9, v8
551            s_branch b0
552
553j3:         v_xor_b32 v3, v9, v8    # 48
554            v_xor_b32 v1, v5, v8
555            s_branch b0
556
557j4:         v_xor_b32 v3, v9, v8    # 60
558            v_xor_b32 v1, v5, v8
559            v_xor_b32 v1, v5, v8
560b0:         # 72
561)ffDXD",
562        {
563            { 0, 12,
564                { { 1, false }, { 2, false }, { 3, false }, { 4, false } },
565                false, false, true },
566            { 12, 28, { { 5, false } }, false, false, true },
567            { 28, 48, { { 5, false } }, false, false, true },
568            { 48, 60, { { 5, false } }, false, false, true },
569            { 60, 72, { }, false, false, false },
570            { 72, 72, { }, false, false, true }
571        },
572        true, ""
573    },
574    { nullptr }
575};
576
577
578const AsmSSADataCase ssaDataTestCases1Tbl[] =
579{
580    {   /* 0 - simple */
581        ".regvar sa:s:8, va:v:10\n"
582        "s_mov_b32 sa[4], sa[2]\n"
583        "s_add_u32 sa[4], sa[2], s3\n"
584        "ds_read_b64 va[4:5], v0\n"
585        "v_add_f64 va[0:1], va[4:5], va[2:3]\n"
586        "v_mac_f32 va[0], va[4], va[5]\n"  // ignore this write, because also read
587        "v_mul_f32 va[1], va[4], va[5]\n"
588        "ds_read_b32 v10, v0\n"
589        "v_mul_lo_u32 v10, va[2], va[3]\n"
590        "v_mul_lo_u32 v10, va[2], va[3]\n",
591        {
592            { 0, 56, { },
593                {
594                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
595                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
596                    { { "", 266 }, SSAInfo(0, 0, 0, 0, 0, false) },
597                    { { "sa", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
598                    { { "sa", 4 }, SSAInfo(0, 1, 1, 2, 2, false) },
599                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
600                    { { "va", 1 }, SSAInfo(0, 1, 1, 2, 2, false) },
601                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
602                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
603                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
604                    { { "va", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
605                }, false, false, true }
606        },
607        { },
608        true, ""
609    },
610    {   /* 1 - tree */
611        R"ffDXD(.regvar sa:s:8, va:v:10
612        s_mov_b32 sa[4], sa[2]  # 0
613        s_add_u32 sa[4], sa[2], s3
614        ds_read_b64 va[4:5], v0
615        v_add_f64 va[0:1], va[4:5], va[2:3]
616        v_add_f64 va[0:1], va[4:5], va[2:3]
617        v_add_f64 va[0:1], va[4:5], va[2:3]
618        .cf_jump j1,j2,j3
619        s_setpc_b64 s[0:1]
620        # 44
621j1:     v_add_f32 va[5], va[2], va[3]
622        v_mov_b32 va[6], va[2]
623        s_endpgm
624j2:     v_add_f32 va[3], va[2], va[5]
625        v_add_f32 va[6], va[2], va[3]
626        s_endpgm
627j3:     v_add_f32 va[2], va[5], va[3]
628        s_endpgm
629)ffDXD",
630        {
631            { 0, 44,
632                { { 1, false }, { 2, false }, { 3, false } },
633                {
634                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
635                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
636                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
637                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
638                    { { "sa", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
639                    { { "sa", 4 }, SSAInfo(0, 1, 1, 2, 2, false) },
640                    { { "va", 0 }, SSAInfo(0, 1, 1, 3, 3, false) },
641                    { { "va", 1 }, SSAInfo(0, 1, 1, 3, 3, false) },
642                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
643                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
644                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
645                    { { "va", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
646                }, false, false, true },
647            { 44, 56, { },
648                {
649                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
650                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
651                    { { "va", 5 }, SSAInfo(1, 2, 2, 2, 1, false) },
652                    { { "va", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
653                }, false, false, true },
654            { 56, 68, { },
655                {
656                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
657                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
658                    { { "va", 5 }, SSAInfo(1, SIZE_MAX, 3, SIZE_MAX, 0, true) },
659                    { { "va", 6 }, SSAInfo(0, 2, 2, 2, 1, false) }
660                }, false, false, true },
661            { 68, 76, { },
662                {
663                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
664                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
665                    { { "va", 5 }, SSAInfo(1, SIZE_MAX, 3, SIZE_MAX, 0, true) }
666                }, false, false, true },
667        },
668        { },
669        true, ""
670    },
671    {   /* 2 - tree (align) */
672        R"ffDXD(.regvar sa:s:8, va:v:10
673        s_mov_b32 sa[4], sa[2]  # 0
674        s_add_u32 sa[4], sa[2], s3
675        ds_read_b64 va[4:5], v0
676        v_add_f64 va[0:1], va[4:5], va[2:3]
677        v_add_f64 va[0:1], va[4:5], va[2:3]
678        v_add_f64 va[0:1], va[4:5], va[2:3]
679        .cf_jump j1,j2,j3
680        s_setpc_b64 s[0:1]
681.p2align 6
682        # 64
683j1:     v_add_f32 va[5], va[2], va[3]
684        v_mov_b32 va[6], va[2]
685        s_endpgm
686j2:     v_add_f32 va[3], va[2], va[5]
687        v_add_f32 va[6], va[2], va[3]
688        s_endpgm
689j3:     v_add_f32 va[2], va[5], va[3]
690        s_endpgm
691)ffDXD",
692        {
693            { 0, 44,
694                { { 1, false }, { 2, false }, { 3, false } },
695                {
696                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
697                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
698                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
699                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
700                    { { "sa", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
701                    { { "sa", 4 }, SSAInfo(0, 1, 1, 2, 2, false) },
702                    { { "va", 0 }, SSAInfo(0, 1, 1, 3, 3, false) },
703                    { { "va", 1 }, SSAInfo(0, 1, 1, 3, 3, false) },
704                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
705                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
706                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
707                    { { "va", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
708                }, false, false, true },
709            { 64, 76, { },
710                {
711                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
712                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
713                    { { "va", 5 }, SSAInfo(1, 2, 2, 2, 1, false) },
714                    { { "va", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
715                }, false, false, true },
716            { 76, 88, { },
717                {
718                    { { "va", 2 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
719                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
720                    { { "va", 5 }, SSAInfo(1, SIZE_MAX, 3, SIZE_MAX, 0, true) },
721                    { { "va", 6 }, SSAInfo(0, 2, 2, 2, 1, false) }
722                }, false, false, true },
723            { 88, 96, { },
724                {
725                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
726                    { { "va", 3 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
727                    { { "va", 5 }, SSAInfo(1, SIZE_MAX, 3, SIZE_MAX, 0, true) }
728                }, false, false, true },
729        },
730        { },
731        true, ""
732    },
733    {   /* 3 - longer tree (more blocks) */
734        R"ffDXD(.regvar sa:s:8, va:v:12, vb:v:10
735        # 0
736        ds_read_b64 v[2:3], v0
737        ds_read_b64 v[4:5], v0
738        v_mov_b32 va[0], v1
739        v_mul_f32 va[1], v0, v1
740        .cf_cjump tx1, tx2, tx3
741        s_setpc_b64 s[0:1]
742        # 28
743        v_mul_lo_u32 va[2], va[0], va[1]
744        v_mul_hi_u32 va[3], va[0], va[1]
745        v_lshrrev_b32 va[4], v2, va[5]
746        .cf_cjump ux1, ux2, ux3
747        s_setpc_b64 s[0:1]
748        # 52
749        v_mul_u32_u24 va[2], va[0], va[1]
750        v_mul_hi_u32_u24 va[3], va[0], va[1]
751        v_lshlrev_b32 va[5], v3, va[4]
752        .cf_cjump vx1, vx2, vx3
753        s_setpc_b64 s[0:1]
754        # 68
755        v_mul_lo_i32 va[2], va[0], va[1]
756        v_mul_hi_i32 va[3], va[0], va[1]
757        v_ashrrev_i32 va[6], v4, va[4]
758        .cf_jump wx1, wx2, wx3
759        s_setpc_b64 s[0:1]
760       
761.p2align 4
762        # 96
763tx1:    v_min_f32 vb[0], va[0], va[1]
764        v_madak_f32 vb[5], vb[0], va[1], 2.5
765        s_endpgm
766ux1:    v_nop
767        s_endpgm
768vx1:    v_add_f32 va[9], v11, vb[4]
769        s_endpgm
770wx1:    v_add_f32 va[10], v11, vb[4]
771        s_endpgm
772.p2align 4
773tx2:    v_max_f32 vb[1], va[0], va[1]
774        v_madak_f32 va[3], va[0], va[1], 2.5
775        s_endpgm
776ux2:    v_nop
777        s_nop 7
778        s_endpgm
779vx2:    v_nop
780        s_endpgm
781wx2:    v_add_f32 va[8], v19, vb[5]
782        s_endpgm
783.p2align 4
784tx3:    v_max_u32 vb[2], va[0], va[1]
785        v_madmk_f32 vb[3], va[0], 1.23, vb[1]
786        s_endpgm
787ux3:    v_add_f32 va[7], v11, vb[5]
788        s_endpgm
789vx3:    v_add_f32 va[6], v13, vb[5]
790        s_endpgm
791wx3:    v_nop
792        s_endpgm
793)ffDXD",
794        {
795            { 0, 28,
796                { { 1, false }, { 4, false }, { 8, false }, { 12, false } },
797                {
798                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
799                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
800                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
801                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
802                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, false) },
803                    { { "", 256+3 }, SSAInfo(0, 0, 0, 0, 0, false) },
804                    { { "", 256+4 }, SSAInfo(0, 0, 0, 0, 0, false) },
805                    { { "", 256+5 }, SSAInfo(0, 0, 0, 0, 0, false) },
806                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
807                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
808                }, false, false, false },
809            { 28, 52,
810                { { 2, false }, { 5, false }, { 9, false }, { 13, false } },
811                {
812                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
813                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
814                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, true) },
815                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
816                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
817                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
818                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
819                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
820                    { { "va", 5 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
821                }, false, false, false },
822            { 52, 68,
823                { { 3, false }, { 6, false }, { 10, false }, { 14, false } },
824                {
825                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
826                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
827                    { { "", 256+3, }, SSAInfo(0, 0, 0, 0, 0, true) },
828                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
829                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
830                    { { "va", 2 }, SSAInfo(1, 2, 2, 2, 1, false) },
831                    { { "va", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
832                    { { "va", 4 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
833                    { { "va", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
834                }, false, false, false },
835            { 68, 92,
836                { { 7, false }, { 11, false }, { 15, false } },
837                {
838                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
839                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
840                    { { "", 256+4 }, SSAInfo(0, 0, 0, 0, 0, true) },
841                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
842                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
843                    { { "va", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
844                    { { "va", 3 }, SSAInfo(2, 3, 3, 3, 1, false) },
845                    { { "va", 4 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
846                    { { "va", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
847                }, false, false, true },
848            // 4-7:
849            { 96, 112,
850                { },
851                {
852                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
853                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
854                    { { "vb", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
855                    { { "vb", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
856                }, false, false, true },
857            { 112, 120,
858                { },
859                { }, false, false, true },
860            { 120, 128,
861                { },
862                {
863                    { { "", 256+11 }, SSAInfo(0, 0, 0, 0, 0, true) },
864                    { { "va", 9 }, SSAInfo(0, 1, 1, 1, 1, false) },
865                    { { "vb", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
866                }, false, false, true },
867            { 128, 136,
868                { },
869                {
870                    { { "", 256+11 }, SSAInfo(0, 0, 0, 0, 0, true) },
871                    { { "va", 10 }, SSAInfo(0, 1, 1, 1, 1, false) },
872                    { { "vb", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
873                }, false, false, true },
874            // 8-11
875            { 144, 160,
876                { },
877                {
878                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
879                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
880                    { { "va", 3 }, SSAInfo(0, 4, 4, 4, 1, false) },
881                    { { "vb", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
882                }, false, false, true },
883            { 160, 172,
884                { },
885                { }, false, false, true },
886            { 172, 180,
887                { },
888                { }, false, false, true },
889            { 180, 188,
890                { },
891                {
892                    { { "", 256+19 }, SSAInfo(0, 0, 0, 0, 0, true) },
893                    { { "va", 8 }, SSAInfo(0, 1, 1, 1, 1, false) },
894                    { { "vb", 5 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
895                }, false, false, true },
896            // 12-15
897            { 192, 208,
898                { },
899                {
900                    { { "va", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
901                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
902                    { { "vb", 1 }, SSAInfo(0, SIZE_MAX, 2, SIZE_MAX, 0, true) },
903                    { { "vb", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
904                    { { "vb", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
905                }, false, false, true },
906            { 208, 216,
907                { },
908                {
909                    { { "", 256+11 }, SSAInfo(0, 0, 0, 0, 0, true) },
910                    { { "va", 7 }, SSAInfo(0, 1, 1, 1, 1, false) },
911                    { { "vb", 5 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
912                }, false, false, true },
913            { 216, 224,
914                { },
915                {
916                    { { "", 256+13 }, SSAInfo(0, 0, 0, 0, 0, true) },
917                    { { "va", 6 }, SSAInfo(0, 2, 2, 2, 1, false) },
918                    { { "vb", 5 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
919                }, false, false, true },
920            { 224, 232,
921                { },
922                { }, false, false, true }
923        },
924        { },
925        true, ""
926    },
927    {   /* 4 - empty! */
928        ".regvar sa:s:8, va:v:12, vb:v:10\n",
929        { },
930        { },
931        true, ""
932    },
933    {   /* 5 - longer blocks (tree) */
934        R"ffDXD(.regvar sa:s:8, va:v:12, vb:v:10
935        # block 0, offset - 0
936        s_mov_b32 s0, 0x11
937        s_mov_b32 s1, 0x11
938        s_mov_b64 s[2:3], 3344
939        v_mov_b32 v1, v0
940        v_add_f32 v2, v1, v0
941        v_and_b32 v1, v1, v2
942       
943        s_mov_b32 sa[0], 1
944        s_mov_b32 sa[1], 1
945        s_mov_b32 sa[2], 1
946        s_mov_b32 sa[3], 1
947       
948.rept 4
949        s_xor_b32 sa[0], sa[1], sa[3]
950        s_and_b32 sa[1], sa[2], sa[3]
951        s_xor_b32 sa[3], sa[0], sa[2]
952        s_xor_b32 sa[2], sa[1], sa[3]
953.endr
954        s_and_b32 sa[1], sa[2], sa[3]
955        s_xor_b32 sa[2], sa[1], sa[3]
956        s_xor_b32 sa[2], sa[1], sa[3]
957       
958        .cf_jump b1, b2
959        s_setpc_b64 s[4:5]
960       
961        # block 1, offset - 124
962b1:     s_add_u32 s4, s1, sa[2]
963        s_add_u32 sa[4], s2, sa[3]
964       
965        s_mov_b32 sa[6], s[4]
966.rept 3
967        s_xor_b32 sa[0], sa[6], sa[3]
968        s_and_b32 sa[5], sa[2], sa[3]
969        s_and_b32 sa[6], sa[0], sa[5]
970.endr
971        .cf_jump b11, b12
972        s_setpc_b64 s[6:7]
973       
974        # block 2, offset - 176
975b2:     v_mul_lo_u32 va[1], va[1], va[4]
976        v_mul_lo_u32 va[2], sa[1], va[1]
977        v_mov_b32 va[3], 2343
978.rept 3
979        v_mul_lo_u32 va[3], sa[1], va[3]
980        v_mul_lo_u32 va[1], sa[0], va[4]
981        v_mul_lo_u32 va[2], sa[2], va[1]
982.endr
983.rept 4
984        v_mul_lo_u32 va[1], sa[0], va[4]
985.endr
986.rept 2
987        v_mul_lo_u32 va[2], v1, v4
988.endr
989        v_and_b32 v3, v3, v2
990        s_endpgm
991       
992        # block 2, offset - xx
993b11:    v_mov_b32 va[0], 122
994        v_mov_b32 va[1], 122
995        v_mov_b32 va[2], 122
996.rept 4
997        v_xor_b32 va[0], va[1], v2
998        v_xor_b32 va[1], va[1], v1
999        v_xor_b32 va[2], sa[2], va[1]
1000.endr
1001        v_xor_b32 va[1], sa[1], v0
1002        s_xor_b32 sa[1], sa[2], s3
1003        s_endpgm
1004       
1005        # block 3, offset - xx
1006b12:    v_mov_b32 va[4], 122
1007        v_xor_b32 va[1], 112, va[1]
1008        v_xor_b32 va[0], v2, va[0]
1009.rept 5
1010        v_xor_b32 va[0], va[1], v2
1011        v_xor_b32 va[1], va[0], v0
1012        v_xor_b32 va[4], sa[3], va[4]
1013.endr
1014        v_xor_b32 va[4], sa[2], v0
1015        s_xor_b32 sa[1], sa[3], s3
1016        s_endpgm
1017)ffDXD",
1018        {
1019            { 0, 124,
1020                { { 1, false }, { 2, false } },
1021                {
1022                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1023                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1024                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
1025                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
1026                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1027                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1028                    { { "", 256+0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1029                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1030                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, false) },
1031                    { { "sa", 0 }, SSAInfo(0, 1, 1, 5, 5, false) },
1032                    { { "sa", 1 }, SSAInfo(0, 1, 1, 6, 6, false) },
1033                    { { "sa", 2 }, SSAInfo(0, 1, 1, 7, 7, false) },
1034                    { { "sa", 3 }, SSAInfo(0, 1, 1, 5, 5, false) }
1035                }, false, false, true },
1036            // block 1
1037            { 124, 176,
1038                { { 3, false }, { 4, false } },
1039                {
1040                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1041                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1042                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, false) },
1043                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
1044                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1045                    { { "sa", 0 }, SSAInfo(5, 6, 6, 8, 3, false) },
1046                    { { "sa", 2 }, SSAInfo(7, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1047                    { { "sa", 3 }, SSAInfo(5, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1048                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
1049                    { { "sa", 5 }, SSAInfo(0, 1, 1, 3, 3, false) },
1050                    { { "sa", 6 }, SSAInfo(0, 1, 1, 4, 4, false) }
1051                }, false, false, true },
1052            // block 2
1053            { 176, 328,
1054                { },
1055                {
1056                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1057                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1058                    { { "", 256+3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1059                    { { "", 256+4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1060                    { { "sa", 0 }, SSAInfo(5, SIZE_MAX, 9, SIZE_MAX, 0, true) },
1061                    { { "sa", 1 }, SSAInfo(6, SIZE_MAX, 9, SIZE_MAX, 0, true) },
1062                    { { "sa", 2 }, SSAInfo(7, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1063                    { { "va", 1 }, SSAInfo(0, 13, 13, 20, 8, true) },
1064                    { { "va", 2 }, SSAInfo(0, 6, 6, 11, 6, false) },
1065                    { { "va", 3 }, SSAInfo(0, 1, 1, 4, 4, false) },
1066                    { { "va", 4 }, SSAInfo(0, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1067                }, false, false, true },
1068            // block 3
1069            { 328, 412,
1070                { },
1071                {
1072                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1073                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1074                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1075                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1076                    { { "sa", 1 }, SSAInfo(6, 7, 7, 7, 1, true) },
1077                    { { "sa", 2 }, SSAInfo(7, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1078                    { { "va", 0 }, SSAInfo(0, 1, 1, 5, 5, false) },
1079                    { { "va", 1 }, SSAInfo(0, 1, 1, 6, 6, false) },
1080                    { { "va", 2 }, SSAInfo(0, 1, 1, 5, 5, false) }
1081                }, false, false, true },
1082            // block 4
1083            { 412, 504,
1084                { },
1085                {
1086                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1087                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1088                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1089                    { { "sa", 1 }, SSAInfo(6, 8, 8, 8, 1, false) },
1090                    { { "sa", 2 }, SSAInfo(7, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1091                    { { "sa", 3 }, SSAInfo(5, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1092                    { { "va", 0 }, SSAInfo(0, 6, 6, 11, 6, true) },
1093                    { { "va", 1 }, SSAInfo(0, 7, 7, 12, 6, true) },
1094                    { { "va", 4 }, SSAInfo(0, 1, 1, 7, 7, false) }
1095                }, false, false, true }
1096        },
1097        { },
1098        true, ""
1099    },
1100    {   // 6 - simple loop
1101        R"ffDXD(.regvar sa:s:8, va:v:8
1102        s_mov_b32 sa[0], 0
1103        s_mov_b32 sa[1], s10
1104        v_mov_b32 va[0], v0
1105        v_mov_b32 va[1], v1
1106        v_mov_b32 va[3], 0
1107        v_mov_b32 va[4], 11
1108loop:
1109        ds_read_b32 va[2], va[3]
1110        v_xor_b32 va[0], va[1], va[2]
1111        v_not_b32 va[0], va[0]
1112        v_xor_b32 va[0], 0xfff, va[0]
1113        v_xor_b32 va[4], va[4], va[2]
1114        v_not_b32 va[4], va[0]
1115        v_xor_b32 va[4], 0xfff, va[0]
1116        v_add_u32 va[1], vcc, 1001, va[1]
1117       
1118        s_add_u32 sa[0], sa[0], 1
1119        s_cmp_lt_u32 sa[0], sa[1]
1120        s_cbranch_scc1 loop
1121       
1122        v_xor_b32 va[0], 33, va[0]
1123        s_add_u32 sa[0], 14, sa[0]
1124        s_endpgm
1125)ffDXD",
1126        {
1127            { 0, 24,
1128                { },
1129                {
1130                    { { "", 10 }, SSAInfo(0, 0, 0, 0, 0, true) },
1131                    { { "", 256 }, SSAInfo(0, 0, 0, 0, 0, true) },
1132                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1133                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1134                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1135                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1136                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1137                    { { "va", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1138                    { { "va", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
1139                }, false, false, false },
1140            { 24, 84,
1141                { { 1, false }, { 2, false } },
1142                {
1143                    { { "sa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
1144                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1145                    { { "va", 0 }, SSAInfo(1, 2, 2, 4, 3, false) },
1146                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1147                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1148                    { { "va", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1149                    { { "va", 4 }, SSAInfo(1, 2, 2, 4, 3, true) }
1150                }, false, false, false },
1151            { 84, 96,
1152                { },
1153                {
1154                    { { "sa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
1155                    { { "va", 0 }, SSAInfo(4, 5, 5, 5, 1, true) }
1156                }, false, false, true, }
1157        },
1158        {   // SSA replaces
1159            { { "sa", 0 }, { { 2, 1 } } },
1160            { { "va", 1 }, { { 2, 1 } } },
1161            { { "va", 4 }, { { 4, 1 } } }
1162        },
1163        true, ""
1164    },
1165    {   // 7 - branches
1166        R"ffDXD(.regvar sa:s:8, va:v:8
1167        # block 0
1168        s_mov_b32 sa[0], s0
1169        s_mov_b32 sa[1], s1
1170        s_mov_b32 sa[2], s2
1171        s_add_u32 sa[0], sa[1], sa[2]
1172        s_mov_b32 sa[3], 31
1173        s_mov_b32 sa[4], 11
1174        s_cbranch_scc0 pp0
1175       
1176        # block 1
1177bb0:    s_xor_b32 sa[1], sa[1], sa[0]
1178        s_xor_b32 sa[1], 122, sa[1]
1179        s_xor_b32 sa[2], sa[1], sa[0]
1180        s_cbranch_scc0 pp1
1181       
1182        # block 2
1183        s_xor_b32 sa[0], 122, sa[0]
1184        s_xor_b32 sa[2], sa[0], sa[2]
1185        s_bfe_u32 sa[3], sa[2], sa[0]
1186        s_endpgm
1187       
1188        # block 3
1189pp1:    s_xor_b32 sa[1], sa[0], sa[1]
1190        s_and_b32 sa[0], sa[0], sa[1]
1191        s_xor_b32 sa[2], sa[0], sa[1]
1192        s_bfe_u32 sa[4], sa[4], sa[0]
1193        s_endpgm
1194       
1195        # block 4
1196pp0:    s_xor_b32 sa[1], sa[1], sa[0]
1197        s_sub_u32 sa[0], sa[1], sa[0]
1198        s_xor_b32 sa[1], sa[1], sa[0]
1199        s_xor_b32 sa[1], sa[1], sa[0]
1200        s_add_u32 sa[0], sa[1], sa[0]
1201        s_xor_b32 sa[2], sa[1], sa[2]
1202        s_add_u32 sa[2], sa[0], sa[0]
1203        s_cbranch_scc0 pp2
1204       
1205        # block 5
1206        s_xor_b32 sa[2], sa[1], sa[2]
1207        s_add_u32 sa[2], sa[0], sa[0]
1208        s_xor_b32 sa[2], sa[1], sa[2]
1209        s_sub_u32 sa[4], sa[4], sa[0]
1210        s_sub_u32 sa[4], sa[4], sa[2]
1211        s_branch bb0
1212       
1213        # block 6
1214pp2:    s_xor_b32 sa[1], sa[1], sa[0]
1215        s_xor_b32 sa[0], sa[1], sa[2]
1216        s_add_u32 sa[0], sa[1], sa[2]
1217        s_and_b32 sa[3], sa[3], sa[0]
1218        s_bfe_u32 sa[3], sa[3], sa[4]
1219        s_bfe_u32 sa[3], sa[3], sa[1]
1220        s_branch bb0
1221)ffDXD",
1222        {
1223            // block 0
1224            { 0, 28,
1225                { { 1, false }, { 4, false } },
1226                {
1227                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1228                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1229                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1230                    { { "sa", 0 }, SSAInfo(0, 1, 1, 2, 2, false) },
1231                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1232                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1233                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1234                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
1235                }, false, false, false },
1236            // block 1
1237            { 28, 48,
1238                { { 2, false }, { 3, false } },
1239                {
1240                    { { "sa", 0 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
1241                    { { "sa", 1 }, SSAInfo(1, 2, 2, 3, 2, true) },
1242                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, false) },
1243                }, false, false, false },
1244            // block 2
1245            { 48, 68,
1246                { },
1247                {
1248                    { { "sa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
1249                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1250                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) }
1251                }, false, false, true },
1252            // block 3
1253            { 68, 88,
1254                { },
1255                {
1256                    { { "sa", 0 }, SSAInfo(2, 4, 4, 4, 1, true) },
1257                    { { "sa", 1 }, SSAInfo(3, 4, 4, 4, 1, true) },
1258                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, false) },
1259                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
1260                }, false, false, true },
1261            // block 4
1262            { 88, 120,
1263                { { 5, false }, { 6, false } },
1264                {
1265                    { { "sa", 0 }, SSAInfo(2, 5, 5, 6, 2, true) },
1266                    { { "sa", 1 }, SSAInfo(1, 5, 5, 7, 3, true) },
1267                    { { "sa", 2 }, SSAInfo(1, 5, 5, 6, 2, true) }
1268                }, false, false, false },
1269            // block 5
1270            { 120, 144,
1271                { { 1, false } },
1272                {
1273                    { { "sa", 0 }, SSAInfo(6, SIZE_MAX, 7, SIZE_MAX, 0, true) },
1274                    { { "sa", 1 }, SSAInfo(7, SIZE_MAX, 8, SIZE_MAX, 0, true) },
1275                    { { "sa", 2 }, SSAInfo(6, 7, 7, 9, 3, true) },
1276                    { { "sa", 4 }, SSAInfo(1, 3, 3, 4, 2, true) }
1277                }, false, false, true },
1278            // block 6
1279            { 144, 172,
1280                { { 1, false } },
1281                {
1282                    { { "sa", 0 }, SSAInfo(6, 7, 7, 8, 2, true) },
1283                    { { "sa", 1 }, SSAInfo(7, 8, 8, 8, 1, true) },
1284                    { { "sa", 2 }, SSAInfo(6, SIZE_MAX, 10, SIZE_MAX, 0, true) },
1285                    { { "sa", 3 }, SSAInfo(1, 3, 3, 5, 3, true) },
1286                    { { "sa", 4 }, SSAInfo(1, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1287                }, false, false, true }
1288        },
1289        {
1290            { { "sa", 0 }, { { 6, 2 }, { 8, 2 } } },
1291            { { "sa", 1 }, { { 7, 1 }, { 8, 1 } } },
1292            { { "sa", 4 }, { { 4, 1 } } }
1293        },
1294        true, ""
1295    },
1296    {   // 8 - two loops, one nested
1297        R"ffDXD(.regvar sa:s:8, va:v:8
1298        s_mov_b64 sa[0:1], 0
1299        v_mov_b32 va[0], v1
1300        v_mov_b32 va[1], v2
1301        v_mov_b32 va[2], v3
1302       
1303loop0:  v_lshrrev_b32 va[0], va[2], va[0]
1304        v_xor_b32 va[0], va[1], va[0]
1305       
1306        s_xor_b32 sa[3], sa[0], 0x5
1307        s_cmp_eq_u32 sa[3], 9
1308        s_cbranch_scc1 bb0
1309       
1310        v_and_b32 va[0], -15, va[0]
1311        v_sub_u32 va[0], vcc, -13, va[0]
1312        s_branch loop1start
1313       
1314bb0:    v_xor_b32 va[0], 15, va[0]
1315        v_add_u32 va[0], vcc, 17, va[0]
1316loop1start:
1317        s_mov_b32 sa[1], sa[0]
1318       
1319loop1:  v_add_u32 va[2], vcc, va[2], va[1]
1320        v_xor_b32 va[2], 0xffaaaa, va[0]
1321       
1322        s_xor_b32 sa[2], sa[1], 0x5
1323        s_cmp_eq_u32 sa[2], 7
1324        s_cbranch_scc1 bb1
1325       
1326        v_sub_u32 va[1], vcc, 5, va[1]
1327        v_sub_u32 va[2], vcc, 7, va[2]
1328        s_branch loop1end
1329       
1330bb1:    v_xor_b32 va[1], 15, va[1]
1331        v_xor_b32 va[2], 17, va[2]
1332loop1end:
1333       
1334        s_add_u32 sa[1], sa[1], 1
1335        s_cmp_lt_u32 sa[1], 52
1336        s_cbranch_scc1 loop1
1337       
1338        v_xor_b32 va[0], va[1], va[0]
1339        v_xor_b32 va[0], va[2], va[0]
1340        v_xor_b32 va[0], sa[0], va[0]
1341       
1342        s_add_u32 sa[0], sa[0], 1
1343        s_cmp_lt_u32 sa[0], 33
1344        s_cbranch_scc1 loop0
1345       
1346        s_endpgm
1347)ffDXD",
1348        {
1349            // block 0
1350            { 0, 16,
1351                { },
1352                {
1353                    { { "", 256+1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1354                    { { "", 256+2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1355                    { { "", 256+3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1356                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1357                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1358                    { { "va", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1359                    { { "va", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1360                    { { "va", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
1361                }, false, false, false },
1362            // block 1 (loop0)
1363            { 16, 36,
1364                { { 2, false }, { 3, false } },
1365                {
1366                    { { "sa", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1367                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1368                    { { "va", 0 }, SSAInfo(1, 2, 2, 3, 2, true) },
1369                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1370                    { { "va", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1371                }, false, false, false },
1372            // block 2 (to bb0)
1373            { 36, 48,
1374                { { 4, false } },
1375                {
1376                    { { "va", 0 }, SSAInfo(3, 4, 4, 5, 2, true) }
1377                }, false, false, true },
1378            // block 3 (bb0)
1379            { 48, 56,
1380                { },
1381                {
1382                    { { "va", 0 }, SSAInfo(3, 9, 9, 10, 2, true) }
1383                }, false, false, false },
1384            // block 4 (loop1start)
1385            { 56, 60,
1386                { },
1387                {
1388                    { { "sa", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1389                    { { "sa", 1 }, SSAInfo(1, 2, 2, 2, 1, false) }
1390                }, false, false, false },
1391            // block 5 (loop1)
1392            { 60, 84,
1393                { { 6, false }, { 7, false } },
1394                {
1395                    { { "sa", 1 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
1396                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1397                    { { "va", 0 }, SSAInfo(5, SIZE_MAX, 6, SIZE_MAX, 0, true) },
1398                    { { "va", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1399                    { { "va", 2 }, SSAInfo(1, 2, 2, 3, 2, true) }
1400                }, false, false, false },
1401            // block 6 (to bb1)
1402            { 84, 96,
1403                { { 8, false } },
1404                {
1405                    { { "va", 1 }, SSAInfo(1, 2, 2, 2, 1, true) },
1406                    { { "va", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
1407                }, false, false, true },
1408            // block 7 (b11)
1409            { 96, 104,
1410                { },
1411                {
1412                    { { "va", 1 }, SSAInfo(1, 3, 3, 3, 1, true) },
1413                    { { "va", 2 }, SSAInfo(3, 5, 5, 5, 1, true) }
1414                }, false, false, false },
1415            // block 8 (loop1end)
1416            { 104, 116,
1417                { { 5, false }, { 9, false } },
1418                {
1419                    { { "sa", 1 }, SSAInfo(2, 3, 3, 3, 1, true) }
1420                }, false, false, false },
1421            // block 9 (loop0end)
1422            { 116, 140,
1423                { { 1, false }, { 10, false } },
1424                {
1425                    { { "sa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) },
1426                    { { "va", 0 }, SSAInfo(5, 6, 6, 8, 3, true) },
1427                    { { "va", 1 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
1428                    { { "va", 2 }, SSAInfo(4, SIZE_MAX, 5, SIZE_MAX, 0, true) }
1429                }, false, false, false },
1430            // block 10 (to bb0)
1431            { 140, 144,
1432                { },
1433                { }, false, false, true }
1434        },
1435        {   // SSA replaces
1436            { { "sa", 0 }, { { 2, 1 } } },
1437            { { "sa", 1 }, { { 3, 2 } } },
1438            { { "va", 0 }, { { 8, 1 }, { 10, 5 } } },
1439            { { "va", 1 }, { { 2, 1 }, { 3, 1 }, { 3, 2 } } },
1440            { { "va", 2 }, { { 4, 1 }, { 5, 1 }, { 5, 4 } } }
1441        },
1442        true, ""
1443    },
1444    {   // 9 - two branches
1445        R"ffDXD(.regvar sa:s:8, va:v:8
1446        # block 0
1447        s_mov_b64 sa[0:1], 321
1448        s_mov_b32 sa[2], s1
1449        s_mov_b32 sa[3], s2
1450        s_cmpk_eq_u32 s1, 321
1451        s_cbranch_scc1 bb10
1452       
1453        # block 1
1454        s_add_u32 sa[0], sa[0], sa[1]
1455        s_add_u32 sa[0], sa[0], sa[1]
1456        s_add_u32 sa[0], sa[0], sa[1]
1457        s_cbranch_scc1 bb01
1458       
1459        # block 2
1460        s_add_u32 sa[0], sa[0], sa[1]
1461        s_add_u32 sa[0], sa[0], sa[1]
1462        s_branch bb0e
1463       
1464        # block 3
1465bb01:   s_add_u32 sa[0], sa[0], sa[1]
1466        s_add_u32 sa[0], sa[0], sa[1]
1467       
1468        # block 4
1469bb0e:   s_add_u32 sa[0], sa[0], sa[2]
1470        s_endpgm
1471       
1472        # block 5
1473bb10:   s_add_u32 sa[0], sa[0], sa[1]
1474        s_add_u32 sa[0], sa[0], sa[1]
1475        s_add_u32 sa[0], sa[0], sa[1]
1476        s_add_u32 sa[0], sa[0], sa[1]
1477        s_add_u32 sa[0], sa[0], sa[1]
1478        s_cbranch_scc1 bb11
1479       
1480        # block 6
1481        s_add_u32 sa[0], sa[0], sa[2]
1482        s_add_u32 sa[0], sa[0], sa[2]
1483        s_branch bb1e
1484       
1485        # block 7
1486bb11:   s_add_u32 sa[0], sa[0], sa[3]
1487        s_add_u32 sa[0], sa[0], sa[3]
1488       
1489        # block 8
1490bb1e:   s_add_u32 sa[0], sa[0], sa[1]
1491        s_endpgm
1492)ffDXD",
1493        {
1494            // block 0 - start
1495            { 0, 24,
1496                { { 1, false }, { 5, false } },
1497                {
1498                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1499                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1500                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1501                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1502                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1503                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1504                }, false, false, false },
1505            // block 1 - bb00
1506            { 24, 40,
1507                { { 2, false }, { 3, false } },
1508                {
1509                    { { "sa", 0 }, SSAInfo(1, 2, 2, 4, 3, true) },
1510                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1511                }, false, false, false },
1512            // block 2 - bb00 second
1513            { 40, 52,
1514                { { 4, false } },
1515                {
1516                    { { "sa", 0 }, SSAInfo(4, 5, 5, 6, 2, true) },
1517                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1518                }, false, false, true },
1519            // block 3 - bb01
1520            { 52, 60,
1521                { },
1522                {
1523                    { { "sa", 0 }, SSAInfo(4, 8, 8, 9, 2, true) },
1524                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1525                }, false, false, false },
1526            // block 4 - bb0e
1527            { 60, 68,
1528                { },
1529                {
1530                    { { "sa", 0 }, SSAInfo(6, 7, 7, 7, 1, true) },
1531                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1532                }, false, false, true },
1533            // block 5 - bb10
1534            { 68, 92,
1535                { { 6, false }, { 7, false } },
1536                {
1537                    { { "sa", 0 }, SSAInfo(1, 10, 10, 14, 5, true) },
1538                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1539                }, false, false, false },
1540            // block 6 - bb10 (second)
1541            { 92, 104,
1542                { { 8, false } },
1543                {
1544                    { { "sa", 0 }, SSAInfo(14, 15, 15, 16, 2, true) },
1545                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1546                }, false, false, true },
1547            // block 7 - bb11
1548            { 104, 112,
1549                { },
1550                {
1551                    { { "sa", 0 }, SSAInfo(14, 18, 18, 19, 2, true) },
1552                    { { "sa", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1553                }, false, false, false },
1554            // block 8 - bb1e
1555            { 112, 120,
1556                { },
1557                {
1558                    { { "sa", 0 }, SSAInfo(16, 17, 17, 17, 1, true) },
1559                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1560                }, false, false, true }
1561        },
1562        {   // SSA replaces
1563            { { "sa", 0 }, { { 9, 6 }, { 19, 16 } } }
1564        },
1565        true, ""
1566    },
1567    {   // 10 - two branches with various SSAIds
1568        R"ffDXD(.regvar sa:s:8, va:v:8
1569        # block 0
1570        s_mov_b32 sa[0], s2
1571        s_mov_b32 sa[1], s3
1572        s_mov_b32 sa[2], s4
1573        s_mov_b32 sa[3], s5
1574       
1575        s_cmp_lt_u32 s0, s1
1576        s_cbranch_scc1 bb1
1577       
1578        # block 1, bb0
1579bb0:    s_add_u32 sa[3], sa[3], s1   # replace from this
1580        s_add_u32 sa[3], sa[3], s2
1581        s_cbranch_scc1 bb01
1582       
1583        # block 2, bb00
1584        s_add_u32 sa[2], sa[2], sa[1]   # replace from this
1585        s_add_u32 sa[3], sa[3], sa[2]
1586        s_endpgm
1587
1588bb01:   s_add_u32 sa[2], sa[2], sa[1]
1589        s_add_u32 sa[2], sa[2], sa[0]
1590        s_add_u32 sa[3], sa[3], sa[2]
1591        s_endpgm
1592       
1593bb1:    s_xor_b32 sa[2], sa[2], sa[0]
1594        s_xor_b32 sa[3], sa[3], sa[1]
1595        s_branch bb0
1596)ffDXD",
1597        {
1598            // block 0 - start
1599            { 0, 24,
1600                { { 1, false }, { 4, false } },
1601                {
1602                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1603                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1604                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1605                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1606                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1607                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1608                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1609                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1610                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1611                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1612                }, false, false, false },
1613            // block 1 - bb0
1614            { 24, 36,
1615                { { 2, false }, { 3, false } },
1616                {
1617                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1618                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1619                    { { "sa", 3 }, SSAInfo(1, 2, 2, 3, 2, true) }
1620                }, false, false, false },
1621            // block 2 - bb00
1622            { 36, 48,
1623                { },
1624                {
1625                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1626                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1627                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
1628                }, false, false, true },
1629            // block 3 - bb01
1630            { 48, 64,
1631                { },
1632                {
1633                    { { "sa", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1634                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1635                    { { "sa", 2 }, SSAInfo(1, 3, 3, 4, 2, true) },
1636                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
1637                }, false, false, true },
1638            // block 4 - bb1
1639            { 64, 76,
1640                { { 1, false } },
1641                {
1642                    { { "sa", 0 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1643                    { { "sa", 1 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1644                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, true) },
1645                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, true) }
1646                }, false, false, true }
1647        },
1648        {   // SSA replaces
1649            { { "sa", 2 }, { { 5, 1 } } },
1650            { { "sa", 3 }, { { 6, 1 } } }
1651        },
1652        true, ""
1653    },
1654    {   // 11 - with trap: first branch have unhandled SSA replace
1655        R"ffDXD(.regvar sa:s:8, va:v:8
1656        # block 0
1657        s_mov_b32 sa[0], s2
1658        s_mov_b32 sa[1], s3
1659        s_mov_b32 sa[2], s4
1660        s_mov_b32 sa[3], s5
1661        s_cmp_lt_u32 s0, s1
1662        s_cbranch_scc1 bb1
1663       
1664        # bb0
1665bb0:    s_add_u32 sa[3], sa[3], s1      # SSAID replace
1666        s_add_u32 sa[3], sa[3], s2
1667        s_endpgm
1668       
1669bb3:    s_add_u32 sa[3], sa[3], s2      # no SSAID replace (this same SSAID)
1670        s_endpgm
1671       
1672bb1:    s_add_u32 sa[3], sa[3], s2
1673bb1x:   .cf_jump bb3, bb2, bb4
1674        s_setpc_b64 s[0:1]
1675
1676bb2:    s_branch bb0
1677       
1678bb4:    s_branch bb1x       # jump to point to resolve conflict (bb1x)
1679)ffDXD",
1680        {
1681            // block 0
1682            { 0, 24,
1683                { { 1, false }, { 3, false } },
1684                {
1685                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1686                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1687                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1688                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1689                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1690                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1691                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1692                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1693                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1694                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1695                }, false, false, false },
1696            // block 1
1697            { 24, 36,
1698                { },
1699                {
1700                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1701                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1702                    { { "sa", 3 }, SSAInfo(1, 2, 2, 3, 2, true) }
1703                }, false, false, true },
1704            // block 2
1705            { 36, 44,
1706                { },
1707                {
1708                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1709                    { { "sa", 3 }, SSAInfo(4, 5, 5, 5, 1, true) }
1710                }, false, false, true },
1711            // block 3 - bb1 - main part
1712            { 44, 48,
1713                { },
1714                {
1715                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1716                    { { "sa", 3 }, SSAInfo(1, 4, 4, 4, 1, true) }
1717                }, false, false, false },
1718            // block 4 - bb1x - jmp part
1719            { 48, 52,
1720                { { 2, false }, { 5, false }, { 6, false } },
1721                {
1722                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1723                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
1724                }, false, false, true },
1725            // block 5
1726            { 52, 56,
1727                { { 1, false } },
1728                { }, false, false, true },
1729            // block 6
1730            { 56, 60,
1731                { { 4, false } },
1732                { }, false, false, true }
1733        },
1734        {
1735            { { "sa", 3 }, { { 4, 1 } } }
1736        },
1737        true, ""
1738    },
1739    {   // 12 - with trap: first branch have higher SSAId
1740        R"ffDXD(.regvar sa:s:8, va:v:8
1741        # block 0
1742        s_mov_b32 sa[0], s2
1743        s_mov_b32 sa[1], s3
1744        s_mov_b32 sa[2], s4
1745        s_mov_b32 sa[3], s5
1746        s_cmp_lt_u32 s0, s1
1747        .cf_jump bb1, bbx, bb3, bb2
1748        s_setpc_b64 s[0:1]
1749       
1750bb1:    s_add_u32 sa[3], sa[3], sa[2]
1751        s_endpgm
1752       
1753bbx:    s_add_u32 sa[3], sa[3], sa[2]
1754        s_cbranch_scc1 bb1_
1755
1756bb0:    s_add_u32 sa[3], sa[3], sa[2]
1757        s_endpgm
1758       
1759bb1_:   s_branch bb1
1760
1761bb3:    .cf_jump bb0, bb1_
1762        s_setpc_b64 s[0:1]
1763               
1764bb2:    s_add_u32 sa[3], sa[3], sa[2]
1765        s_branch bb3
1766)ffDXD",
1767        {
1768            // block 0
1769            { 0, 24,
1770                { { 1, false }, { 2, false }, { 5, false }, { 6, false } },
1771                {
1772                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1773                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1774                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1775                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1776                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1777                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1778                    { { "sa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
1779                    { { "sa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) },
1780                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1781                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1782                }, false, false, true },
1783            // block 1 - bb1
1784            { 24, 32,
1785                { },
1786                {
1787                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1788                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1789                }, false, false, true },
1790            // block 2 - bbx
1791            { 32, 40,
1792                { { 3, false }, { 4, false } },
1793                {
1794                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1795                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) }
1796                }, false, false, false },
1797            // block 3 - bb0
1798            { 40, 48,
1799                { },
1800                {
1801                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1802                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
1803                }, false, false, true },
1804            // block 4 - bb1_
1805            { 48, 52,
1806                { { 1, false } },
1807                { }, false, false, true },
1808            // block 5
1809            { 52, 56,
1810                { { 3, false }, { 4, false } },
1811                {
1812                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1813                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
1814                }, false, false, true },
1815            // block 5
1816            { 56, 64,
1817                { { 5, false } },
1818                {
1819                    { { "sa", 2 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) },
1820                    { { "sa", 3 }, SSAInfo(1, 5, 5, 5, 1, true) }
1821                }, false, false, true }
1822        },
1823        {
1824            { { "sa", 3 }, { { 3, 1 }, { 5, 3 }, { 5, 1 } } }
1825        },
1826        true, ""
1827    },
1828    {   // 13 - yet another branch example
1829        R"ffDXD(.regvar sa:s:8, va:v:8
1830        s_mov_b32 sa[2], s4
1831        s_mov_b32 sa[3], s5
1832       
1833        .cf_cjump b1, b2, b3
1834        s_setpc_b64 s[0:1]
1835
1836b0:     s_xor_b32 sa[2], sa[2], sa[4]
1837        s_xor_b32 sa[3], sa[3], sa[4]
1838        s_endpgm
1839       
1840b1:     s_xor_b32 sa[2], sa[2], sa[4]
1841        s_xor_b32 sa[3], sa[3], sa[4]
1842b1x:    s_xor_b32 sa[2], sa[2], sa[4]
1843        s_branch b0
1844       
1845b2:     s_xor_b32 sa[2], sa[2], sa[4]
1846        s_xor_b32 sa[3], sa[3], sa[4]
1847b2x:    s_xor_b32 sa[2], sa[2], sa[4]
1848        s_branch b1x
1849       
1850b3:     s_xor_b32 sa[2], sa[2], sa[4]
1851        s_xor_b32 sa[3], sa[3], sa[4]
1852        s_branch b2x
1853)ffDXD",
1854        {
1855            // block 0
1856            { 0, 12,
1857                { { 1, false }, { 2, false }, { 4, false }, { 6, false } },
1858                {
1859                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1860                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1861                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1862                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1863                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1864                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1865                }, false, false, false },
1866            // block 1 - b0
1867            { 12, 24,
1868                { },
1869                {
1870                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1871                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
1872                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1873                }, false, false, true },
1874            // block 2 - b1
1875            { 24, 32,
1876                { },
1877                {
1878                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) },
1879                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
1880                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1881                }, false, false, false },
1882            // block 3 - b1x
1883            { 32, 40,
1884                { { 1, false } },
1885                {
1886                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
1887                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1888                }, false, false, true },
1889            // block 4 - b2
1890            { 40, 48,
1891                { },
1892                {
1893                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, true) },
1894                    { { "sa", 3 }, SSAInfo(1, 4, 4, 4, 1, true) },
1895                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1896                }, false, false, false },
1897            // block 5 - b2x
1898            { 48, 56,
1899                { { 3, false } },
1900                {
1901                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
1902                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1903                }, false, false, true },
1904            // block 6 - b3
1905            { 56, 68,
1906                { { 5, false } },
1907                {
1908                    { { "sa", 2 }, SSAInfo(1, 7, 7, 7, 1, true) },
1909                    { { "sa", 3 }, SSAInfo(1, 5, 5, 5, 1, true) },
1910                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
1911                }, false, false, true }
1912        },
1913        {   // SSA replaces
1914            { { "sa", 2 }, { { 4, 1 }, { 6, 3 }, { 7, 5 } } },
1915            { { "sa", 3 }, { { 3, 1 }, { 4, 1 }, { 5, 1 } } }
1916        },
1917        true, ""
1918    },
1919    {   // 14 -
1920        R"ffDXD(.regvar sa:s:8, va:v:8
1921        s_mov_b32 sa[2], s4
1922        s_mov_b32 sa[3], s5
1923        .cf_jump b1, b2
1924        s_setpc_b64 s[0:1]
1925       
1926b11:    s_xor_b32 sa[2], sa[2], sa[3]
1927        s_endpgm
1928       
1929b1:     s_xor_b32 sa[2], sa[2], sa[3]
1930        s_branch b11
1931       
1932b2:     s_branch b11
1933)ffDXD",
1934        {
1935            // block 0 - start
1936            { 0, 12,
1937                { { 2, false }, { 3, false } },
1938                {
1939                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1940                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1941                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1942                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1943                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1944                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1945                }, false, false, true },
1946            // block 1 - b11
1947            { 12, 20,
1948                { },
1949                {
1950                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1951                    { { "sa", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1952                }, false, false, true },
1953            // block 2 - b1
1954            { 20, 28,
1955                { { 1, false } },
1956                {
1957                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1958                    { { "sa", 3 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
1959                }, false, false, true },
1960            // block 3 - b2
1961            { 28, 32,
1962                { { 1, false } },
1963                { }, false, false, true }
1964        },
1965        {
1966            { { "sa", 2 }, { { 2, 1 } } }
1967        },
1968        true, ""
1969    },
1970    {   // 15 - trick - SSA replaces beyond visited point
1971        R"ffDXD(.regvar sa:s:8, va:v:8
1972        s_mov_b32 sa[2], s4
1973        s_mov_b32 sa[3], s5
1974       
1975loop:   s_xor_b32 sa[2], sa[2], sa[4]
1976        s_cbranch_scc0 end
1977       
1978        s_xor_b32 sa[3], sa[2], sa[4]
1979        s_cbranch_scc0 loop
1980       
1981        s_endpgm
1982       
1983end:    s_xor_b32 sa[3], sa[3], sa[4]
1984        s_endpgm
1985)ffDXD",
1986        {
1987            // block 0 - start
1988            { 0, 8,
1989                { },
1990                {
1991                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1992                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
1993                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1994                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
1995                }, false, false, false },
1996            // block 1 - loop
1997            { 8, 16,
1998                { { 2, false }, { 4, false } },
1999                {
2000                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2001                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2002                }, false, false, false },
2003            // block 2 - loop part 2
2004            { 16, 24,
2005                { { 1, false }, { 3, false } },
2006                {
2007                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
2008                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
2009                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2010                }, false, false, false },
2011            // block 3 - end 2
2012            { 24, 28,
2013                { },
2014                { }, false, false, true },
2015            // block 4 - end
2016            { 28, 36,
2017                { },
2018                {
2019                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
2020                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2021                }, false, false, true }
2022        },
2023        {
2024            { { "sa", 2 }, { { 2, 1 } } },
2025            // must be
2026            { { "sa", 3 }, { { 2, 1 } } }
2027        },
2028        true, ""
2029    },
2030    {   // 16 - trick - SSA replaces beyond visited point
2031        R"ffDXD(.regvar sa:s:8, va:v:8
2032        s_mov_b32 sa[2], s4
2033        s_mov_b32 sa[3], s5
2034       
2035loop:   s_xor_b32 sa[2], sa[2], sa[4]
2036        s_cbranch_scc0 end
2037       
2038        s_xor_b32 sa[3], sa[2], sa[4]
2039        s_cbranch_scc0 loop
2040       
2041end:    s_xor_b32 sa[3], sa[3], sa[4]
2042        s_endpgm
2043)ffDXD",
2044        {
2045            // block 0 - start
2046            { 0, 8,
2047                { },
2048                {
2049                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2050                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2051                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2052                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2053                }, false, false, false },
2054            // block 1 - loop
2055            { 8, 16,
2056                { { 2, false }, { 3, false } },
2057                {
2058                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2059                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2060                }, false, false, false },
2061            // block 2 - loop part 2
2062            { 16, 24,
2063                { { 1, false }, { 3, false } },
2064                {
2065                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
2066                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
2067                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2068                }, false, false, false },
2069            // block 3 - end
2070            { 24, 32,
2071                { },
2072                {
2073                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
2074                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2075                }, false, false, true }
2076        },
2077        {
2078            { { "sa", 2 }, { { 2, 1 } } },
2079            // must be
2080            { { "sa", 3 }, { { 2, 1 } } }
2081        },
2082        true, ""
2083    },
2084    {   // 17 - simple call
2085        R"ffDXD(.regvar sa:s:8, va:v:8
2086        s_mov_b32 sa[2], s4
2087        s_mov_b32 sa[3], s5
2088       
2089        s_getpc_b64 s[2:3]
2090        s_add_u32 s2, s2, routine-.
2091        s_add_u32 s3, s3, routine-.+4
2092        .cf_call routine
2093        s_swappc_b64 s[0:1], s[2:3]
2094       
2095        s_lshl_b32 sa[2], sa[2], 3
2096        s_lshl_b32 sa[3], sa[3], 4
2097        s_endpgm
2098       
2099routine:
2100        s_xor_b32 sa[2], sa[2], sa[4]
2101        s_xor_b32 sa[3], sa[3], sa[4]
2102        .cf_ret
2103        s_setpc_b64 s[0:1]
2104)ffDXD",
2105        {
2106            { 0, 32,
2107                { { 2, true } },
2108                {
2109                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2110                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2111                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2112                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2113                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2114                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2115                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2116                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2117                }, true, false, false },
2118            { 32, 44,
2119                { },
2120                {
2121                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2122                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2123                }, false, false, true },
2124            { 44, 56,
2125                { },
2126                {
2127                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2128                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2129                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2130                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2131                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2132                }, false, true, true }
2133        },
2134        { },
2135        true, ""
2136    },
2137    {   // 18 - simple call, more complex routine
2138        R"ffDXD(.regvar sa:s:8, va:v:8
2139        s_mov_b32 sa[2], s4
2140        s_mov_b32 sa[3], s5
2141       
2142        s_getpc_b64 s[2:3]
2143        s_add_u32 s2, s2, routine-.
2144        s_add_u32 s3, s3, routine-.+4
2145        .cf_call routine
2146        s_swappc_b64 s[0:1], s[2:3]
2147       
2148        s_lshl_b32 sa[2], sa[2], 3
2149        s_lshl_b32 sa[3], sa[3], 4
2150        s_endpgm
2151       
2152routine:
2153        s_xor_b32 sa[2], sa[2], sa[4]
2154        s_xor_b32 sa[3], sa[3], sa[4]
2155        s_cbranch_scc1 bb1
2156       
2157        s_min_u32 sa[2], sa[2], sa[4]
2158        s_min_u32 sa[3], sa[3], sa[4]
2159        .cf_ret
2160        s_setpc_b64 s[0:1]
2161       
2162bb1:    s_and_b32 sa[2], sa[2], sa[4]
2163        s_and_b32 sa[3], sa[3], sa[4]
2164        .cf_ret
2165        s_setpc_b64 s[0:1]
2166)ffDXD",
2167        {
2168            { 0, 32,
2169                { { 2, true } },
2170                {
2171                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2172                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2173                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2174                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2175                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2176                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2177                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2178                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2179                }, true, false, false },
2180            // block 1 - after call
2181            { 32, 44,
2182                { },
2183                {
2184                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2185                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
2186                }, false, false, true },
2187            // block 2 - routine
2188            { 44, 56,
2189                { { 3, false }, { 4, false } },
2190                {
2191                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2192                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2193                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2194                }, false, false, false },
2195            // block 3 - first return
2196            { 56, 68,
2197                { },
2198                {
2199                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2200                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2201                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2202                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
2203                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2204                }, false, true, true },
2205            // block 4 - second return
2206            { 68, 80,
2207                { },
2208                {
2209                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2210                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2211                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2212                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
2213                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2214                }, false, true, true }
2215        },
2216        {   // SSA replaces
2217            { { "sa", 2 }, { { 4, 3 } } },
2218            { { "sa", 3 }, { { 4, 3 } } }
2219        },
2220        true, ""
2221    },
2222    {   // 19 - simple call, more complex routine
2223        R"ffDXD(.regvar sa:s:8, va:v:8
2224        s_mov_b32 sa[2], s4
2225        s_mov_b32 sa[3], s5
2226       
2227        s_getpc_b64 s[2:3]
2228        s_add_u32 s2, s2, routine-.
2229        s_add_u32 s3, s3, routine-.+4
2230        .cf_call routine
2231        s_swappc_b64 s[0:1], s[2:3]
2232       
2233        s_lshl_b32 sa[2], sa[2], 3
2234        s_lshl_b32 sa[3], sa[3], 4
2235        s_endpgm
2236       
2237routine:
2238        s_xor_b32 sa[2], sa[2], sa[4]
2239        s_cbranch_scc1 bb1
2240       
2241        s_min_u32 sa[2], sa[2], sa[4]
2242        s_xor_b32 sa[3], sa[3], sa[4]
2243        .cf_ret
2244        s_setpc_b64 s[0:1]
2245       
2246bb1:    s_and_b32 sa[2], sa[2], sa[4]
2247        .cf_ret
2248        s_setpc_b64 s[0:1]
2249)ffDXD",
2250        {
2251            { 0, 32,
2252                { { 2, true } },
2253                {
2254                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2255                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2256                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2257                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2258                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2259                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2260                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2261                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2262                }, true, false, false },
2263            // block 1 - after call
2264            { 32, 44,
2265                { },
2266                {
2267                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2268                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) }
2269                }, false, false, true },
2270            // block 2 - routine
2271            { 44, 52,
2272                { { 3, false }, { 4, false } },
2273                {
2274                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2275                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2276                }, false, false, false },
2277            // block 3 - first return
2278            { 52, 64,
2279                { },
2280                {
2281                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2282                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2283                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2284                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2285                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2286                }, false, true, true },
2287            // block 4 - second return
2288            { 64, 72,
2289                { },
2290                {
2291                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2292                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2293                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2294                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2295                }, false, true, true }
2296        },
2297        {   // SSA replaces
2298            { { "sa", 2 }, { { 4, 3 } } },
2299            { { "sa", 3 }, { { 2, 1 } } }
2300        },
2301        true, ""
2302    },
2303    {   // 20 - simple call, more complex routine
2304        R"ffDXD(.regvar sa:s:8, va:v:8
2305        s_mov_b32 sa[2], s4
2306        s_mov_b32 sa[3], s5
2307       
2308        s_getpc_b64 s[2:3]
2309        s_add_u32 s2, s2, routine-.
2310        s_add_u32 s3, s3, routine-.+4
2311        .cf_call routine
2312        s_swappc_b64 s[0:1], s[2:3]
2313       
2314        s_lshl_b32 sa[2], sa[2], 3
2315        s_lshl_b32 sa[3], sa[3], 4
2316        s_endpgm
2317       
2318routine:
2319        s_xor_b32 sa[2], sa[2], sa[4]
2320        s_xor_b32 sa[3], sa[3], sa[4]
2321        s_cbranch_scc1 bb1
2322       
2323        s_min_u32 sa[2], sa[2], sa[4]
2324        .cf_ret
2325        s_setpc_b64 s[0:1]
2326       
2327bb1:    s_and_b32 sa[2], sa[2], sa[4]
2328        .cf_ret
2329        s_setpc_b64 s[0:1]
2330)ffDXD",
2331        {
2332            { 0, 32,
2333                { { 2, true } },
2334                {
2335                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2336                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2337                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2338                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2339                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2340                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2341                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2342                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2343                }, true, false, false },
2344            // block 1 - after call
2345            { 32, 44,
2346                { },
2347                {
2348                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2349                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2350                }, false, false, true },
2351            // block 2 - routine
2352            { 44, 56,
2353                { { 3, false }, { 4, false } },
2354                {
2355                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2356                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2357                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2358                }, false, false, false },
2359            // block 3 - first return
2360            { 56, 64,
2361                { },
2362                {
2363                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2364                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2365                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2366                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2367                }, false, true, true },
2368            // block 4 - second return
2369            { 64, 72,
2370                { },
2371                {
2372                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2373                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2374                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2375                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2376                }, false, true, true }
2377        },
2378        {   // SSA replaces
2379            { { "sa", 2 }, { { 4, 3 } } }
2380        },
2381        true, ""
2382    },
2383    {   // 21 - simple call, many deep returns
2384        R"ffDXD(.regvar sa:s:8, va:v:8
2385        s_mov_b32 sa[2], s4
2386        s_mov_b32 sa[3], s5
2387       
2388        s_getpc_b64 s[2:3]
2389        s_add_u32 s2, s2, routine-.
2390        s_add_u32 s3, s3, routine-.+4
2391        .cf_call routine
2392        s_swappc_b64 s[0:1], s[2:3]
2393       
2394        s_lshl_b32 sa[2], sa[2], 3
2395        s_lshl_b32 sa[3], sa[3], 4
2396        s_lshl_b32 sa[4], sa[4], 5
2397        s_lshl_b32 sa[5], sa[5], 5
2398        s_lshl_b32 sa[6], sa[6], 5
2399        s_endpgm
2400       
2401routine:
2402        s_xor_b32 sa[2], sa[2], sa[0]
2403        s_xor_b32 sa[3], sa[3], sa[0]
2404        s_xor_b32 sa[6], sa[3], sa[0]
2405        s_cbranch_scc1 bb1
2406       
2407b0:     s_xor_b32 sa[2], sa[2], sa[0]
2408        s_xor_b32 sa[3], sa[3], sa[0]
2409        s_cbranch_scc1 bb01
2410       
2411bb00:   s_xor_b32 sa[2], sa[2], sa[0]
2412        s_branch bb00_
2413       
2414bb00_:  s_xor_b32 sa[2], sa[2], sa[0]
2415        s_xor_b32 sa[3], sa[3], sa[0]
2416        .cf_ret
2417        s_setpc_b64 s[0:1]
2418       
2419bb01:   s_xor_b32 sa[2], sa[2], sa[0]
2420        s_branch bb01_
2421       
2422bb01_:  s_xor_b32 sa[2], sa[2], sa[0]
2423        s_xor_b32 sa[3], sa[3], sa[0]
2424        s_xor_b32 sa[4], sa[4], sa[0]
2425        .cf_ret
2426        s_setpc_b64 s[0:1]
2427       
2428bb1:    s_xor_b32 sa[2], sa[2], sa[0]
2429        s_xor_b32 sa[3], sa[3], sa[0]
2430        s_cbranch_scc1 bb11
2431       
2432bb10:   s_xor_b32 sa[2], sa[2], sa[0]
2433        s_branch bb10_
2434       
2435bb10_:  s_xor_b32 sa[2], sa[2], sa[0]
2436        s_xor_b32 sa[3], sa[3], sa[0]
2437        s_xor_b32 sa[5], sa[3], sa[2]
2438        .cf_ret
2439        s_setpc_b64 s[0:1]
2440       
2441bb11:   s_xor_b32 sa[2], sa[2], sa[0]
2442        s_branch bb11_
2443       
2444bb11_:  s_xor_b32 sa[2], sa[2], sa[0]
2445        s_xor_b32 sa[3], sa[3], sa[0]
2446        s_xor_b32 sa[4], sa[4], sa[0]
2447        .cf_ret
2448        s_setpc_b64 s[0:1]
2449)ffDXD",
2450        {
2451            // block 0
2452            { 0, 32,
2453                { { 2, true } },
2454                {
2455                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2456                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2457                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2458                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2459                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2460                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2461                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2462                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2463                }, true, false, false },
2464            // block 1
2465            { 32, 56,
2466                { },
2467                {
2468                    { { "sa", 2 }, SSAInfo(5, 13, 13, 13, 1, true) },
2469                    { { "sa", 3 }, SSAInfo(4, 9, 9, 9, 1, true) },
2470                    { { "sa", 4 }, SSAInfo(0, 3, 3, 3, 1, true) },
2471                    { { "sa", 5 }, SSAInfo(0, 2, 2, 2, 1, true) },
2472                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
2473                }, false, false, true },
2474            // block 2 - routine
2475            { 56, 72,
2476                { { 3, false }, { 8, false } },
2477                {
2478                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2479                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2480                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2481                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
2482                }, false, false, false },
2483            // block 3 - bb0
2484            { 72, 84,
2485                { { 4, false }, { 6, false } },
2486                {
2487                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2488                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2489                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2490                }, false, false, false },
2491            // block 4 - bb00
2492            { 84, 92,
2493                { { 5, false } },
2494                {
2495                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2496                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
2497                }, false, false, true },
2498            // block 5 - bb00_
2499            { 92, 104,
2500                { },
2501                {
2502                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2503                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2504                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2505                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
2506                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
2507                }, false, true, true },
2508            // block 6 - bb01
2509            { 104, 112,
2510                { { 7, false } },
2511                {
2512                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2513                    { { "sa", 2 }, SSAInfo(3, 6, 6, 6, 1, true) }
2514                }, false, false, true },
2515            // block 7 - bb01_
2516            { 112, 128,
2517                { },
2518                {
2519                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2520                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2521                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2522                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
2523                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
2524                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, true) }
2525                }, false, true, true },
2526            // block 8 - bb1
2527            { 128, 140,
2528                { { 9, false }, { 11, false } },
2529                {
2530                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2531                    { { "sa", 2 }, SSAInfo(2, 8, 8, 8, 1, true) },
2532                    { { "sa", 3 }, SSAInfo(2, 6, 6, 6, 1, true) }
2533                }, false, false, false },
2534            // block 9 - bb10
2535            { 140, 148,
2536                { { 10, false } },
2537                {
2538                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2539                    { { "sa", 2 }, SSAInfo(8, 9, 9, 9, 1, true) }
2540                }, false, false, true },
2541            // block 10 - bb10_
2542            { 148, 164,
2543                { },
2544                {
2545                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2546                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2547                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2548                    { { "sa", 2 }, SSAInfo(9, 10, 10, 10, 1, true) },
2549                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
2550                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
2551                }, false, true, true },
2552            // block 11
2553            { 164, 172,
2554                { { 12, false } },
2555                {
2556                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2557                    { { "sa", 2 }, SSAInfo(8, 11, 11, 11, 1, true) }
2558                }, false, false, true },
2559            // block 12
2560            { 172, 188,
2561                { },
2562                {
2563                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2564                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2565                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
2566                    { { "sa", 2 }, SSAInfo(11, 12, 12, 12, 1, true) },
2567                    { { "sa", 3 }, SSAInfo(6, 8, 8, 8, 1, true) },
2568                    { { "sa", 4 }, SSAInfo(0, 2, 2, 2, 1, true) }
2569                }, false, true, true }
2570        },
2571        {   // SSA replaces
2572            { { "sa", 2 }, { { 7, 5 }, { 10, 5 }, { 12, 5 } } },
2573            { { "sa", 3 }, { { 5, 4 }, { 7, 4 }, { 8, 4 } } },
2574            { { "sa", 4 }, { { 1, 0 }, { 2, 0 } } },
2575            { { "sa", 5 }, { { 1, 0 } } }
2576        },
2577        true, ""
2578    },
2579    {   // 22 - multiple call of routine
2580        R"ffDXD(.regvar sa:s:8, va:v:8
2581        s_mov_b32 sa[2], s4
2582        s_mov_b32 sa[3], s5
2583       
2584        s_getpc_b64 s[2:3]
2585        s_add_u32 s2, s2, routine-.
2586        s_add_u32 s3, s3, routine-.+4
2587        .cf_call routine
2588        s_swappc_b64 s[0:1], s[2:3]
2589       
2590        s_lshl_b32 sa[2], sa[2], 3
2591        s_lshl_b32 sa[3], sa[3], 4
2592       
2593        s_getpc_b64 s[2:3]
2594        s_add_u32 s2, s2, routine-.
2595        s_add_u32 s3, s3, routine-.+4
2596        .cf_call routine
2597        s_swappc_b64 s[0:1], s[2:3]
2598       
2599        s_ashr_i32 sa[2], sa[2], 3
2600        s_ashr_i32 sa[2], sa[2], 3
2601        s_ashr_i32 sa[3], sa[3], 4
2602        s_ashr_i32 sa[3], sa[3], 4
2603       
2604        s_getpc_b64 s[2:3]
2605        s_add_u32 s2, s2, routine-.
2606        s_add_u32 s3, s3, routine-.+4
2607        .cf_call routine
2608        s_swappc_b64 s[0:1], s[2:3]
2609       
2610        s_ashr_i32 sa[2], sa[2], 3
2611        s_ashr_i32 sa[3], sa[3], 3
2612        s_endpgm
2613       
2614routine:
2615        s_xor_b32 sa[2], sa[2], sa[4]
2616        s_xor_b32 sa[3], sa[3], sa[4]
2617        s_cbranch_scc1 bb1
2618       
2619        s_min_u32 sa[2], sa[2], sa[4]
2620        .cf_ret
2621        s_setpc_b64 s[0:1]
2622       
2623bb1:    s_and_b32 sa[2], sa[2], sa[4]
2624        .cf_ret
2625        s_setpc_b64 s[0:1]
2626)ffDXD",
2627        {
2628            // block 0
2629            { 0, 32,
2630                { { 4, true } },
2631                {
2632                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2633                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2634                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2635                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2636                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2637                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2638                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2639                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2640                }, true, false, false },
2641            // block 1
2642            { 32, 64,
2643                { { 4, true } },
2644                {
2645                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2646                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2647                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2648                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2649                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
2650                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2651                }, true, false, false },
2652            // block 2
2653            { 64, 104,
2654                { { 4, true } },
2655                {
2656                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2657                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2658                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2659                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2660                    { { "sa", 2 }, SSAInfo(3, 6, 6, 7, 2, true) },
2661                    { { "sa", 3 }, SSAInfo(2, 4, 4, 5, 2, true) }
2662                }, true, false, false },
2663            // block 3
2664            { 104, 116,
2665                { },
2666                {
2667                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
2668                    { { "sa", 3 }, SSAInfo(2, 6, 6, 6, 1, true) }
2669                }, false, false, true},
2670            // block 4 - routine
2671            { 116, 128,
2672                { { 5, false }, { 6, false } },
2673                {
2674                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2675                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2676                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2677                }, false, false, false },
2678            // block 5
2679            { 128, 136,
2680                { },
2681                {
2682                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2683                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2684                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2685                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2686                }, false, true, true },
2687            // block 6
2688            { 136, 144,
2689                { },
2690                {
2691                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2692                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2693                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2694                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2695                }, false, true, true }
2696        },
2697        {   // SSA replaces
2698            { { "sa", 2 }, { { 4, 3 }, { 5, 1 }, { 7, 1 } } },
2699            { { "sa", 3 }, { { 3, 1 }, { 5, 1 } } }
2700        },
2701        true, ""
2702    },
2703    {   // 23 - simple call, more complex routine (no use return)
2704        R"ffDXD(.regvar sa:s:8, va:v:8
2705        s_mov_b32 sa[2], s4
2706        s_mov_b32 sa[3], s5
2707       
2708        s_getpc_b64 s[2:3]
2709        s_add_u32 s2, s2, routine-.
2710        s_add_u32 s3, s3, routine-.+4
2711        .cf_call routine
2712        s_swappc_b64 s[0:1], s[2:3]
2713       
2714        s_lshl_b32 sa[3], sa[3], 4
2715        s_endpgm
2716       
2717routine:
2718        s_xor_b32 sa[2], sa[2], sa[4]
2719        s_xor_b32 sa[3], sa[3], sa[4]
2720        s_cbranch_scc1 bb1
2721       
2722        s_min_u32 sa[2], sa[2], sa[4]
2723        .cf_ret
2724        s_setpc_b64 s[0:1]
2725       
2726bb1:    s_and_b32 sa[2], sa[2], sa[4]
2727        .cf_ret
2728        s_setpc_b64 s[0:1]
2729)ffDXD",
2730        {
2731            { 0, 32,
2732                { { 2, true } },
2733                {
2734                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2735                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2736                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2737                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2738                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2739                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2740                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2741                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2742                }, true, false, false },
2743            // block 1 - after call
2744            { 32, 40,
2745                { },
2746                {
2747                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
2748                }, false, false, true },
2749            // block 2 - routine
2750            { 40, 52,
2751                { { 3, false }, { 4, false } },
2752                {
2753                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2754                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2755                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2756                }, false, false, false },
2757            // block 3 - first return
2758            { 52, 60,
2759                { },
2760                {
2761                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2762                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2763                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2764                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2765                }, false, true, true },
2766            // block 4 - second return
2767            { 60, 68,
2768                { },
2769                {
2770                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2771                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2772                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2773                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2774                }, false, true, true }
2775        },
2776        { },
2777        true, ""
2778    },
2779    {   // 24 - simple call, more complex routine
2780        R"ffDXD(.regvar sa:s:8, va:v:8
2781        s_mov_b32 sa[2], s4
2782        s_mov_b32 sa[3], s5
2783       
2784        s_getpc_b64 s[2:3]
2785        s_add_u32 s2, s2, routine-.
2786        s_add_u32 s3, s3, routine-.+4
2787        .cf_call routine
2788        s_swappc_b64 s[0:1], s[2:3]
2789       
2790        s_lshl_b32 sa[2], sa[2], 3
2791        s_lshl_b32 sa[3], sa[3], 4
2792        s_endpgm
2793       
2794routine:
2795        s_xor_b32 sa[2], sa[2], sa[4]
2796        s_xor_b32 sa[3], sa[3], sa[4]
2797        s_cbranch_scc1 bb2
2798
2799        s_min_u32 sa[3], sa[3], sa[4]
2800        .cf_ret
2801        s_setpc_b64 s[0:1]
2802       
2803bb2:    s_min_u32 sa[2], sa[2], sa[4]
2804        .cf_ret
2805        s_setpc_b64 s[0:1]
2806)ffDXD",
2807        {
2808            { 0, 32,
2809                { { 2, true } },
2810                {
2811                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2812                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2813                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2814                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2815                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2816                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2817                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2818                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2819                }, true, false, false },
2820            // block 1 - after call
2821            { 32, 44,
2822                { },
2823                {
2824                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
2825                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
2826                }, false, false, true },
2827            // block 2 - routine
2828            { 44, 56,
2829                { { 3, false }, { 4, false } },
2830                {
2831                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2832                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2833                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2834                }, false, false, false },
2835            // block 3 - first return
2836            { 56, 64,
2837                { },
2838                {
2839                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2840                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2841                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
2842                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2843                }, false, true, true },
2844            // block 4 - second return
2845            { 64, 72,
2846                { },
2847                {
2848                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2849                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2850                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2851                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2852                }, false, true, true }
2853        },
2854        {   // SSA replaces
2855            { { "sa", 2 }, { { 3, 2 } } },
2856            { { "sa", 3 }, { { 3, 2 } } }
2857        },
2858        true, ""
2859    },
2860    {   // 25 - nested calls
2861        R"ffDXD(.regvar sa:s:8, va:v:8
2862        s_mov_b32 sa[2], s4
2863        s_mov_b32 sa[3], s5
2864       
2865        s_getpc_b64 s[2:3]
2866        s_add_u32 s2, s2, routine-.
2867        s_add_u32 s3, s3, routine-.+4
2868        .cf_call routine
2869        s_swappc_b64 s[0:1], s[2:3]
2870       
2871        s_lshl_b32 sa[2], sa[2], 4
2872        s_lshl_b32 sa[3], sa[3], 4
2873       
2874        s_getpc_b64 s[2:3]
2875        s_add_u32 s2, s2, routine2-.
2876        s_add_u32 s3, s3, routine2-.+4
2877        .cf_call routine2
2878        s_swappc_b64 s[0:1], s[2:3]
2879       
2880        s_lshr_b32 sa[2], sa[2], 2
2881        s_min_u32 sa[2], sa[2], sa[3]
2882        s_lshr_b32 sa[3], sa[3], 2
2883        s_endpgm
2884       
2885routine:
2886        s_xor_b32 sa[2], sa[2], sa[4]
2887        s_xor_b32 sa[3], sa[3], sa[4]
2888        s_cbranch_scc1 bb1
2889       
2890        s_min_u32 sa[2], sa[2], sa[4]
2891       
2892        s_getpc_b64 s[2:3]
2893        s_add_u32 s2, s2, routine2-.
2894        s_add_u32 s3, s3, routine2-.+4
2895        .cf_call routine2
2896        s_swappc_b64 s[0:1], s[2:3]
2897       
2898        .cf_ret
2899        s_setpc_b64 s[0:1]
2900       
2901bb1:    s_and_b32 sa[2], sa[2], sa[4]
2902        .cf_ret
2903        s_setpc_b64 s[0:1]
2904
2905routine2:
2906        s_xor_b32 sa[2], sa[2], sa[4]
2907        s_xor_b32 sa[3], sa[3], sa[4]
2908        s_cbranch_scc1 bb2
2909
2910        s_min_u32 sa[3], sa[3], sa[4]
2911        .cf_ret
2912        s_setpc_b64 s[0:1]
2913       
2914bb2:    s_min_u32 sa[2], sa[2], sa[4]
2915        .cf_ret
2916        s_setpc_b64 s[0:1]
2917)ffDXD",
2918        {
2919            // block 0 - start
2920            { 0, 32,
2921                { { 3, true } },
2922                {
2923                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2924                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2925                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2926                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2927                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
2928                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
2929                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
2930                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
2931                }, true, false, false },
2932            // block 1
2933            { 32, 64,
2934                { { 7, true } },
2935                {
2936                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2937                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2938                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2939                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2940                    { { "sa", 2 }, SSAInfo(4, 7, 7, 7, 1, true) },
2941                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) }
2942                }, true, false, false },
2943            // block 2
2944            { 64, 80,
2945                { },
2946                {
2947                    { { "sa", 2 }, SSAInfo(4, 8, 8, 9, 2, true) },
2948                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) }
2949                }, false, false, true },
2950            // block 3 - routine
2951            { 80, 92,
2952                { { 4, false }, { 6, false } },
2953                {
2954                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
2955                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
2956                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2957                }, false, false, false },
2958            // block 4 - routine - first way bb0
2959            { 92, 120,
2960                { { 7, true } },
2961                {
2962                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
2963                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
2964                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
2965                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
2966                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
2967                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2968                }, true, false, false },
2969            // block 5 - routine - return 0
2970            { 120, 124,
2971                { },
2972                {
2973                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2974                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
2975                }, false, true, true },
2976            // block 6 - routine - bb1
2977            { 124, 132,
2978                { },
2979                {
2980                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2981                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2982                    { { "sa", 2 }, SSAInfo(2, 6, 6, 6, 1, true) },
2983                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2984                }, false, true, true },
2985            // block 7
2986            { 132, 144,
2987                { { 8, false }, { 9, false } },
2988                {
2989                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
2990                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
2991                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
2992                }, false, false, false },
2993            // block 8
2994            { 144, 152,
2995                { },
2996                {
2997                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
2998                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
2999                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
3000                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3001                }, false, true, true },
3002            // block 9
3003            { 152, 160,
3004                { },
3005                {
3006                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3007                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3008                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
3009                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3010                }, false, true, true }
3011        },
3012        {   // SSA replaces
3013            { { "sa", 2 }, { { 5, 4 }, { 6, 4 }, { 7, 3 } } },
3014            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 4, 3 }, { 5, 2 } } }
3015        },
3016        true, ""
3017    },
3018    {   // 26 - many routines in single calls
3019        R"ffDXD(.regvar sa:s:8, va:v:8
3020        s_mov_b32 sa[2], s4
3021        s_mov_b32 sa[3], s5
3022        s_mov_b32 sa[4], s6
3023        s_mov_b32 sa[5], s7
3024       
3025        s_getpc_b64 s[2:3]
3026        s_add_u32 s2, s2, routine-.
3027        s_add_u32 s3, s3, routine-.+4
3028        .cf_call routine, routine2
3029        s_swappc_b64 s[0:1], s[2:3]
3030       
3031        s_lshl_b32 sa[2], sa[2], 6
3032        s_lshl_b32 sa[3], sa[3], 6
3033        s_lshl_b32 sa[4], sa[4], 6
3034        s_lshl_b32 sa[5], sa[5], 6
3035       
3036        s_getpc_b64 s[2:3]
3037        s_add_u32 s2, s2, routine2-.
3038        s_add_u32 s3, s3, routine2-.+4
3039        .cf_call routine2, routine3
3040        s_swappc_b64 s[0:1], s[2:3]
3041       
3042        s_lshl_b32 sa[2], sa[2], 4
3043        s_lshl_b32 sa[3], sa[3], 4
3044        s_lshl_b32 sa[4], sa[4], 4
3045        s_lshl_b32 sa[5], sa[5], 4
3046        s_endpgm
3047       
3048routine:
3049        s_xor_b32 sa[2], sa[2], sa[6]
3050        s_xor_b32 sa[3], sa[3], sa[6]
3051        s_cbranch_scc1 bb1
3052       
3053        s_min_u32 sa[2], sa[2], sa[6]
3054        .cf_ret
3055        s_setpc_b64 s[0:1]
3056       
3057bb1:    s_and_b32 sa[2], sa[2], sa[6]
3058        .cf_ret
3059        s_setpc_b64 s[0:1]
3060
3061routine2:
3062        s_xor_b32 sa[2], sa[2], sa[6]
3063        s_xor_b32 sa[4], sa[4], sa[6]
3064        s_cbranch_scc1 bb2
3065       
3066        s_min_u32 sa[2], sa[2], sa[6]
3067        .cf_ret
3068        s_setpc_b64 s[0:1]
3069       
3070bb2:    s_and_b32 sa[2], sa[2], sa[6]
3071        .cf_ret
3072        s_setpc_b64 s[0:1]
3073
3074routine3:
3075        s_xor_b32 sa[3], sa[3], sa[6]
3076        s_xor_b32 sa[5], sa[5], sa[6]
3077        s_cbranch_scc1 bb3
3078       
3079        s_min_u32 sa[3], sa[3], sa[6]
3080        .cf_ret
3081        s_setpc_b64 s[0:1]
3082       
3083bb3:    s_and_b32 sa[5], sa[5], sa[6]
3084        .cf_ret
3085        s_setpc_b64 s[0:1]
3086)ffDXD",
3087        {
3088            // block 0 - start
3089            { 0, 40,
3090                { { 3, true }, { 6, true } },
3091                {
3092                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
3093                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
3094                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
3095                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
3096                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
3097                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
3098                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
3099                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
3100                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
3101                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
3102                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
3103                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
3104                }, true, false, false },
3105            // block 1 - after first call
3106            { 40, 80,
3107                { { 6, true }, { 9, true } },
3108                {
3109                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
3110                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
3111                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
3112                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
3113                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
3114                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
3115                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
3116                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
3117                }, true, false, false },
3118            // block 2 - end
3119            { 80, 100,
3120                { },
3121                {
3122                    { { "sa", 2 }, SSAInfo(3, 9, 9, 9, 1, true) },
3123                    { { "sa", 3 }, SSAInfo(4, 6, 6, 6, 1, true) },
3124                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
3125                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
3126                }, false, false, true },
3127            // block 3 - routine
3128            { 100, 112,
3129                { { 4, false }, { 5, false } },
3130                {
3131                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
3132                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
3133                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3134                }, false, false, false },
3135            // block 4 - routine way 0
3136            { 112, 120,
3137                { },
3138                {
3139                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3140                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3141                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
3142                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3143                }, false, true, true },
3144            // block 5 - routine way 1
3145            { 120, 128,
3146                { },
3147                {
3148                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3149                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3150                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
3151                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3152                }, false, true, true },
3153            // block 6 - routine 2
3154            { 128, 140,
3155                { { 7, false }, { 8, false } },
3156                {
3157                    { { "sa", 2 }, SSAInfo(1, 5, 5, 5, 1, true) },
3158                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
3159                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3160                }, false, false, false },
3161            // block 7 - routine 2 way 0
3162            { 140, 148,
3163                { },
3164                {
3165                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3166                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3167                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
3168                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3169                }, false, true, true },
3170            // block 8 - routine 2 way 1
3171            { 148, 156,
3172                { },
3173                {
3174                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3175                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3176                    { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, true) },
3177                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3178                }, false, true, true },
3179            // block 9 - routine 3
3180            { 156, 168,
3181                { { 10, false }, { 11, false } },
3182                {
3183                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
3184                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) },
3185                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3186                }, false, false, false },
3187            // block 10 - routine 3 way 0
3188            { 168, 176,
3189                { },
3190                {
3191                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3192                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3193                    { { "sa", 3 }, SSAInfo(4, 5, 5, 5, 1, true) },
3194                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3195                }, false, true, true },
3196            // block 11 - routine 3 way 1
3197            { 176, 184,
3198                { },
3199                {
3200                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
3201                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
3202                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) },
3203                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
3204                }, false, true, true  }
3205        },
3206        {   // SSA replaces
3207            { { "sa", 2 }, { { 4, 3 }, { 6, 3 }, { 7, 3 }, { 8, 1 } } },
3208            { { "sa", 3 }, { { 5, 4 } } },
3209            { { "sa", 4 }, { { 3, 1 } } },
3210            { { "sa", 5 }, { { 4, 3 } } }
3211        },
3212        true, ""
3213    },
3214    {   // 27 - simple loop with fork (regvar used only in these forks)
3215        R"ffDXD(.regvar sa:s:8, va:v:8
3216        s_mov_b32 sa[2], s4
3217loop:   s_cbranch_scc1 b1
3218       
3219b0:     s_add_u32 sa[2], sa[2], sa[0]
3220        s_branch loopend
3221b1:     s_add_u32 sa[2], sa[2], sa[1]
3222loopend:
3223        s_cbranch_scc0 loop
3224        s_endpgm
3225)ffDXD",
3226        {
3227            {   // block 0 - start
3228                0, 4,
3229                { },
3230                {
3231                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
3232                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) }
3233                }, false, false, false },
3234            {   // block 1 - loop
3235                4, 8,
3236                { { 2, false }, { 3, false } },
3237                {
3238                }, false, false, false },
3239            {   // block 2 - b0
3240                8, 16,
3241                { { 4, false } },
3242                {
3243                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3244                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
3245                }, false, false, true },
3246            {   // block 3 - b1
3247                16, 20,
3248                { },
3249                {
3250                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
3251                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) }
3252                }, false, false, false },
3253            {   // block 4 - loopend
3254                20, 24,
3255                { { 1, false }, { 5, false } },
3256                {
3257                }, false, false, false },
3258            {   // block 5 - en
3259                24, 28,
3260                { },
3261                { }, false, false, true }
3262        },
3263        {   // SSA replaces
3264            { { "sa", 2 }, { { 2, 1 }, { 3, 1 } } }
3265        },
3266        true, ""
3267    },
3268    { nullptr }
3269};
Note: See TracBrowser for help on using the repository browser.