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

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

CLRadeonExtender: AsmRegAlloc?: Remove obsolete joinRoutineData in main createSSAData. Fix testcase.

File size: 46.4 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2018 Mateusz Szpakowski
4 *
5 *  This library is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Lesser General Public
7 *  License as published by the Free Software Foundation; either
8 *  version 2.1 of the License, or (at your option) any later version.
9 *
10 *  This library is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 *  Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public
16 *  License along with this library; if not, write to the Free Software
17 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20#include <CLRX/Config.h>
21#include <CLRX/utils/Utilities.h>
22#include <CLRX/amdasm/Assembler.h>
23#include <CLRX/utils/Containers.h>
24#include "../TestUtils.h"
25#include "AsmRegAlloc.h"
26
27const AsmSSADataCase ssaDataTestCases3Tbl[] =
28{
29    {   // 0 - routine calls inside routine
30        R"ffDXD(.regvar sa:s:10, va:v:8
31        s_mov_b32 sa[2], s4
32        s_mov_b32 sa[3], s5
33        s_mov_b32 sa[4], s6
34        s_mov_b32 sa[5], s7
35        s_mov_b32 sa[6], s8
36        .cf_call routine
37        s_swappc_b64 s[0:1], s[2:3]
38       
39        s_add_u32 sa[2], sa[2], sa[0]
40        s_add_u32 sa[3], sa[3], sa[0]
41        s_add_u32 sa[4], sa[4], sa[0]
42        s_add_u32 sa[5], sa[5], sa[0]
43        s_add_u32 sa[6], sa[6], sa[0]
44        s_endpgm
45       
46routine:
47        s_add_u32 sa[6], sa[6], sa[0]
48        .cf_call routine1,routine2
49        s_swappc_b64 s[0:1], s[2:3]
50       
51        .cf_jump a1, a2, a3
52        s_setpc_b64 s[0:1]
53       
54a1:     s_add_u32 sa[4], sa[4], sa[0]
55        .cf_call routine1,routine3
56        s_swappc_b64 s[0:1], s[2:3]
57        .cf_ret
58        s_setpc_b64 s[0:1]
59       
60a2:     s_add_u32 sa[4], sa[4], sa[0]
61        .cf_call routine2,routine3
62        s_swappc_b64 s[0:1], s[2:3]
63       
64e0:     s_add_u32 sa[7], sa[4], sa[0]
65        s_add_u32 sa[7], sa[4], sa[0]
66       
67        .cf_call routine5
68        s_swappc_b64 s[0:1], s[2:3]
69        .cf_ret
70        s_setpc_b64 s[0:1]
71       
72a3:     s_add_u32 sa[5], sa[5], sa[0]
73        .cf_call routine3, routine4
74        s_swappc_b64 s[0:1], s[2:3]
75        s_branch e0
76
77        # subroutines
78routine1:
79        s_add_u32 sa[2], sa[2], sa[0]
80        s_cbranch_vccz r1a1
81       
82        s_add_u32 sa[2], sa[2], sa[0]
83        .cf_ret
84        s_setpc_b64 s[0:1]
85r1a1:
86        s_add_u32 sa[4], sa[2], sa[0]
87        .cf_ret
88        s_setpc_b64 s[0:1]
89
90routine2:
91        s_add_u32 sa[2], sa[2], sa[0]
92        s_cbranch_vccz r2a1
93       
94        s_add_u32 sa[2], sa[2], sa[0]
95        .cf_ret
96        s_setpc_b64 s[0:1]
97r2a1:
98        s_add_u32 sa[3], sa[3], sa[0]
99        .cf_ret
100        s_setpc_b64 s[0:1]
101
102routine3:
103        s_add_u32 sa[3], sa[3], sa[0]
104        s_cbranch_vccz r3a1
105       
106        s_add_u32 sa[3], sa[3], sa[0]
107        s_add_u32 sa[4], sa[3], sa[0]
108        .cf_ret
109        s_setpc_b64 s[0:1]
110r3a1:
111        s_add_u32 sa[3], sa[5], sa[0]
112        .cf_ret
113        s_setpc_b64 s[0:1]
114       
115routine4:
116        s_add_u32 sa[4], sa[4], sa[0]
117        s_cbranch_vccz r4a1
118       
119        s_add_u32 sa[4], sa[4], sa[0]
120        s_add_u32 sa[5], sa[5], sa[0]
121        .cf_ret
122        s_setpc_b64 s[0:1]
123r4a1:
124        s_add_u32 sa[5], sa[5], sa[0]
125        .cf_ret
126        s_setpc_b64 s[0:1]
127       
128routine5:
129        s_add_u32 sa[4], sa[4], sa[0]
130        s_cbranch_vccz r5a1
131       
132        s_add_u32 sa[3], sa[3], sa[0]
133        .cf_ret
134        s_setpc_b64 s[0:1]
135r5a1:
136        s_add_u32 sa[5], sa[5], sa[0]
137        .cf_ret
138        s_setpc_b64 s[0:1]
139)ffDXD",
140        {
141            {   // block 0 - start
142                0, 24,
143                { { 2, true } },
144                {
145                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
146                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
147                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
148                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
149                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
150                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
151                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
152                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
153                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
154                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
155                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
156                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
157                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
158                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
159                }, true, false, false },
160            {   // block 1 - end
161                24, 48,
162                { },
163                {
164                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
165                    { { "sa", 2 }, SSAInfo(1, 6, 6, 6, 1, true) },
166                    { { "sa", 3 }, SSAInfo(1, 7, 7, 7, 1, true) },
167                    { { "sa", 4 }, SSAInfo(1, 9, 9, 9, 1, true) },
168                    { { "sa", 5 }, SSAInfo(1, 6, 6, 6, 1, true) },
169                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) }
170                }, false, false, true },
171            {   // block 2 - routine
172                48, 56,
173                { { 11, true }, { 14, true } },
174                {
175                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
176                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
177                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
178                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
179                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
180                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
181                }, true, false, false },
182            {   // block 3 - jump a1,a2,a3
183                56, 60,
184                { { 4, false }, { 6, false }, { 9, false } },
185                {
186                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
187                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
188                }, false, false, true },
189            {   // block 4 - a1
190                60, 68,
191                { { 11, true }, { 17, true } },
192                {
193                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
194                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
195                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
196                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
197                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
198                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) }
199                }, true, false, false },
200            {   // block 5 - a1 end
201                68, 72,
202                { },
203                {
204                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
205                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
206                }, false, true, true },
207            {   // block 6 - a2
208                72, 80,
209                { { 14, true }, { 17, true } },
210                {
211                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
212                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
213                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
214                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
215                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
216                    { { "sa", 4 }, SSAInfo(1, 5, 5, 5, 1, true) }
217                }, true, false, false },
218            {   // block 7 - e0
219                80, 92,
220                { { 23, true } },
221                {
222                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
223                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
224                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
225                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
226                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
227                    { { "sa", 4 }, SSAInfo(3, SIZE_MAX, 6, SIZE_MAX, 0, true) },
228                    { { "sa", 7 }, SSAInfo(0, 1, 1, 2, 2, false) }
229                }, true, false, false },
230            {   // block 8 - a2 end
231                92, 96,
232                { },
233                {
234                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
235                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
236                }, false, true, true },
237            {   // block 9 - a3
238                96, 104,
239                { { 17, true }, { 20, true } },
240                {
241                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
242                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
243                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
244                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
245                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
246                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) }
247                }, true, false, false },
248            {   // block 10 - a3 end
249                104, 108,
250                { { 7, false } },
251                { },
252                false, false, true },
253            {   // block 11 - routine1
254                108, 116,
255                { { 12, false }, { 13, false } },
256                {
257                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
258                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
259                }, false, false, false },
260            {   // block 12 - ret1
261                116, 124,
262                { },
263                {
264                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
265                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
266                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
267                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
268                }, false, true, true },
269            {   // block 13 - ret2
270                124, 132,
271                { },
272                {
273                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
274                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
275                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
276                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
277                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) }
278                }, false, true, true },
279            {   // block 14 - routine2
280                132, 140,
281                { { 15, false }, { 16, false } },
282                {
283                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
284                    { { "sa", 2 }, SSAInfo(1, 4, 4, 4, 1, true) }
285                }, false, false, false },
286            {   // block 15 - ret1
287                140, 148,
288                { },
289                {
290                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
291                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
292                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
293                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) }
294                }, false, true, true },
295            {   // block 16 - ret2
296                148, 156,
297                { },
298                {
299                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
300                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
301                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
302                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
303                }, false, true, true },
304            {   // block 17 - routine3
305                156, 164,
306                { { 18, false }, { 19, false } },
307                {
308                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
309                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) }
310                }, false, false, false },
311            {   // block 18 - ret1
312                164, 176,
313                { },
314                {
315                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
316                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
317                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
318                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
319                    { { "sa", 4 }, SSAInfo(3, 4, 4, 4, 1, false) }
320                }, false, true, true },
321            {   // block 19 - ret2
322                176, 184,
323                { },
324                {
325                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
326                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
327                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
328                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, false) },
329                    { { "sa", 5 }, SSAInfo(1, SIZE_MAX, 2, SIZE_MAX, 0, true) }
330                }, false, true, true },
331            {   // block 20 - routine4
332                184, 192,
333                { { 21, false }, { 22, false } },
334                {
335                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
336                    { { "sa", 4 }, SSAInfo(1, 7, 7, 7, 1, true) }
337                }, false, false, false },
338            {   // block 21 - ret1
339                192, 204,
340                { },
341                {
342                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
343                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
344                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
345                    { { "sa", 4 }, SSAInfo(7, 8, 8, 8, 1, true) },
346                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
347                }, false, true, true },
348            {   // block 22 - ret2
349                204, 212,
350                { },
351                {
352                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
353                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
354                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
355                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
356                }, false, true, true },
357            {   // block 23 - routine5
358                212, 220,
359                { { 24, false }, { 25, false } },
360                {
361                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
362                    { { "sa", 4 }, SSAInfo(3, 6, 6, 6, 1, true) }
363                }, false, false, false },
364            {   // block 24 - ret1
365                220, 228,
366                { },
367                {
368                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
369                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
370                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
371                    { { "sa", 3 }, SSAInfo(1, 6, 6, 6, 1, true) }
372                }, false, true, true },
373            {   // block 25 - ret2
374                228, 236,
375                { },
376                {
377                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
378                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
379                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
380                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
381                }, false, true, true }
382        },
383        {   // SSA replaces
384            { { "sa", 2 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
385            { { "sa", 3 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 } } },
386            { { "sa", 4 }, { { 2, 1 }, { 4, 3 }, { 3, 1 }, { 5, 1 },
387                        { 6, 1 }, { 8, 3 }, { 7, 3 } } },
388            { { "sa", 5 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } }
389        },
390        true, ""
391    },
392    {   // 1 - retssa tests 2
393        R"ffDXD(.regvar sa:s:8, va:v:8
394        s_mov_b32 sa[2], s4
395        s_mov_b32 sa[3], s5
396        s_mov_b32 sa[4], s6
397        s_mov_b32 sa[6], s7
398        s_mov_b32 sa[7], s7
399       
400        .cf_call routine
401        s_swappc_b64 s[0:1], s[2:3]
402       
403        s_lshl_b32 sa[6], sa[3], 4
404        s_lshl_b32 sa[6], sa[4], 4
405        s_cbranch_execz aa3
406       
407aa2:    s_lshr_b32 sa[7], sa[1], 4
408        s_endpgm
409       
410aa3:    s_ashr_i32 sa[7], sa[7], 4
411        s_endpgm
412       
413routine:
414        s_xor_b32 sa[2], sa[2], sa[0]
415        s_xor_b32 sa[3], sa[3], sa[0]
416        .cf_cjump bb1, bb2
417        s_setpc_b64 s[0:1]
418       
419bb0:    s_min_u32 sa[3], sa[3], sa[0]
420        s_max_u32 sa[4], sa[4], sa[0]
421        s_xor_b32 sa[6], sa[6], sa[0]
422        s_xor_b32 sa[7], sa[7], sa[0]
423        .cf_ret
424        s_setpc_b64 s[0:1]
425       
426bb1:    s_and_b32 sa[3], sa[3], sa[0]
427        s_max_u32 sa[4], sa[4], sa[0]
428        s_xor_b32 sa[6], sa[6], sa[0]
429        s_xor_b32 sa[7], sa[7], sa[0]
430        .cf_ret
431        s_setpc_b64 s[0:1]
432
433bb2:    s_and_b32 sa[3], sa[3], sa[0]
434        s_max_u32 sa[4], sa[4], sa[0]
435        s_xor_b32 sa[6], sa[6], sa[0]
436        s_xor_b32 sa[7], sa[7], sa[0]
437        .cf_ret
438        s_setpc_b64 s[0:1]
439)ffDXD",
440        {
441            {   // block 0 - start
442                0, 24,
443                { { 4, true } },
444                {
445                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
446                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
447                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
448                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
449                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
450                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
451                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
452                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
453                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
454                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
455                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
456                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
457                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
458                }, true, false, false },
459            {   // block 1 - after call
460                24, 36,
461                { { 2, false }, { 3, false } },
462                {
463                    { { "sa", 3 }, SSAInfo(3, SIZE_MAX, 6, SIZE_MAX, 0, true) },
464                    { { "sa", 4 }, SSAInfo(2, SIZE_MAX, 5, SIZE_MAX, 0, true) },
465                    { { "sa", 6 }, SSAInfo(1, 5, 5, 6, 2, false) }
466                }, false, false, false },
467            {   // block 2 - aa2
468                36, 44,
469                { },
470                {
471                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
472                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, false) }
473                }, false, false, true },
474            {   // block 3 - aa3
475                44, 52,
476                { },
477                {
478                    { { "sa", 7 }, SSAInfo(2, 6, 6, 6, 1, true) }
479                }, false, false, true
480            },
481            {   // block 4 - routine
482                52, 64,
483                { { 5, false }, { 6, false }, { 7, false } },
484                {
485                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
486                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
487                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
488                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
489                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
490                }, false, false, false },
491            {   // block 5 - bb0
492                64, 84,
493                { },
494                {
495                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
496                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
497                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
498                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
499                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
500                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
501                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
502                }, false, true, true },
503            {   // block 6 - bb1
504                84, 104,
505                { },
506                {
507                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
508                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
509                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
510                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
511                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
512                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
513                    { { "sa", 7 }, SSAInfo(1, 3, 3, 3, 1, true) }
514                }, false, true, true },
515            {   // block 7 - bb2
516                104, 124,
517                { },
518                {
519                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
520                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
521                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
522                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
523                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
524                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) },
525                    { { "sa", 7 }, SSAInfo(1, 4, 4, 4, 1, true) }
526                }, false, true, true }
527        },
528        {   // SSA replaces
529            { { "sa", 3 }, { { 4, 3 }, { 5, 3 } } },
530            { { "sa", 4 }, { { 3, 2 }, { 4, 2 } } },
531            { { "sa", 7 }, { { 3, 2 }, { 4, 2 } } }
532        },
533        true, ""
534    },
535    {   // 2 - routine with loop and jumps to mid in loop
536        R"ffDXD(.regvar sa:s:8, va:v:8
537        s_mov_b32 sa[2], s4
538        s_mov_b32 sa[3], s5
539        s_mov_b32 sa[4], s6
540        s_mov_b32 sa[5], s6
541        s_mov_b32 sa[6], s7
542       
543        .cf_call routine
544        s_swappc_b64 s[0:1], s[2:3]
545       
546        s_add_u32 sa[2], sa[2], sa[0]
547        s_add_u32 sa[3], sa[3], sa[0]
548        s_add_u32 sa[4], sa[4], sa[0]
549        s_add_u32 sa[5], sa[5], sa[0]
550        s_add_u32 sa[6], sa[6], sa[0]
551        s_endpgm
552       
553routine:
554        s_xor_b32 sa[2], sa[2], sa[0]
555        s_xor_b32 sa[3], sa[3], sa[1]
556        s_cbranch_execnz b0
557       
558loop:   s_xor_b32 sa[3], sa[3], sa[1]
559l0:     s_xor_b32 sa[4], sa[4], sa[0]
560l1:     s_xor_b32 sa[2], sa[2], sa[0]
561        s_cbranch_vccz loop
562       
563        .cf_ret
564        s_setpc_b64 s[0:1]
565
566b0:     s_xor_b32 sa[5], sa[5], sa[0]
567        s_cbranch_vccz l0
568        s_xor_b32 sa[6], sa[6], sa[1]
569        s_branch l1
570)ffDXD",
571        {
572            {   // block 0 - start
573                0, 24,
574                { { 2, true } },
575                {
576                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
577                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
578                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
579                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
580                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
581                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
582                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
583                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
584                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
585                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
586                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
587                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
588                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
589                }, true, false, false },
590            {   // block 1 - end
591                24, 48,
592                { },
593                {
594                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
595                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
596                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
597                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
598                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
599                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
600                }, false, false, true },
601            {   // block 2 - routine
602                48, 60,
603                { { 3, false }, { 7, false } },
604                {
605                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
606                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
607                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
608                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
609                }, false, false, false },
610            {   // block 3 - loop
611                60, 64,
612                { },
613                {
614                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
615                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
616                }, false, false, false },
617            {   // block 4 - l0
618                64, 68,
619                { },
620                {
621                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
622                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
623                }, false, false, false },
624            {   // block 5 - l1
625                68, 76,
626                { { 3, false }, { 6, false } },
627                {
628                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
629                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
630                }, false, false, false },
631            {   // block 6 - ret
632                76, 80,
633                { },
634                {
635                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
636                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
637                },
638                false, true, true },
639            {   // block 7 - b0, to l0
640                80, 88,
641                { { 4, false }, { 8, false } },
642                {
643                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
644                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
645                }, false, false, false },
646            {   // block 8 - jump to l1
647                88, 96,
648                { { 5, false } },
649                {
650                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
651                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
652                }, false, false, true }
653        },
654        {   // SSA replaces
655            { { "sa", 2 }, { { 3, 2 } } },
656            { { "sa", 3 }, { { 3, 2 } } },
657            { { "sa", 4 }, { { 2, 1 } } },
658            { { "sa", 5 }, { { 2, 1 } } },
659            { { "sa", 6 }, { { 2, 1 } } }
660        },
661        true, ""
662    },
663    {   // 3 - routine with loop and jumps to mid in loop
664        R"ffDXD(.regvar sa:s:8, va:v:8
665        s_mov_b32 sa[2], s4
666        s_mov_b32 sa[3], s5
667        s_mov_b32 sa[4], s6
668        s_mov_b32 sa[5], s6
669        s_mov_b32 sa[6], s7
670       
671        .cf_call routine
672        s_swappc_b64 s[0:1], s[2:3]
673       
674        s_add_u32 sa[2], sa[2], sa[0]
675        s_add_u32 sa[3], sa[3], sa[0]
676        s_add_u32 sa[4], sa[4], sa[0]
677        s_add_u32 sa[5], sa[5], sa[0]
678        s_add_u32 sa[6], sa[6], sa[0]
679        s_endpgm
680       
681routine:
682        s_xor_b32 sa[2], sa[2], sa[0]
683        s_xor_b32 sa[3], sa[3], sa[1]
684        s_cbranch_execnz b0
685       
686loop:   s_xor_b32 sa[3], sa[3], sa[1]
687       
688l0:     s_xor_b32 sa[4], sa[4], sa[0]
689        s_cbranch_scc0 end1
690       
691l1:     s_xor_b32 sa[2], sa[2], sa[0]
692        s_cbranch_scc0 end2
693       
694        s_branch loop
695       
696end1:   s_xor_b32 sa[5], sa[5], sa[1]
697        .cf_ret
698        s_setpc_b64 s[0:1]
699       
700end2:   s_xor_b32 sa[6], sa[0], sa[1]
701        .cf_ret
702        s_setpc_b64 s[0:1]
703
704b0:     s_xor_b32 sa[5], sa[5], sa[0]
705        s_cbranch_vccz l0
706        s_xor_b32 sa[6], sa[6], sa[1]
707        s_branch l1
708)ffDXD",
709        {
710            {   // block 0 - start
711                0, 24,
712                { { 2, true } },
713                {
714                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
715                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
716                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
717                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
718                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
719                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
720                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
721                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
722                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
723                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
724                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
725                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
726                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
727                }, true, false, false },
728            {   // block 1 - end
729                24, 48,
730                { },
731                {
732                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
733                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
734                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
735                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
736                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
737                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
738                }, false, false, true },
739            {   // block 2 - routine
740                48, 60,
741                { { 3, false }, { 9, false } },
742                {
743                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
744                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
745                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
746                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
747                }, false, false, false },
748            {   // block 3 - loop
749                60, 64,
750                { },
751                {
752                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
753                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
754                }, false, false, false },
755            {   // block 4 - l0
756                64, 72,
757                { { 5, false }, { 7, false } },
758                {
759                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
760                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
761                }, false, false, false },
762            {   // block 5 - l1
763                72, 80,
764                { { 6, false }, { 8, false } },
765                {
766                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
767                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
768                }, false, false, false },
769            {   // block 6 - loop end
770                80, 84,
771                { { 3, false } },
772                { },
773                false, false, true },
774            {   // block 7 - end1
775                84, 92,
776                { },
777                {
778                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
779                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
780                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
781                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
782                }, false, true, true },
783            {   // block 8 - end2
784                92, 100,
785                { },
786                {
787                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
788                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
789                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
790                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
791                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, false) }
792                }, false, true, true },
793            {   // block 9 - b0
794                100, 108,
795                { { 4, false }, { 10, false } },
796                {
797                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
798                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) }
799                }, false, false, false },
800            {   // block 10 - to l1
801                108, 116,
802                { { 5, false } },
803                {
804                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
805                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
806                }, false, false, true }
807        },
808        {   // SSA replaces
809            { { "sa", 2 }, { { 3, 2 } } },
810            { { "sa", 3 }, { { 3, 2 } } },
811            { { "sa", 4 }, { { 2, 1 } } },
812            { { "sa", 5 }, { { 2, 1 }, { 3, 1 } } },
813            { { "sa", 6 }, { { 2, 1 }, { 3, 1 } } }
814        },
815        true, ""
816    },
817    {   // 4 - routine with loop and jumps to mid in loop
818        R"ffDXD(.regvar sa:s:8, va:v:8
819        s_mov_b32 sa[2], s4
820        s_mov_b32 sa[3], s5
821        s_mov_b32 sa[4], s6
822        s_mov_b32 sa[5], s6
823        s_mov_b32 sa[6], s7
824       
825        .cf_call routine
826        s_swappc_b64 s[0:1], s[2:3]
827       
828        s_add_u32 sa[2], sa[2], sa[0]
829        s_add_u32 sa[3], sa[3], sa[0]
830        s_add_u32 sa[4], sa[4], sa[0]
831        s_add_u32 sa[5], sa[5], sa[0]
832        s_add_u32 sa[6], sa[6], sa[0]
833        s_endpgm
834       
835end1:   s_xor_b32 sa[5], sa[5], sa[1]
836        .cf_ret
837        s_setpc_b64 s[0:1]
838       
839end2:   s_xor_b32 sa[6], sa[0], sa[1]
840        .cf_ret
841        s_setpc_b64 s[0:1]
842       
843routine:
844        s_xor_b32 sa[2], sa[2], sa[0]
845        s_xor_b32 sa[3], sa[3], sa[1]
846        s_cbranch_execnz b0
847       
848loop:   s_xor_b32 sa[3], sa[3], sa[1]
849       
850l0:     s_xor_b32 sa[4], sa[4], sa[0]
851        s_cbranch_scc0 end1
852       
853l1:     s_xor_b32 sa[2], sa[2], sa[0]
854        s_cbranch_scc0 end2
855       
856        s_branch loop
857       
858b0:     s_xor_b32 sa[5], sa[5], sa[0]
859        s_cbranch_vccz l0
860        s_xor_b32 sa[6], sa[6], sa[1]
861        s_branch l1
862)ffDXD",
863        {
864            {   // block 0 - start
865                0, 24,
866                { { 4, true } },
867                {
868                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
869                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
870                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
871                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
872                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
873                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
874                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
875                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
876                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
877                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
878                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
879                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
880                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
881                }, true, false, false },
882            {   // block 1 - end
883                24, 48,
884                { },
885                {
886                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
887                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
888                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
889                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
890                    { { "sa", 5 }, SSAInfo(1, 4, 4, 4, 1, true) },
891                    { { "sa", 6 }, SSAInfo(1, 4, 4, 4, 1, true) }
892                }, false, false, true },
893            {   // block 2 - end1
894                48, 56,
895                { },
896                {
897                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
898                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
899                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
900                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
901                }, false, true, true },
902            {   // block 3 - end2
903                56, 64,
904                { },
905                {
906                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
907                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
908                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
909                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
910                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, false) }
911                }, false, true, true },
912            {   // block 4 - routine
913                64, 76,
914                { { 5, false }, { 9, false } },
915                {
916                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
917                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
918                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
919                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
920                }, false, false, false },
921            {   // block 5 - loop
922                76, 80,
923                { },
924                {
925                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
926                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
927                }, false, false, false },
928            {   // block 6 - l0
929                80, 88,
930                { { 2, false }, { 7, false } },
931                {
932                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
933                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
934                }, false, false, false },
935            {   // block 7 - l1
936                88, 96,
937                { { 3, false }, { 8, false } },
938                {
939                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
940                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
941                }, false, false, false },
942            {   // block 8 - loop end
943                96, 100,
944                { { 5, false } },
945                { },
946                false, false, true },
947            {   // block 9 - b0
948                100, 108,
949                { { 6, false }, { 10, false } },
950                {
951                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
952                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) }
953                }, false, false, false },
954            {   // block 10 - to l1
955                108, 116,
956                { { 7, false } },
957                {
958                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
959                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
960                }, false, false, true }
961        },
962        {   // SSA replaces
963            { { "sa", 2 }, { { 3, 2 } } },
964            { { "sa", 3 }, { { 3, 2 } } },
965            { { "sa", 4 }, { { 2, 1 } } },
966            { { "sa", 5 }, { { 2, 1 }, { 3, 1 } } },
967            { { "sa", 6 }, { { 2, 1 }, { 3, 1 } } }
968        },
969        true, ""
970    },
971    {   // 5 - routine with routine with regvar unused in the first routine
972        R"ffDXD(.regvar sa:s:8, va:v:8
973        s_mov_b32 sa[2], s4
974        s_mov_b32 sa[3], s4
975        s_mov_b32 sa[6], s7
976       
977        .cf_call routine
978        s_swappc_b64 s[0:1], s[2:3]
979       
980        s_add_u32 sa[2], sa[2], sa[0]
981        s_add_u32 sa[3], sa[3], sa[0]
982        s_add_u32 sa[6], sa[6], sa[0]
983        s_endpgm
984       
985routine:
986        s_xor_b32 sa[2], sa[2], sa[0]
987        s_xor_b32 sa[3], sa[3], sa[1]
988        s_cbranch_vccnz b0
989       
990        .cf_call routine2
991        s_swappc_b64 s[0:1], s[2:3]
992       
993        .cf_ret
994        s_setpc_b64 s[0:1]
995       
996b0:     s_xor_b32 sa[3], sa[3], sa[0]
997        .cf_ret
998        s_setpc_b64 s[0:1]
999
1000routine2:
1001        s_and_b32 sa[6], sa[0], sa[1]
1002        .cf_ret
1003        s_setpc_b64 s[0:1]
1004)ffDXD",
1005        {
1006            {   // block 0 - start
1007                0, 16,
1008                { { 2, true } },
1009                {
1010                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1011                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1012                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1013                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1014                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1015                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1016                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1017                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1018                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1019                }, true, false, false },
1020            {   // block 1 - end
1021                16, 32,
1022                { },
1023                {
1024                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1025                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1026                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1027                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1028                }, false, false, true },
1029            {   // block 2 - routine
1030                32, 44,
1031                { { 3, false }, { 5, false } },
1032                {
1033                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1034                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1035                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1036                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1037                }, false, false, false },
1038            {   // block 3 - call routine
1039                44, 48,
1040                { { 6, true } },
1041                {
1042                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1043                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1044                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1045                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1046                }, true, false, false },
1047            {   // block 4 - routine ret
1048                48, 52,
1049                { },
1050                {
1051                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1052                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1053                }, false, true, true },
1054            {   // block 5 - b0
1055                52, 60,
1056                { },
1057                {
1058                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1059                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1060                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1061                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
1062                }, false, true, true },
1063            {   // block 6 - routine2
1064                60, 68,
1065                { },
1066                {
1067                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1068                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1069                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1070                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1071                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, false) }
1072                }, false, true, true }
1073        },
1074        {   // SSA replaces
1075            { { "sa", 3 }, { { 3, 2 } } },
1076            { { "sa", 6 }, { { 2, 1 } } }
1077        },
1078        true, ""
1079    },
1080    {   // 6 - routine with routine with regvar unused in the first routine
1081        R"ffDXD(.regvar sa:s:8, va:v:8
1082        s_mov_b32 sa[2], s4
1083        s_mov_b32 sa[3], s4
1084        s_mov_b32 sa[6], s7
1085       
1086        .cf_call routine
1087        s_swappc_b64 s[0:1], s[2:3]
1088       
1089        s_add_u32 sa[2], sa[2], sa[0]
1090        s_add_u32 sa[3], sa[3], sa[0]
1091        s_add_u32 sa[6], sa[6], sa[0]
1092        s_endpgm
1093
1094b0:     s_xor_b32 sa[3], sa[3], sa[0]
1095        .cf_ret
1096        s_setpc_b64 s[0:1]
1097       
1098routine:
1099        s_xor_b32 sa[2], sa[2], sa[0]
1100        s_xor_b32 sa[3], sa[3], sa[1]
1101        s_cbranch_vccnz b0
1102       
1103        .cf_call routine2
1104        s_swappc_b64 s[0:1], s[2:3]
1105
1106        .cf_ret
1107        s_setpc_b64 s[0:1]
1108       
1109routine2:
1110        s_and_b32 sa[6], sa[0], sa[1]
1111        .cf_ret
1112        s_setpc_b64 s[0:1]
1113)ffDXD",
1114        {
1115            {   // block 0 - start
1116                0, 16,
1117                { { 3, true } },
1118                {
1119                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1120                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1121                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1122                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
1123                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
1124                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
1125                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
1126                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
1127                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
1128                }, true, false, false },
1129            {   // block 1 - end
1130                16, 32,
1131                { },
1132                {
1133                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1134                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
1135                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
1136                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
1137                }, false, false, true },
1138            {   // block 2 - b0
1139                32, 40,
1140                { },
1141                {
1142                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1143                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1144                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1145                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
1146                }, false, true, true },
1147            {   // block 3 - routine
1148                40, 52,
1149                { { 2, false }, { 4, false } },
1150                {
1151                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1152                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1153                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
1154                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
1155                }, false, false, false },
1156            {   // block 4 - call routine
1157                52, 56,
1158                { { 6, true } },
1159                {
1160                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
1161                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
1162                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
1163                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) }
1164                }, true, false, false },
1165            {   // block 5 - routine ret
1166                56, 60,
1167                { },
1168                {
1169                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1170                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1171                }, false, true, true },
1172            {   // block 6 - routine2
1173                60, 68,
1174                { },
1175                {
1176                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
1177                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
1178                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1179                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
1180                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, false) }
1181                }, false, true, true }
1182        },
1183        {   // SSA replaces
1184            { { "sa", 3 }, { { 3, 2 } } },
1185            { { "sa", 6 }, { { 2, 1 } } }
1186        },
1187        true, ""
1188    },
1189    { nullptr }
1190};
Note: See TracBrowser for help on using the repository browser.