1004 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass=si-lower-control-flow -amdgpu-remove-redundant-endcf %s -o - | FileCheck -check-prefix=GCN %s3# RUN: llc -mtriple=amdgcn -passes=si-lower-control-flow -amdgpu-remove-redundant-endcf %s -o - | FileCheck -check-prefix=GCN %s4 5# Make sure dbg_value doesn't change codeegn when collapsing end_cf6---7name: simple_nested_if_dbg_value8tracksRegLiveness: true9machineFunctionInfo:10 isEntryFunction: true11body: |12 ; GCN-LABEL: name: simple_nested_if_dbg_value13 ; GCN: bb.0:14 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)15 ; GCN-NEXT: {{ $}}16 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec17 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc18 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]19 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec20 ; GCN-NEXT: {{ $}}21 ; GCN-NEXT: bb.1:22 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.4(0x40000000)23 ; GCN-NEXT: {{ $}}24 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec25 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc26 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]27 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec28 ; GCN-NEXT: {{ $}}29 ; GCN-NEXT: bb.2:30 ; GCN-NEXT: successors: %bb.4(0x80000000)31 ; GCN-NEXT: {{ $}}32 ; GCN-NEXT: bb.4:33 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc34 ; GCN-NEXT: DBG_VALUE35 ; GCN-NEXT: S_ENDPGM 036 bb.0:37 successors: %bb.1, %bb.438 39 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec40 41 bb.1:42 successors: %bb.2, %bb.343 44 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec45 46 bb.2:47 48 bb.3:49 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec50 DBG_VALUE51 52 bb.4:53 DBG_VALUE54 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec55 S_ENDPGM 056 57...58 59# Empty block separates the collapsable s_or_b6460---61name: simple_nested_if_empty_block_between62tracksRegLiveness: true63machineFunctionInfo:64 isEntryFunction: true65body: |66 ; GCN-LABEL: name: simple_nested_if_empty_block_between67 ; GCN: bb.0:68 ; GCN-NEXT: successors: %bb.5(0x40000000), %bb.1(0x40000000)69 ; GCN-NEXT: {{ $}}70 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec71 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc72 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]73 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.5, implicit $exec74 ; GCN-NEXT: {{ $}}75 ; GCN-NEXT: bb.1:76 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.4(0x40000000)77 ; GCN-NEXT: {{ $}}78 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec79 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc80 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]81 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec82 ; GCN-NEXT: {{ $}}83 ; GCN-NEXT: bb.2:84 ; GCN-NEXT: successors: %bb.4(0x80000000)85 ; GCN-NEXT: {{ $}}86 ; GCN-NEXT: bb.4:87 ; GCN-NEXT: successors: %bb.5(0x80000000)88 ; GCN-NEXT: {{ $}}89 ; GCN-NEXT: bb.5:90 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc91 ; GCN-NEXT: S_ENDPGM 092 bb.0:93 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec94 95 bb.1:96 successors: %bb.2, %bb.397 98 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec99 100 bb.2:101 102 bb.3:103 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec104 105 bb.5:106 107 bb.4:108 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec109 S_ENDPGM 0110 111...112 113# Effectively empty block separates the collapsable s_or_b64114---115name: simple_nested_if_empty_block_dbg_between116tracksRegLiveness: true117machineFunctionInfo:118 isEntryFunction: true119body: |120 ; GCN-LABEL: name: simple_nested_if_empty_block_dbg_between121 ; GCN: bb.0:122 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.5(0x40000000)123 ; GCN-NEXT: {{ $}}124 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec125 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc126 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]127 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.5, implicit $exec128 ; GCN-NEXT: {{ $}}129 ; GCN-NEXT: bb.1:130 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.4(0x40000000)131 ; GCN-NEXT: {{ $}}132 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec133 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc134 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]135 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec136 ; GCN-NEXT: {{ $}}137 ; GCN-NEXT: bb.2:138 ; GCN-NEXT: successors: %bb.4(0x80000000)139 ; GCN-NEXT: {{ $}}140 ; GCN-NEXT: bb.4:141 ; GCN-NEXT: successors: %bb.5(0x80000000)142 ; GCN-NEXT: {{ $}}143 ; GCN-NEXT: DBG_VALUE144 ; GCN-NEXT: {{ $}}145 ; GCN-NEXT: bb.5:146 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc147 ; GCN-NEXT: S_ENDPGM 0148 bb.0:149 successors: %bb.1, %bb.4150 151 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec152 153 bb.1:154 successors: %bb.2, %bb.3155 156 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec157 158 bb.2:159 160 bb.3:161 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec162 163 bb.5:164 DBG_VALUE165 166 bb.4:167 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec168 S_ENDPGM 0169 170...171 172---173name: skip_salu_and_meta_insts_find_first174tracksRegLiveness: true175machineFunctionInfo:176 isEntryFunction: true177body: |178 ; GCN-LABEL: name: skip_salu_and_meta_insts_find_first179 ; GCN: bb.0:180 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)181 ; GCN-NEXT: liveins: $vgpr0, $sgpr0_sgpr1182 ; GCN-NEXT: {{ $}}183 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec184 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc185 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]186 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec187 ; GCN-NEXT: {{ $}}188 ; GCN-NEXT: bb.1:189 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)190 ; GCN-NEXT: {{ $}}191 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec192 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc193 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]194 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec195 ; GCN-NEXT: {{ $}}196 ; GCN-NEXT: bb.2:197 ; GCN-NEXT: successors: %bb.3(0x80000000)198 ; GCN-NEXT: {{ $}}199 ; GCN-NEXT: bb.3:200 ; GCN-NEXT: successors: %bb.4(0x80000000)201 ; GCN-NEXT: {{ $}}202 ; GCN-NEXT: [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF203 ; GCN-NEXT: [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]204 ; GCN-NEXT: KILL [[DEF]]205 ; GCN-NEXT: {{ $}}206 ; GCN-NEXT: bb.4:207 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc208 ; GCN-NEXT: S_ENDPGM 0209 bb.0:210 successors: %bb.1, %bb.4211 liveins: $vgpr0, $sgpr0_sgpr1212 213 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec214 215 bb.1:216 successors: %bb.2, %bb.3217 218 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec219 220 bb.2:221 222 bb.3:223 %4:sgpr_32 = IMPLICIT_DEF224 %5:sgpr_32 = S_BREV_B32 %4225 KILL %4226 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec227 228 bb.4:229 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec230 S_ENDPGM 0231 232...233 234# Make sure SALU instructions, meta instructions, and SGPR->SGPR235# copies are skipped.236---237name: skip_salu_and_meta_insts_after238tracksRegLiveness: true239machineFunctionInfo:240 isEntryFunction: true241body: |242 ; GCN-LABEL: name: skip_salu_and_meta_insts_after243 ; GCN: bb.0:244 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)245 ; GCN-NEXT: {{ $}}246 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec247 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc248 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]249 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec250 ; GCN-NEXT: {{ $}}251 ; GCN-NEXT: bb.1:252 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)253 ; GCN-NEXT: {{ $}}254 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec255 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc256 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]257 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec258 ; GCN-NEXT: {{ $}}259 ; GCN-NEXT: bb.2:260 ; GCN-NEXT: successors: %bb.3(0x80000000)261 ; GCN-NEXT: {{ $}}262 ; GCN-NEXT: bb.3:263 ; GCN-NEXT: successors: %bb.4(0x80000000)264 ; GCN-NEXT: {{ $}}265 ; GCN-NEXT: [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF266 ; GCN-NEXT: [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]267 ; GCN-NEXT: KILL [[DEF]]268 ; GCN-NEXT: [[COPY2:%[0-9]+]]:sgpr_32 = COPY [[S_BREV_B32_]]269 ; GCN-NEXT: {{ $}}270 ; GCN-NEXT: bb.4:271 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc272 ; GCN-NEXT: S_ENDPGM 0273 bb.0:274 successors: %bb.1, %bb.4275 276 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec277 278 bb.1:279 successors: %bb.2, %bb.3280 281 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec282 283 bb.2:284 285 bb.3:286 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec287 %4:sgpr_32 = IMPLICIT_DEF288 %5:sgpr_32 = S_BREV_B32 %4289 KILL %4290 %6:sgpr_32 = COPY %5291 292 bb.4:293 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec294 S_ENDPGM 0295 296...297 298# SALU instruction depends on exec through a normal operand.299---300name: salu_exec_dependency301tracksRegLiveness: true302machineFunctionInfo:303 isEntryFunction: true304body: |305 ; GCN-LABEL: name: salu_exec_dependency306 ; GCN: bb.0:307 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)308 ; GCN-NEXT: {{ $}}309 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec310 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc311 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]312 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec313 ; GCN-NEXT: {{ $}}314 ; GCN-NEXT: bb.1:315 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)316 ; GCN-NEXT: {{ $}}317 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec318 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc319 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]320 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec321 ; GCN-NEXT: {{ $}}322 ; GCN-NEXT: bb.2:323 ; GCN-NEXT: successors: %bb.3(0x80000000)324 ; GCN-NEXT: {{ $}}325 ; GCN-NEXT: bb.3:326 ; GCN-NEXT: successors: %bb.4(0x80000000)327 ; GCN-NEXT: {{ $}}328 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc329 ; GCN-NEXT: [[S_BREV_B64_:%[0-9]+]]:sreg_64 = S_BREV_B64 $exec330 ; GCN-NEXT: {{ $}}331 ; GCN-NEXT: bb.4:332 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc333 ; GCN-NEXT: S_ENDPGM 0334 bb.0:335 successors: %bb.1, %bb.4336 337 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec338 339 bb.1:340 successors: %bb.2, %bb.3341 342 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec343 344 bb.2:345 346 bb.3:347 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec348 %4:sreg_64 = S_BREV_B64 $exec349 350 bb.4:351 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec352 S_ENDPGM 0353 354...355 356# Copy to / from VGPR should be assumed to read exec357---358name: copy_no_explicit_exec_dependency359tracksRegLiveness: true360machineFunctionInfo:361 isEntryFunction: true362body: |363 ; GCN-LABEL: name: copy_no_explicit_exec_dependency364 ; GCN: bb.0:365 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)366 ; GCN-NEXT: {{ $}}367 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec368 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc369 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]370 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec371 ; GCN-NEXT: {{ $}}372 ; GCN-NEXT: bb.1:373 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)374 ; GCN-NEXT: {{ $}}375 ; GCN-NEXT: [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF376 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec377 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc378 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]379 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec380 ; GCN-NEXT: {{ $}}381 ; GCN-NEXT: bb.2:382 ; GCN-NEXT: successors: %bb.3(0x80000000)383 ; GCN-NEXT: {{ $}}384 ; GCN-NEXT: bb.3:385 ; GCN-NEXT: successors: %bb.4(0x80000000)386 ; GCN-NEXT: {{ $}}387 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc388 ; GCN-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[DEF]].sub2389 ; GCN-NEXT: {{ $}}390 ; GCN-NEXT: bb.4:391 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc392 ; GCN-NEXT: S_ENDPGM 0393 bb.0:394 successors: %bb.1, %bb.4395 396 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec397 398 bb.1:399 successors: %bb.2, %bb.3400 401 %2:vreg_128 = IMPLICIT_DEF402 %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec403 404 bb.2:405 406 bb.3:407 SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec408 %5:vgpr_32 = COPY %2.sub2409 410 bb.4:411 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec412 S_ENDPGM 0413 414...415 416---417name: simple_nested_if_not_layout_successor418tracksRegLiveness: true419machineFunctionInfo:420 isEntryFunction: true421body: |422 ; GCN-LABEL: name: simple_nested_if_not_layout_successor423 ; GCN: bb.0:424 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)425 ; GCN-NEXT: {{ $}}426 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec427 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc428 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]429 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec430 ; GCN-NEXT: {{ $}}431 ; GCN-NEXT: bb.1:432 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.5(0x40000000)433 ; GCN-NEXT: {{ $}}434 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec435 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc436 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]437 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.5, implicit $exec438 ; GCN-NEXT: {{ $}}439 ; GCN-NEXT: bb.2:440 ; GCN-NEXT: successors: %bb.5(0x80000000)441 ; GCN-NEXT: {{ $}}442 ; GCN-NEXT: S_BRANCH %bb.5443 ; GCN-NEXT: {{ $}}444 ; GCN-NEXT: bb.4:445 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc446 ; GCN-NEXT: S_ENDPGM 0447 ; GCN-NEXT: {{ $}}448 ; GCN-NEXT: bb.5:449 ; GCN-NEXT: successors: %bb.4(0x80000000)450 ; GCN-NEXT: {{ $}}451 ; GCN-NEXT: S_BRANCH %bb.4452 bb.0:453 successors: %bb.1, %bb.4454 455 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec456 457 bb.1:458 successors: %bb.2, %bb.3459 460 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec461 462 bb.2:463 464 bb.3:465 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec466 S_BRANCH %bb.5467 468 bb.4:469 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec470 S_ENDPGM 0471 472 bb.5:473 S_BRANCH %bb.4474 475...476 477# This should never happen, but check that we do not hang anyway478 479---480name: resursive_endcf481tracksRegLiveness: true482liveins:483 - { reg: '$vgpr0', virtual-reg: '%0' }484machineFunctionInfo:485 isEntryFunction: true486body: |487 ; GCN-LABEL: name: resursive_endcf488 ; GCN: bb.0:489 ; GCN-NEXT: successors: %bb.1(0x80000000)490 ; GCN-NEXT: liveins: $vgpr0491 ; GCN-NEXT: {{ $}}492 ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0493 ; GCN-NEXT: [[V_CMP_LT_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_U32_e64 1, [[COPY]], implicit $exec494 ; GCN-NEXT: {{ $}}495 ; GCN-NEXT: bb.1:496 ; GCN-NEXT: successors: %bb.1(0x80000000)497 ; GCN-NEXT: {{ $}}498 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[V_CMP_LT_U32_e64_]], implicit-def $scc499 ; GCN-NEXT: S_BRANCH %bb.1500 bb.0:501 successors: %bb.1502 liveins: $vgpr0503 504 %0:vgpr_32 = COPY $vgpr0505 %2:sreg_64 = V_CMP_LT_U32_e64 1, %0, implicit $exec506 507 bb.1:508 successors: %bb.1509 510 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec511 S_BRANCH %bb.1512 513...514 515# Both s_or_b64 shall be preserved since the outer SI_END_CF belongs to SI_ELSE.516 517---518name: simple_outer_if_else519tracksRegLiveness: true520machineFunctionInfo:521 isEntryFunction: true522body: |523 ; GCN-LABEL: name: simple_outer_if_else524 ; GCN: bb.0:525 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)526 ; GCN-NEXT: {{ $}}527 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec528 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc529 ; GCN-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_]], [[COPY]], implicit-def dead $scc530 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]531 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec532 ; GCN-NEXT: {{ $}}533 ; GCN-NEXT: bb.1:534 ; GCN-NEXT: successors: %bb.2(0x80000000)535 ; GCN-NEXT: {{ $}}536 ; GCN-NEXT: S_BRANCH %bb.2537 ; GCN-NEXT: {{ $}}538 ; GCN-NEXT: bb.2:539 ; GCN-NEXT: successors: %bb.3(0x40000000), %bb.6(0x40000000)540 ; GCN-NEXT: {{ $}}541 ; GCN-NEXT: [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[S_XOR_B64_]], implicit-def $exec, implicit-def $scc, implicit $exec542 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc543 ; GCN-NEXT: $exec = S_XOR_B64_term $exec, [[S_AND_B64_1]], implicit-def $scc544 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.6, implicit $exec545 ; GCN-NEXT: {{ $}}546 ; GCN-NEXT: bb.3:547 ; GCN-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)548 ; GCN-NEXT: {{ $}}549 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec550 ; GCN-NEXT: [[S_AND_B64_2:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc551 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_2]]552 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec553 ; GCN-NEXT: {{ $}}554 ; GCN-NEXT: bb.4:555 ; GCN-NEXT: successors: %bb.5(0x80000000)556 ; GCN-NEXT: {{ $}}557 ; GCN-NEXT: bb.5:558 ; GCN-NEXT: successors: %bb.6(0x80000000)559 ; GCN-NEXT: {{ $}}560 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc561 ; GCN-NEXT: {{ $}}562 ; GCN-NEXT: bb.6:563 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[S_AND_B64_1]], implicit-def $scc564 ; GCN-NEXT: S_ENDPGM 0565 bb.0:566 successors: %bb.1, %bb.2567 568 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec569 570 bb.1:571 successors: %bb.2572 S_BRANCH %bb.2573 574 bb.2:575 successors: %bb.3, %bb.6576 %2:sreg_64 = SI_ELSE %0:sreg_64, %bb.6, implicit-def dead $exec, implicit-def dead $scc, implicit $exec577 578 bb.3:579 successors: %bb.3, %bb.4580 581 %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec582 583 bb.4:584 successors: %bb.5585 586 bb.5:587 successors: %bb.6588 589 SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec590 591 bb.6:592 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec593 S_ENDPGM 0594 595...596 597---598name: if_inside_loop599tracksRegLiveness: true600machineFunctionInfo:601 isEntryFunction: true602body: |603 ; GCN-LABEL: name: if_inside_loop604 ; GCN: bb.0:605 ; GCN-NEXT: successors: %bb.6(0x80000000)606 ; GCN-NEXT: {{ $}}607 ; GCN-NEXT: S_BRANCH %bb.6608 ; GCN-NEXT: {{ $}}609 ; GCN-NEXT: bb.1:610 ; GCN-NEXT: successors: %bb.3(0x40000000), %bb.2(0x40000000)611 ; GCN-NEXT: {{ $}}612 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec613 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc614 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]615 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.3, implicit $exec616 ; GCN-NEXT: {{ $}}617 ; GCN-NEXT: bb.2:618 ; GCN-NEXT: successors: %bb.6(0x80000000)619 ; GCN-NEXT: {{ $}}620 ; GCN-NEXT: S_BRANCH %bb.6621 ; GCN-NEXT: {{ $}}622 ; GCN-NEXT: bb.3:623 ; GCN-NEXT: successors: %bb.4(0x80000000)624 ; GCN-NEXT: {{ $}}625 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc626 ; GCN-NEXT: {{ $}}627 ; GCN-NEXT: bb.4:628 ; GCN-NEXT: successors: %bb.5(0x80000000)629 ; GCN-NEXT: {{ $}}630 ; GCN-NEXT: $exec = S_OR_B64 $exec, %2, implicit-def $scc631 ; GCN-NEXT: {{ $}}632 ; GCN-NEXT: bb.5:633 ; GCN-NEXT: successors: %bb.6(0x80000000)634 ; GCN-NEXT: {{ $}}635 ; GCN-NEXT: bb.6:636 ; GCN-NEXT: successors: %bb.4(0x40000000), %bb.0(0x40000000)637 ; GCN-NEXT: {{ $}}638 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec639 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc640 ; GCN-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_1]], [[COPY1]], implicit-def dead $scc641 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]642 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec643 ; GCN-NEXT: S_BRANCH %bb.0644 ; GCN-NEXT: S_ENDPGM 0645 bb.0:646 S_BRANCH %bb.6647 648 bb.1:649 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec650 651 bb.2:652 S_BRANCH %bb.6653 654 bb.3:655 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec656 657 bb.4:658 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec659 660 bb.5:661 662 bb.6:663 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec664 S_BRANCH %bb.0665 S_ENDPGM 0666 667...668 669---670# redundant MBB removal correctness test:671# we can keep bb.2 fallthrough to the new succ because after bb.3 gets removed672# new succ (bb.4) becomes bb.2's layout successor673name: removed_succ_fallthrough_but_layout_successor674tracksRegLiveness: true675machineFunctionInfo:676 isEntryFunction: true677body: |678 ; GCN-LABEL: name: removed_succ_fallthrough_but_layout_successor679 ; GCN: bb.0:680 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)681 ; GCN-NEXT: {{ $}}682 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec683 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc684 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]685 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec686 ; GCN-NEXT: {{ $}}687 ; GCN-NEXT: bb.1:688 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.4(0x40000000)689 ; GCN-NEXT: {{ $}}690 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec691 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc692 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]693 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec694 ; GCN-NEXT: {{ $}}695 ; GCN-NEXT: bb.2:696 ; GCN-NEXT: successors: %bb.4(0x80000000)697 ; GCN-NEXT: {{ $}}698 ; GCN-NEXT: bb.4:699 ; GCN-NEXT: successors: %bb.5(0x80000000)700 ; GCN-NEXT: {{ $}}701 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc702 ; GCN-NEXT: {{ $}}703 ; GCN-NEXT: bb.5:704 ; GCN-NEXT: S_ENDPGM 0705 bb.0:706 successors: %bb.1, %bb.4707 708 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec709 710 bb.1:711 successors: %bb.2, %bb.3712 713 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec714 715 bb.2:716 717 bb.3:718 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec719 720 721 bb.4:722 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec723 724 bb.5:725 S_ENDPGM 0726 727...728 729---730# redundant MBB removal correctness test:731# If one of the remdundant block preds has a fallthrough path, but the only redundant block succ is not732# going to be a layout successor to that pred after redundant block removal, we should not rearrange733# blocks to keep pred's fallthrough path, if the succ has fallthrough path to one of it's succ too.734 735name: deleted_succ_fallthrough_not_layout_successor736tracksRegLiveness: true737machineFunctionInfo:738 isEntryFunction: true739body: |740 ; GCN-LABEL: name: deleted_succ_fallthrough_not_layout_successor741 ; GCN: bb.0:742 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.4(0x40000000)743 ; GCN-NEXT: {{ $}}744 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec745 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc746 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]747 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.4, implicit $exec748 ; GCN-NEXT: {{ $}}749 ; GCN-NEXT: bb.1:750 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.5(0x40000000)751 ; GCN-NEXT: {{ $}}752 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec753 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc754 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]755 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.5, implicit $exec756 ; GCN-NEXT: {{ $}}757 ; GCN-NEXT: bb.2:758 ; GCN-NEXT: successors: %bb.5(0x80000000)759 ; GCN-NEXT: {{ $}}760 ; GCN-NEXT: S_BRANCH %bb.5761 ; GCN-NEXT: {{ $}}762 ; GCN-NEXT: bb.4:763 ; GCN-NEXT: S_ENDPGM 0764 ; GCN-NEXT: {{ $}}765 ; GCN-NEXT: bb.5:766 ; GCN-NEXT: successors: %bb.6(0x80000000)767 ; GCN-NEXT: {{ $}}768 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc769 ; GCN-NEXT: {{ $}}770 ; GCN-NEXT: bb.6:771 ; GCN-NEXT: successors: %bb.4(0x80000000)772 ; GCN-NEXT: {{ $}}773 ; GCN-NEXT: S_BRANCH %bb.4774 bb.0:775 successors: %bb.1, %bb.4776 777 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec778 779 bb.1:780 successors: %bb.2, %bb.3781 782 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec783 784 bb.2:785 786 bb.3:787 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec788 S_BRANCH %bb.5789 790 bb.4:791 S_ENDPGM 0792 793 794 bb.5:795 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec796 797 bb.6:798 S_BRANCH %bb.4799...800 801---802# While collapsing inner endcf, certain blocks ended up getting two S_BRANCH instructions.803# It happens in the absence of BranchFolding (mostly at -O0) when the irregularly placed BBs are traversed804# in the forward direction and the intervening block between a predecessor and its successor gets optimized805# away in subsequent iterations, leaving 2 S_BRANCH instructions in the predecessor block.806# The issue was fixed by iterating the blocks from bottom-up to ensure all endcf pseudos at the bottom of the807# function are processed first.808# This test ensures there are no multiple S_BRANCH instructions inserted in any block.809 810name: no_multiple_unconditional_branches811tracksRegLiveness: true812body: |813 ; GCN-LABEL: name: no_multiple_unconditional_branches814 ; GCN: bb.0:815 ; GCN-NEXT: successors: %bb.1(0x40000000), %bb.14(0x40000000)816 ; GCN-NEXT: {{ $}}817 ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF818 ; GCN-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF]], implicit $exec819 ; GCN-NEXT: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec820 ; GCN-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc821 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]822 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.14, implicit $exec823 ; GCN-NEXT: S_BRANCH %bb.1824 ; GCN-NEXT: {{ $}}825 ; GCN-NEXT: bb.1:826 ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.14(0x40000000)827 ; GCN-NEXT: {{ $}}828 ; GCN-NEXT: [[DEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF829 ; GCN-NEXT: [[V_CMP_EQ_U32_e64_1:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF1]], implicit $exec830 ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec831 ; GCN-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], killed [[V_CMP_EQ_U32_e64_1]], implicit-def dead $scc832 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]833 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.14, implicit $exec834 ; GCN-NEXT: S_BRANCH %bb.2835 ; GCN-NEXT: {{ $}}836 ; GCN-NEXT: bb.2:837 ; GCN-NEXT: successors: %bb.3(0x40000000), %bb.7(0x40000000)838 ; GCN-NEXT: {{ $}}839 ; GCN-NEXT: [[DEF2:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF840 ; GCN-NEXT: [[V_CMP_EQ_U32_e64_2:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF2]], implicit $exec841 ; GCN-NEXT: [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec842 ; GCN-NEXT: [[S_AND_B64_2:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], killed [[V_CMP_EQ_U32_e64_2]], implicit-def dead $scc843 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_2]]844 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.7, implicit $exec845 ; GCN-NEXT: S_BRANCH %bb.3846 ; GCN-NEXT: {{ $}}847 ; GCN-NEXT: bb.3:848 ; GCN-NEXT: successors: %bb.4(0x40000000), %bb.7(0x40000000)849 ; GCN-NEXT: {{ $}}850 ; GCN-NEXT: [[DEF3:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF851 ; GCN-NEXT: [[V_CMP_EQ_U32_e64_3:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF3]], implicit $exec852 ; GCN-NEXT: [[COPY3:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec853 ; GCN-NEXT: [[S_AND_B64_3:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY3]], killed [[V_CMP_EQ_U32_e64_3]], implicit-def dead $scc854 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_3]]855 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.7, implicit $exec856 ; GCN-NEXT: S_BRANCH %bb.4857 ; GCN-NEXT: {{ $}}858 ; GCN-NEXT: bb.4:859 ; GCN-NEXT: successors: %bb.7(0x80000000)860 ; GCN-NEXT: {{ $}}861 ; GCN-NEXT: S_BRANCH %bb.7862 ; GCN-NEXT: {{ $}}863 ; GCN-NEXT: bb.7:864 ; GCN-NEXT: successors: %bb.8(0x80000000)865 ; GCN-NEXT: {{ $}}866 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY2]], implicit-def $scc867 ; GCN-NEXT: S_BRANCH %bb.8868 ; GCN-NEXT: {{ $}}869 ; GCN-NEXT: bb.8:870 ; GCN-NEXT: successors: %bb.9(0x80000000)871 ; GCN-NEXT: {{ $}}872 ; GCN-NEXT: S_BRANCH %bb.9873 ; GCN-NEXT: {{ $}}874 ; GCN-NEXT: bb.9:875 ; GCN-NEXT: successors: %bb.11(0x40000000), %bb.12(0x40000000)876 ; GCN-NEXT: {{ $}}877 ; GCN-NEXT: [[DEF4:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF878 ; GCN-NEXT: [[V_CMP_EQ_U32_e64_4:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF4]], implicit $exec879 ; GCN-NEXT: [[COPY4:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec880 ; GCN-NEXT: [[S_AND_B64_4:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY4]], killed [[V_CMP_EQ_U32_e64_4]], implicit-def dead $scc881 ; GCN-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_4]], [[COPY4]], implicit-def dead $scc882 ; GCN-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_4]]883 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.12, implicit $exec884 ; GCN-NEXT: S_BRANCH %bb.11885 ; GCN-NEXT: {{ $}}886 ; GCN-NEXT: bb.10:887 ; GCN-NEXT: successors: %bb.14(0x80000000)888 ; GCN-NEXT: {{ $}}889 ; GCN-NEXT: S_BRANCH %bb.14890 ; GCN-NEXT: {{ $}}891 ; GCN-NEXT: bb.11:892 ; GCN-NEXT: successors: %bb.12(0x80000000)893 ; GCN-NEXT: {{ $}}894 ; GCN-NEXT: S_BRANCH %bb.12895 ; GCN-NEXT: {{ $}}896 ; GCN-NEXT: bb.12:897 ; GCN-NEXT: successors: %bb.10(0x40000000), %bb.14(0x40000000)898 ; GCN-NEXT: {{ $}}899 ; GCN-NEXT: [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[S_XOR_B64_]], implicit-def $exec, implicit-def $scc, implicit $exec900 ; GCN-NEXT: [[S_AND_B64_5:%[0-9]+]]:sreg_64 = S_AND_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc901 ; GCN-NEXT: $exec = S_XOR_B64_term $exec, [[S_AND_B64_5]], implicit-def $scc902 ; GCN-NEXT: S_CBRANCH_EXECZ %bb.14, implicit $exec903 ; GCN-NEXT: S_BRANCH %bb.10904 ; GCN-NEXT: {{ $}}905 ; GCN-NEXT: bb.14:906 ; GCN-NEXT: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc907 ; GCN-NEXT: S_ENDPGM 0908 bb.0:909 successors: %bb.1, %bb.14910 911 %0:vgpr_32 = IMPLICIT_DEF912 %1:sreg_64 = V_CMP_EQ_U32_e64 0, killed %0:vgpr_32, implicit $exec913 %2:sreg_64 = SI_IF %1:sreg_64, %bb.14, implicit-def $exec, implicit-def dead $scc, implicit $exec914 S_BRANCH %bb.1915 916 bb.1:917 successors: %bb.2, %bb.6918 919 %3:vgpr_32 = IMPLICIT_DEF920 %4:sreg_64 = V_CMP_EQ_U32_e64 0, killed %3:vgpr_32, implicit $exec921 %5:sreg_64 = SI_IF killed %4:sreg_64, %bb.6, implicit-def dead $exec, implicit-def dead $scc, implicit $exec922 S_BRANCH %bb.2923 924 bb.2:925 successors: %bb.3, %bb.7926 927 %6:vgpr_32 = IMPLICIT_DEF928 %7:sreg_64 = V_CMP_EQ_U32_e64 0, killed %6:vgpr_32, implicit $exec929 %8:sreg_64 = SI_IF killed %7:sreg_64, %bb.7, implicit-def dead $exec, implicit-def dead $scc, implicit $exec930 S_BRANCH %bb.3931 932 bb.3:933 successors: %bb.4, %bb.5934 935 %9:vgpr_32 = IMPLICIT_DEF936 %10:sreg_64 = V_CMP_EQ_U32_e64 0, killed %9:vgpr_32, implicit $exec937 %11:sreg_64 = SI_IF killed %10:sreg_64, %bb.5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec938 S_BRANCH %bb.4939 940 bb.4:941 successors: %bb.5942 943 S_BRANCH %bb.5944 945 bb.5:946 successors: %bb.7947 948 SI_END_CF %11:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec949 S_BRANCH %bb.7950 951 bb.6:952 successors: %bb.14953 954 SI_END_CF %5:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec955 S_BRANCH %bb.14956 957 bb.7:958 successors: %bb.8959 960 SI_END_CF %8:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec961 S_BRANCH %bb.8962 963 bb.8:964 successors: %bb.9965 966 S_BRANCH %bb.9967 968 bb.9:969 successors: %bb.11, %bb.12970 971 %12:vgpr_32 = IMPLICIT_DEF972 %13:sreg_64 = V_CMP_EQ_U32_e64 0, killed %12:vgpr_32, implicit $exec973 %14:sreg_64 = SI_IF killed %13:sreg_64, %bb.12, implicit-def dead $exec, implicit-def dead $scc, implicit $exec974 S_BRANCH %bb.11975 976 bb.10:977 successors: %bb.13978 979 S_BRANCH %bb.13980 981 bb.11:982 successors: %bb.12983 984 S_BRANCH %bb.12985 986 bb.12:987 successors: %bb.10, %bb.13988 989 %15:sreg_64 = SI_ELSE %14:sreg_64, %bb.13, implicit-def dead $exec, implicit-def dead $scc, implicit $exec990 S_BRANCH %bb.10991 992 bb.13:993 successors: %bb.6994 995 SI_END_CF %15:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec996 S_BRANCH %bb.6997 998 bb.14:999 1000 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec1001 S_ENDPGM 01002 1003...1004