1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs -run-pass=machine-sink -o - %s | FileCheck -check-prefixes=GFX9 %s
3
4---
5name:            test_sink_fmac_to_only_use
6alignment:       1
7tracksRegLiveness: true
8machineFunctionInfo:
9  isEntryFunction: true
10body:             |
11  ; GFX9-LABEL: name: test_sink_fmac_to_only_use
12  ; GFX9: bb.0:
13  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
14  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
15  ; GFX9-NEXT: {{  $}}
16  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
17  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
18  ; GFX9-NEXT:   [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
19  ; GFX9-NEXT:   [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
20  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
21  ; GFX9-NEXT:   [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0
22  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
23  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]]
24  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
25  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
26  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
27  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
28  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
29  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
30  ; GFX9-NEXT:   S_BRANCH %bb.1
31  ; GFX9-NEXT: {{  $}}
32  ; GFX9-NEXT: bb.1:
33  ; GFX9-NEXT:   successors: %bb.2(0x80000000)
34  ; GFX9-NEXT: {{  $}}
35  ; GFX9-NEXT:   %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
36  ; GFX9-NEXT:   %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
37  ; GFX9-NEXT:   %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
38  ; GFX9-NEXT:   %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
39  ; GFX9-NEXT:   [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec
40  ; GFX9-NEXT:   [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec
41  ; GFX9-NEXT: {{  $}}
42  ; GFX9-NEXT: bb.2:
43  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
44  ; GFX9-NEXT: {{  $}}
45  ; GFX9-NEXT:   [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1
46  ; GFX9-NEXT:   [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1
47  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
48  ; GFX9-NEXT: {{  $}}
49  ; GFX9-NEXT: bb.3:
50  ; GFX9-NEXT:   S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]]
51  bb.0:
52    liveins: $vgpr0, $vgpr1, $vgpr2
53    %1:vgpr_32 = COPY $vgpr0
54    %2:vgpr_32 = COPY $vgpr1
55    %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
56    %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
57    %5:sreg_64 = S_MOV_B64 0
58    %6:sreg_64 = S_MOV_B64 0
59    %7:vreg_64 = COPY %5
60    %8:vreg_64 = COPY %6
61    %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1)
62    %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
63    %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
64    %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1)
65    %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
66    %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
67    %15:vgpr_32(s32) = COPY $vgpr0
68    %16:sreg_32 = S_MOV_B32 1
69    %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec
70    %18:sreg_64 = COPY %17
71    %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
72    S_BRANCH %bb.1
73
74  bb.1:
75    %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec
76    %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec
77
78  bb.2:
79    %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1
80    %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1
81    SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
82
83  bb.3:
84    S_ENDPGM 0, implicit %22, implicit %23
85...
86---
87name:            test_no_sink_into_if_cond_multiple_uses
88alignment:       1
89tracksRegLiveness: true
90machineFunctionInfo:
91  isEntryFunction: true
92body:             |
93  ; GFX9-LABEL: name: test_no_sink_into_if_cond_multiple_uses
94  ; GFX9: bb.0:
95  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
96  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
97  ; GFX9-NEXT: {{  $}}
98  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
99  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
100  ; GFX9-NEXT:   [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
101  ; GFX9-NEXT:   [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
102  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
103  ; GFX9-NEXT:   [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0
104  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
105  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]]
106  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
107  ; GFX9-NEXT:   %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
108  ; GFX9-NEXT:   %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
109  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
110  ; GFX9-NEXT:   %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
111  ; GFX9-NEXT:   %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
112  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
113  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
114  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
115  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
116  ; GFX9-NEXT:   S_BRANCH %bb.1
117  ; GFX9-NEXT: {{  $}}
118  ; GFX9-NEXT: bb.1:
119  ; GFX9-NEXT:   successors: %bb.2(0x80000000)
120  ; GFX9-NEXT: {{  $}}
121  ; GFX9-NEXT:   [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec
122  ; GFX9-NEXT:   [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec
123  ; GFX9-NEXT: {{  $}}
124  ; GFX9-NEXT: bb.2:
125  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
126  ; GFX9-NEXT: {{  $}}
127  ; GFX9-NEXT:   [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1
128  ; GFX9-NEXT:   [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1
129  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
130  ; GFX9-NEXT: {{  $}}
131  ; GFX9-NEXT: bb.3:
132  ; GFX9-NEXT:   [[V_ADD_F32_e32_2:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %13, %10, implicit $mode, implicit $exec
133  ; GFX9-NEXT:   S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]]
134  bb.0:
135    liveins: $vgpr0, $vgpr1, $vgpr2
136    %1:vgpr_32 = COPY $vgpr0
137    %2:vgpr_32 = COPY $vgpr1
138    %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
139    %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
140    %5:sreg_64 = S_MOV_B64 0
141    %6:sreg_64 = S_MOV_B64 0
142    %7:vreg_64 = COPY %5
143    %8:vreg_64 = COPY %6
144    %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1)
145    %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
146    %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
147    %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1)
148    %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
149    %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
150    %15:vgpr_32(s32) = COPY $vgpr0
151    %16:sreg_32 = S_MOV_B32 1
152    %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec
153    %18:sreg_64 = COPY %17
154    %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
155    S_BRANCH %bb.1
156
157  bb.1:
158    %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec
159    %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec
160
161  bb.2:
162    %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1
163    %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1
164    SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
165
166  bb.3:
167    %24:vgpr_32 = V_ADD_F32_e32 %14, %11, implicit $mode, implicit $exec
168    S_ENDPGM 0, implicit %22, implicit %23
169...
170---
171name:            no_sink_fmac_not_constant_mode
172alignment:       1
173tracksRegLiveness: true
174machineFunctionInfo:
175  isEntryFunction: true
176body:             |
177  ; GFX9-LABEL: name: no_sink_fmac_not_constant_mode
178  ; GFX9: bb.0:
179  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
180  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
181  ; GFX9-NEXT: {{  $}}
182  ; GFX9-NEXT:   $mode = IMPLICIT_DEF
183  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
184  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
185  ; GFX9-NEXT:   [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
186  ; GFX9-NEXT:   [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
187  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
188  ; GFX9-NEXT:   [[S_MOV_B64_1:%[0-9]+]]:sreg_64 = S_MOV_B64 0
189  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
190  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_1]]
191  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
192  ; GFX9-NEXT:   %9:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
193  ; GFX9-NEXT:   %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
194  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
195  ; GFX9-NEXT:   %12:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
196  ; GFX9-NEXT:   %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
197  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
198  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
199  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
200  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
201  ; GFX9-NEXT:   S_BRANCH %bb.1
202  ; GFX9-NEXT: {{  $}}
203  ; GFX9-NEXT: bb.1:
204  ; GFX9-NEXT:   successors: %bb.2(0x80000000)
205  ; GFX9-NEXT: {{  $}}
206  ; GFX9-NEXT:   [[V_ADD_F32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %9, %10, implicit $mode, implicit $exec
207  ; GFX9-NEXT:   [[V_ADD_F32_e32_1:%[0-9]+]]:vgpr_32 = V_ADD_F32_e32 %12, %13, implicit $mode, implicit $exec
208  ; GFX9-NEXT: {{  $}}
209  ; GFX9-NEXT: bb.2:
210  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
211  ; GFX9-NEXT: {{  $}}
212  ; GFX9-NEXT:   [[PHI:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_]], %bb.0, [[V_ADD_F32_e32_]], %bb.1
213  ; GFX9-NEXT:   [[PHI1:%[0-9]+]]:vgpr_32 = PHI [[V_MOV_B32_e32_1]], %bb.0, [[V_ADD_F32_e32_1]], %bb.1
214  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
215  ; GFX9-NEXT: {{  $}}
216  ; GFX9-NEXT: bb.3:
217  ; GFX9-NEXT:   S_ENDPGM 0, implicit [[PHI]], implicit [[PHI1]]
218  bb.0:
219    liveins: $vgpr0, $vgpr1, $vgpr2
220    $mode = IMPLICIT_DEF
221    %1:vgpr_32 = COPY $vgpr0
222    %2:vgpr_32 = COPY $vgpr1
223    %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
224    %4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
225    %5:sreg_64 = S_MOV_B64 0
226    %6:sreg_64 = S_MOV_B64 0
227    %7:vreg_64 = COPY %5
228    %8:vreg_64 = COPY %6
229    %9:vgpr_32 = GLOBAL_LOAD_DWORD killed %7, 0, 0, implicit $exec :: (load (s32), addrspace 1)
230    %10:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %9, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
231    %11:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %10, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
232    %12:vgpr_32 = GLOBAL_LOAD_DWORD killed %8, 0, 0, implicit $exec :: (load (s32), addrspace 1)
233    %13:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %12, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
234    %14:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %13, 0, %2, 0, %1, 0, 0, implicit $mode, implicit $exec
235    %15:vgpr_32(s32) = COPY $vgpr0
236    %16:sreg_32 = S_MOV_B32 1
237    %17:sreg_64 = V_CMP_LT_I32_e64 %15(s32), %16, implicit $exec
238    %18:sreg_64 = COPY %17
239    %19:sreg_64 = SI_IF %18, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
240    S_BRANCH %bb.1
241
242  bb.1:
243    %20:vgpr_32 = V_ADD_F32_e32 %10, %11, implicit $mode, implicit $exec
244    %21:vgpr_32 = V_ADD_F32_e32 %13, %14, implicit $mode, implicit $exec
245
246  bb.2:
247    %22:vgpr_32 = PHI %3, %bb.0, %20, %bb.1
248    %23:vgpr_32 = PHI %4, %bb.0, %21, %bb.1
249    SI_END_CF %19, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
250
251  bb.3:
252    S_ENDPGM 0, implicit %22, implicit %23
253...
254---
255name:            test_no_sink_fmac_wwm
256alignment:       1
257tracksRegLiveness: true
258machineFunctionInfo:
259  isEntryFunction: true
260body:             |
261  ; GFX9-LABEL: name: test_no_sink_fmac_wwm
262  ; GFX9: bb.0:
263  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
264  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
265  ; GFX9-NEXT: {{  $}}
266  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
267  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
268  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
269  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
270  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
271  ; GFX9-NEXT:   %5:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
272  ; GFX9-NEXT:   early-clobber %6:vgpr_32 = STRICT_WWM %5, implicit $exec
273  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
274  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
275  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY3]](s32), [[S_MOV_B32_]], implicit $exec
276  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
277  ; GFX9-NEXT:   S_BRANCH %bb.1
278  ; GFX9-NEXT: {{  $}}
279  ; GFX9-NEXT: bb.1:
280  ; GFX9-NEXT:   successors: %bb.2(0x80000000)
281  ; GFX9-NEXT: {{  $}}
282  ; GFX9-NEXT: {{  $}}
283  ; GFX9-NEXT: bb.2:
284  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
285  ; GFX9-NEXT: {{  $}}
286  ; GFX9-NEXT:   S_NOP 0, implicit %5
287  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
288  ; GFX9-NEXT: {{  $}}
289  ; GFX9-NEXT: bb.3:
290  ; GFX9-NEXT:   S_ENDPGM 0, implicit %6
291  bb.0:
292    liveins: $vgpr0, $vgpr1, $vgpr2
293    %1:vgpr_32 = COPY $vgpr0
294    %2:vgpr_32 = COPY $vgpr1
295
296    %20:sreg_64 = S_MOV_B64 0
297    %30:vreg_64 = COPY %20
298    %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1)
299    %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %1, 0, %2, 0, 0, implicit $mode, implicit $exec
300    %9:vgpr_32 = STRICT_WWM %6, implicit $exec
301
302    %16:vgpr_32(s32) = COPY $vgpr0
303    %23:sreg_32 = S_MOV_B32 1
304    %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec
305    %0:sreg_64 = COPY %24
306    %5:sreg_64 = SI_IF %0, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
307    S_BRANCH %bb.1
308
309  bb.1:
310
311  bb.2:
312    S_NOP 0, implicit %6
313    SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
314
315  bb.3:
316    S_ENDPGM 0, implicit %9
317...
318---
319name:            test_def_and_use_in_loop_sink_fmac
320tracksRegLiveness: true
321machineFunctionInfo:
322  isEntryFunction: true
323body:             |
324  ; GFX9-LABEL: name: test_def_and_use_in_loop_sink_fmac
325  ; GFX9: bb.0.entry:
326  ; GFX9-NEXT:   successors: %bb.1(0x80000000)
327  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
328  ; GFX9-NEXT: {{  $}}
329  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
330  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
331  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3
332  ; GFX9-NEXT: {{  $}}
333  ; GFX9-NEXT: bb.1:
334  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
335  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
336  ; GFX9-NEXT: {{  $}}
337  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
338  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
339  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
340  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
341  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
342  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
343  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
344  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
345  ; GFX9-NEXT:   S_BRANCH %bb.2
346  ; GFX9-NEXT: {{  $}}
347  ; GFX9-NEXT: bb.2:
348  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
349  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
350  ; GFX9-NEXT: {{  $}}
351  ; GFX9-NEXT:   S_NOP 0
352  ; GFX9-NEXT: {{  $}}
353  ; GFX9-NEXT: bb.3:
354  ; GFX9-NEXT:   successors: %bb.4(0x40000000), %bb.6(0x40000000)
355  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
356  ; GFX9-NEXT: {{  $}}
357  ; GFX9-NEXT:   %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
358  ; GFX9-NEXT:   %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
359  ; GFX9-NEXT:   S_NOP 0, implicit %6, implicit %8
360  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
361  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.6, implicit $exec
362  ; GFX9-NEXT: {{  $}}
363  ; GFX9-NEXT: bb.4:
364  ; GFX9-NEXT:   successors: %bb.5(0x04000000), %bb.4(0x7c000000)
365  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
366  ; GFX9-NEXT: {{  $}}
367  ; GFX9-NEXT:   S_NOP 0
368  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
369  ; GFX9-NEXT: {{  $}}
370  ; GFX9-NEXT: bb.5:
371  ; GFX9-NEXT:   successors: %bb.6(0x80000000)
372  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
373  ; GFX9-NEXT: {{  $}}
374  ; GFX9-NEXT:   S_NOP 0
375  ; GFX9-NEXT: {{  $}}
376  ; GFX9-NEXT: bb.6:
377  ; GFX9-NEXT:   successors: %bb.7(0x04000000), %bb.1(0x7c000000)
378  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
379  ; GFX9-NEXT: {{  $}}
380  ; GFX9-NEXT:   S_CBRANCH_VCCZ %bb.1, implicit $vcc
381  ; GFX9-NEXT: {{  $}}
382  ; GFX9-NEXT: bb.7:
383  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
384  ; GFX9-NEXT: {{  $}}
385  ; GFX9-NEXT:   S_ENDPGM 0
386  bb.0.entry:
387    successors: %bb.1(0x80000000)
388
389    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
390    %101:vgpr_32 = COPY $vgpr0
391    %102:vgpr_32 = COPY $vgpr1
392    %15:vreg_64 = COPY $vgpr2_vgpr3
393
394  bb.1:
395    successors: %bb.2(0x40000000), %bb.3(0x40000000)
396    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
397
398    %20:sreg_64 = S_MOV_B64 0
399    %30:vreg_64 = COPY %20
400    %29:vgpr_32 = GLOBAL_LOAD_DWORD %30, 0, 0, implicit $exec :: (load (s32), addrspace 1)
401    %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
402    %31:vgpr_32 = GLOBAL_LOAD_DWORD  %15, 0, 0, implicit $exec :: (load (s32), addrspace 1)
403    %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
404    %16:vgpr_32(s32) = COPY $vgpr0
405    %23:sreg_32 = S_MOV_B32 1
406    %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec
407    %0:sreg_64 = COPY %24
408    %5:sreg_64 = SI_IF %0, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
409    S_BRANCH %bb.2
410
411  bb.2:
412    successors: %bb.3(0x80000000)
413    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
414
415    S_NOP 0
416
417  bb.3:
418    successors: %bb.4(0x40000000), %bb.6(0x40000000)
419    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
420
421    S_NOP 0, implicit %6, implicit %7
422    SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
423    S_CBRANCH_EXECZ %bb.6, implicit $exec
424
425  bb.4:
426    successors: %bb.5(0x04000000), %bb.4(0x7c000000)
427    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
428
429    S_NOP 0
430    S_CBRANCH_EXECZ %bb.4, implicit $exec
431
432  bb.5:
433    successors: %bb.6(0x80000000)
434    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
435
436    S_NOP 0
437
438  bb.6:
439    successors: %bb.7(0x04000000), %bb.1(0x7c000000)
440    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
441
442    S_CBRANCH_VCCZ %bb.1, implicit $vcc
443
444  bb.7:
445    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
446    S_ENDPGM 0
447...
448---
449name:            test_no_sink_def_into_loop
450tracksRegLiveness: true
451machineFunctionInfo:
452  isEntryFunction: true
453body:             |
454  ; GFX9-LABEL: name: test_no_sink_def_into_loop
455  ; GFX9: bb.0.entry:
456  ; GFX9-NEXT:   successors: %bb.1(0x80000000)
457  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
458  ; GFX9-NEXT: {{  $}}
459  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
460  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
461  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3
462  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
463  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
464  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
465  ; GFX9-NEXT:   %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
466  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
467  ; GFX9-NEXT:   %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
468  ; GFX9-NEXT: {{  $}}
469  ; GFX9-NEXT: bb.1:
470  ; GFX9-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
471  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
472  ; GFX9-NEXT: {{  $}}
473  ; GFX9-NEXT:   S_NOP 0, implicit %6, implicit %8
474  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
475  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
476  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
477  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
478  ; GFX9-NEXT:   S_BRANCH %bb.2
479  ; GFX9-NEXT: {{  $}}
480  ; GFX9-NEXT: bb.2:
481  ; GFX9-NEXT:   successors: %bb.3(0x80000000)
482  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
483  ; GFX9-NEXT: {{  $}}
484  ; GFX9-NEXT:   S_NOP 0
485  ; GFX9-NEXT: {{  $}}
486  ; GFX9-NEXT: bb.3:
487  ; GFX9-NEXT:   successors: %bb.4(0x40000000), %bb.6(0x40000000)
488  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
489  ; GFX9-NEXT: {{  $}}
490  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
491  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.6, implicit $exec
492  ; GFX9-NEXT: {{  $}}
493  ; GFX9-NEXT: bb.4:
494  ; GFX9-NEXT:   successors: %bb.5(0x04000000), %bb.4(0x7c000000)
495  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
496  ; GFX9-NEXT: {{  $}}
497  ; GFX9-NEXT:   S_NOP 0
498  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
499  ; GFX9-NEXT: {{  $}}
500  ; GFX9-NEXT: bb.5:
501  ; GFX9-NEXT:   successors: %bb.6(0x80000000)
502  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
503  ; GFX9-NEXT: {{  $}}
504  ; GFX9-NEXT:   S_NOP 0
505  ; GFX9-NEXT: {{  $}}
506  ; GFX9-NEXT: bb.6:
507  ; GFX9-NEXT:   successors: %bb.7(0x04000000), %bb.1(0x7c000000)
508  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
509  ; GFX9-NEXT: {{  $}}
510  ; GFX9-NEXT:   S_CBRANCH_VCCZ %bb.1, implicit $vcc
511  ; GFX9-NEXT: {{  $}}
512  ; GFX9-NEXT: bb.7:
513  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
514  ; GFX9-NEXT: {{  $}}
515  ; GFX9-NEXT:   S_ENDPGM 0
516  bb.0.entry:
517    successors: %bb.1(0x80000000)
518
519    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
520    %101:vgpr_32 = COPY $vgpr0
521    %102:vgpr_32 = COPY $vgpr1
522    %15:vreg_64 = COPY $vgpr2_vgpr3
523    %20:sreg_64 = S_MOV_B64 0
524    %30:vreg_64 = COPY %20
525    %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1)
526    %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
527    %31:vgpr_32 = GLOBAL_LOAD_DWORD killed %15, 0, 0, implicit $exec :: (load (s32), addrspace 1)
528    %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
529
530  bb.1:
531    successors: %bb.2(0x40000000), %bb.3(0x40000000)
532    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
533
534    S_NOP 0, implicit %6, implicit %7
535    %16:vgpr_32(s32) = COPY $vgpr0
536    %23:sreg_32 = S_MOV_B32 1
537    %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec
538    %0:sreg_64 = COPY %24
539    %5:sreg_64 = SI_IF %0, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
540    S_BRANCH %bb.2
541
542  bb.2:
543    successors: %bb.3(0x80000000)
544    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
545
546    S_NOP 0
547
548  bb.3:
549    successors: %bb.4(0x40000000), %bb.6(0x40000000)
550    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
551
552    SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
553    S_CBRANCH_EXECZ %bb.6, implicit $exec
554
555  bb.4:
556    successors: %bb.5(0x04000000), %bb.4(0x7c000000)
557    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
558
559    S_NOP 0
560    S_CBRANCH_EXECZ %bb.4, implicit $exec
561
562  bb.5:
563    successors: %bb.6(0x80000000)
564    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
565
566    S_NOP 0
567
568  bb.6:
569    successors: %bb.7(0x04000000), %bb.1(0x7c000000)
570    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
571
572    S_CBRANCH_VCCZ %bb.1, implicit $vcc
573
574  bb.7:
575    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
576    S_ENDPGM 0
577...
578---
579name:            test_no_sink_def_into_loop2
580tracksRegLiveness: true
581machineFunctionInfo:
582  isEntryFunction: true
583body:             |
584  ; GFX9-LABEL: name: test_no_sink_def_into_loop2
585  ; GFX9: bb.0.entry:
586  ; GFX9-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
587  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
588  ; GFX9-NEXT: {{  $}}
589  ; GFX9-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
590  ; GFX9-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
591  ; GFX9-NEXT:   [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3
592  ; GFX9-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 0
593  ; GFX9-NEXT:   [[COPY3:%[0-9]+]]:vreg_64 = COPY [[S_MOV_B64_]]
594  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY3]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
595  ; GFX9-NEXT:   %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
596  ; GFX9-NEXT:   [[GLOBAL_LOAD_DWORD1:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD killed [[COPY2]], 0, 0, implicit $exec :: (load (s32), addrspace 1)
597  ; GFX9-NEXT:   %8:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, [[GLOBAL_LOAD_DWORD1]], 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
598  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
599  ; GFX9-NEXT:   S_BRANCH %bb.1
600  ; GFX9-NEXT: {{  $}}
601  ; GFX9-NEXT: bb.1:
602  ; GFX9-NEXT:   successors: %bb.2(0x80000000)
603  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
604  ; GFX9-NEXT: {{  $}}
605  ; GFX9-NEXT:   S_NOP 0
606  ; GFX9-NEXT:   S_BRANCH %bb.2
607  ; GFX9-NEXT: {{  $}}
608  ; GFX9-NEXT: bb.2:
609  ; GFX9-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
610  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
611  ; GFX9-NEXT: {{  $}}
612  ; GFX9-NEXT:   S_NOP 0, implicit %6, implicit %8
613  ; GFX9-NEXT:   [[COPY4:%[0-9]+]]:vgpr_32(s32) = COPY $vgpr0
614  ; GFX9-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 1
615  ; GFX9-NEXT:   [[V_CMP_LT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_I32_e64 [[COPY4]](s32), [[S_MOV_B32_]], implicit $exec
616  ; GFX9-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF [[V_CMP_LT_I32_e64_]], %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
617  ; GFX9-NEXT:   S_BRANCH %bb.3
618  ; GFX9-NEXT: {{  $}}
619  ; GFX9-NEXT: bb.3:
620  ; GFX9-NEXT:   successors: %bb.4(0x80000000)
621  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
622  ; GFX9-NEXT: {{  $}}
623  ; GFX9-NEXT:   S_NOP 0
624  ; GFX9-NEXT:   S_BRANCH %bb.4
625  ; GFX9-NEXT: {{  $}}
626  ; GFX9-NEXT: bb.4:
627  ; GFX9-NEXT:   successors: %bb.5(0x40000000), %bb.7(0x40000000)
628  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
629  ; GFX9-NEXT: {{  $}}
630  ; GFX9-NEXT:   SI_END_CF [[SI_IF]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
631  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.7, implicit $exec
632  ; GFX9-NEXT:   S_BRANCH %bb.5
633  ; GFX9-NEXT: {{  $}}
634  ; GFX9-NEXT: bb.5:
635  ; GFX9-NEXT:   successors: %bb.6(0x04000000), %bb.5(0x7c000000)
636  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
637  ; GFX9-NEXT: {{  $}}
638  ; GFX9-NEXT:   S_NOP 0
639  ; GFX9-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
640  ; GFX9-NEXT:   S_BRANCH %bb.6
641  ; GFX9-NEXT: {{  $}}
642  ; GFX9-NEXT: bb.6:
643  ; GFX9-NEXT:   successors: %bb.7(0x80000000)
644  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
645  ; GFX9-NEXT: {{  $}}
646  ; GFX9-NEXT:   S_NOP 0
647  ; GFX9-NEXT:   S_BRANCH %bb.7
648  ; GFX9-NEXT: {{  $}}
649  ; GFX9-NEXT: bb.7:
650  ; GFX9-NEXT:   successors: %bb.8(0x04000000), %bb.2(0x7c000000)
651  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
652  ; GFX9-NEXT: {{  $}}
653  ; GFX9-NEXT:   S_CBRANCH_VCCZ %bb.2, implicit $vcc
654  ; GFX9-NEXT:   S_BRANCH %bb.8
655  ; GFX9-NEXT: {{  $}}
656  ; GFX9-NEXT: bb.8:
657  ; GFX9-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
658  ; GFX9-NEXT: {{  $}}
659  ; GFX9-NEXT:   S_ENDPGM 0
660  bb.0.entry:
661    successors: %bb.1(0x40000000), %bb.2 (0x40000000)
662
663    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
664    %101:vgpr_32 = COPY $vgpr0
665    %102:vgpr_32 = COPY $vgpr1
666    %15:vreg_64 = COPY $vgpr2_vgpr3
667    %20:sreg_64 = S_MOV_B64 0
668    %30:vreg_64 = COPY %20
669    %29:vgpr_32 = GLOBAL_LOAD_DWORD killed %30, 0, 0, implicit $exec :: (load (s32), addrspace 1)
670    %6:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %29, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
671    %31:vgpr_32 = GLOBAL_LOAD_DWORD killed %15, 0, 0, implicit $exec :: (load (s32), addrspace 1)
672    %7:vgpr_32 = contract nofpexcept V_FMAC_F32_e64 0, %31, 0, %101, 0, %102, 0, 0, implicit $mode, implicit $exec
673    S_CBRANCH_EXECZ %bb.2, implicit $exec
674    S_BRANCH %bb.1
675
676  bb.1:
677    successors: %bb.2(0x80000000)
678    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
679    S_NOP 0
680    S_BRANCH %bb.2
681
682  bb.2:
683    successors: %bb.3(0x40000000), %bb.4(0x40000000)
684    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
685
686    S_NOP 0, implicit %6, implicit %7
687    %16:vgpr_32(s32) = COPY $vgpr0
688    %23:sreg_32 = S_MOV_B32 1
689    %24:sreg_64 = V_CMP_LT_I32_e64 %16(s32), %23, implicit $exec
690    %0:sreg_64 = COPY %24
691    %5:sreg_64 = SI_IF %0, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
692    S_BRANCH %bb.3
693
694  bb.3:
695    successors: %bb.4(0x80000000)
696    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
697
698    S_NOP 0
699    S_BRANCH %bb.4
700
701  bb.4:
702    successors: %bb.5(0x40000000), %bb.7(0x40000000)
703    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
704
705    SI_END_CF %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
706    S_CBRANCH_EXECZ %bb.7, implicit $exec
707    S_BRANCH %bb.5
708
709  bb.5:
710    successors: %bb.6(0x04000000), %bb.5(0x7c000000)
711    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
712
713    S_NOP 0
714    S_CBRANCH_EXECZ %bb.5, implicit $exec
715    S_BRANCH %bb.6
716
717  bb.6:
718    successors: %bb.7(0x80000000)
719    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
720
721    S_NOP 0
722    S_BRANCH %bb.7
723
724  bb.7:
725    successors: %bb.8(0x04000000), %bb.2(0x7c000000)
726    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
727
728    S_CBRANCH_VCCZ %bb.2, implicit $vcc
729    S_BRANCH %bb.8
730
731  bb.8:
732    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vcc
733    S_ENDPGM 0
734...
735