1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -march=amdgcn -verify-machineinstrs -run-pass=si-lower-control-flow -amdgpu-remove-redundant-endcf %s -o - | FileCheck -check-prefix=GCN %s 3 4# Make sure dbg_value doesn't change codeegn when collapsing end_cf 5--- 6name: simple_nested_if_dbg_value 7tracksRegLiveness: true 8machineFunctionInfo: 9 isEntryFunction: true 10body: | 11 ; GCN-LABEL: name: simple_nested_if_dbg_value 12 ; GCN: bb.0: 13 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 14 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 15 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 16 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 17 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 18 ; GCN: bb.1: 19 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 20 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 21 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 22 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 23 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 24 ; GCN: bb.2: 25 ; GCN: successors: %bb.3(0x80000000) 26 ; GCN: bb.3: 27 ; GCN: successors: %bb.4(0x80000000) 28 ; GCN: DBG_VALUE 29 ; GCN: bb.4: 30 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 31 ; GCN: DBG_VALUE 32 ; GCN: S_ENDPGM 0 33 bb.0: 34 successors: %bb.1, %bb.4 35 36 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 37 38 bb.1: 39 successors: %bb.2, %bb.3 40 41 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 42 43 bb.2: 44 45 bb.3: 46 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 47 DBG_VALUE 48 49 bb.4: 50 DBG_VALUE 51 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 52 S_ENDPGM 0 53 54... 55 56# Empty block separates the collapsable s_or_b64 57--- 58name: simple_nested_if_empty_block_between 59tracksRegLiveness: true 60machineFunctionInfo: 61 isEntryFunction: true 62body: | 63 ; GCN-LABEL: name: simple_nested_if_empty_block_between 64 ; GCN: bb.0: 65 ; GCN: successors: %bb.5(0x40000000), %bb.1(0x40000000) 66 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 67 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 68 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 69 ; GCN: S_CBRANCH_EXECZ %bb.5, implicit $exec 70 ; GCN: bb.1: 71 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 72 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 73 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 74 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 75 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 76 ; GCN: bb.2: 77 ; GCN: successors: %bb.3(0x80000000) 78 ; GCN: bb.3: 79 ; GCN: successors: %bb.4(0x80000000) 80 ; GCN: bb.4: 81 ; GCN: successors: %bb.5(0x80000000) 82 ; GCN: bb.5: 83 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 84 ; GCN: S_ENDPGM 0 85 bb.0: 86 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 87 88 bb.1: 89 successors: %bb.2, %bb.3 90 91 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 92 93 bb.2: 94 95 bb.3: 96 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 97 98 bb.5: 99 100 bb.4: 101 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 102 S_ENDPGM 0 103 104... 105 106# Effectively empty block separates the collapsable s_or_b64 107--- 108name: simple_nested_if_empty_block_dbg_between 109tracksRegLiveness: true 110machineFunctionInfo: 111 isEntryFunction: true 112body: | 113 ; GCN-LABEL: name: simple_nested_if_empty_block_dbg_between 114 ; GCN: bb.0: 115 ; GCN: successors: %bb.1(0x40000000), %bb.5(0x40000000) 116 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 117 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 118 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 119 ; GCN: S_CBRANCH_EXECZ %bb.5, implicit $exec 120 ; GCN: bb.1: 121 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 122 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 123 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 124 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 125 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 126 ; GCN: bb.2: 127 ; GCN: successors: %bb.3(0x80000000) 128 ; GCN: bb.3: 129 ; GCN: successors: %bb.4(0x80000000) 130 ; GCN: bb.4: 131 ; GCN: successors: %bb.5(0x80000000) 132 ; GCN: DBG_VALUE 133 ; GCN: bb.5: 134 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 135 ; GCN: S_ENDPGM 0 136 bb.0: 137 successors: %bb.1, %bb.4 138 139 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 140 141 bb.1: 142 successors: %bb.2, %bb.3 143 144 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 145 146 bb.2: 147 148 bb.3: 149 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 150 151 bb.5: 152 DBG_VALUE 153 154 bb.4: 155 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 156 S_ENDPGM 0 157 158... 159 160--- 161name: skip_salu_and_meta_insts_find_first 162tracksRegLiveness: true 163machineFunctionInfo: 164 isEntryFunction: true 165body: | 166 ; GCN-LABEL: name: skip_salu_and_meta_insts_find_first 167 ; GCN: bb.0: 168 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 169 ; GCN: liveins: $vgpr0, $sgpr0_sgpr1 170 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 171 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 172 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 173 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 174 ; GCN: bb.1: 175 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 176 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 177 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 178 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 179 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 180 ; GCN: bb.2: 181 ; GCN: successors: %bb.3(0x80000000) 182 ; GCN: bb.3: 183 ; GCN: successors: %bb.4(0x80000000) 184 ; GCN: [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF 185 ; GCN: [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]] 186 ; GCN: KILL [[DEF]] 187 ; GCN: bb.4: 188 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 189 ; GCN: S_ENDPGM 0 190 bb.0: 191 successors: %bb.1, %bb.4 192 liveins: $vgpr0, $sgpr0_sgpr1 193 194 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 195 196 bb.1: 197 successors: %bb.2, %bb.3 198 199 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 200 201 bb.2: 202 203 bb.3: 204 %4:sgpr_32 = IMPLICIT_DEF 205 %5:sgpr_32 = S_BREV_B32 %4 206 KILL %4 207 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 208 209 bb.4: 210 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 211 S_ENDPGM 0 212 213... 214 215# Make sure SALU instructions, meta instructions, and SGPR->SGPR 216# copies are skipped. 217--- 218name: skip_salu_and_meta_insts_after 219tracksRegLiveness: true 220machineFunctionInfo: 221 isEntryFunction: true 222body: | 223 ; GCN-LABEL: name: skip_salu_and_meta_insts_after 224 ; GCN: bb.0: 225 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 226 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 227 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 228 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 229 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 230 ; GCN: bb.1: 231 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 232 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 233 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 234 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 235 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 236 ; GCN: bb.2: 237 ; GCN: successors: %bb.3(0x80000000) 238 ; GCN: bb.3: 239 ; GCN: successors: %bb.4(0x80000000) 240 ; GCN: [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF 241 ; GCN: [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]] 242 ; GCN: KILL [[DEF]] 243 ; GCN: [[COPY2:%[0-9]+]]:sgpr_32 = COPY [[S_BREV_B32_]] 244 ; GCN: bb.4: 245 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 246 ; GCN: S_ENDPGM 0 247 bb.0: 248 successors: %bb.1, %bb.4 249 250 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 251 252 bb.1: 253 successors: %bb.2, %bb.3 254 255 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 256 257 bb.2: 258 259 bb.3: 260 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 261 %4:sgpr_32 = IMPLICIT_DEF 262 %5:sgpr_32 = S_BREV_B32 %4 263 KILL %4 264 %6:sgpr_32 = COPY %5 265 266 bb.4: 267 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 268 S_ENDPGM 0 269 270... 271 272# SALU instruction depends on exec through a normal operand. 273--- 274name: salu_exec_dependency 275tracksRegLiveness: true 276machineFunctionInfo: 277 isEntryFunction: true 278body: | 279 ; GCN-LABEL: name: salu_exec_dependency 280 ; GCN: bb.0: 281 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 282 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 283 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 284 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 285 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 286 ; GCN: bb.1: 287 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 288 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 289 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 290 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 291 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 292 ; GCN: bb.2: 293 ; GCN: successors: %bb.3(0x80000000) 294 ; GCN: bb.3: 295 ; GCN: successors: %bb.4(0x80000000) 296 ; GCN: $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc 297 ; GCN: [[S_BREV_B64_:%[0-9]+]]:sreg_64 = S_BREV_B64 $exec 298 ; GCN: bb.4: 299 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 300 ; GCN: S_ENDPGM 0 301 bb.0: 302 successors: %bb.1, %bb.4 303 304 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 305 306 bb.1: 307 successors: %bb.2, %bb.3 308 309 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 310 311 bb.2: 312 313 bb.3: 314 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 315 %4:sreg_64 = S_BREV_B64 $exec 316 317 bb.4: 318 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 319 S_ENDPGM 0 320 321... 322 323# Copy to / from VGPR should be assumed to read exec 324--- 325name: copy_no_explicit_exec_dependency 326tracksRegLiveness: true 327machineFunctionInfo: 328 isEntryFunction: true 329body: | 330 ; GCN-LABEL: name: copy_no_explicit_exec_dependency 331 ; GCN: bb.0: 332 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 333 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 334 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 335 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 336 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 337 ; GCN: bb.1: 338 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 339 ; GCN: [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF 340 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 341 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc 342 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 343 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 344 ; GCN: bb.2: 345 ; GCN: successors: %bb.3(0x80000000) 346 ; GCN: bb.3: 347 ; GCN: successors: %bb.4(0x80000000) 348 ; GCN: $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc 349 ; GCN: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[DEF]].sub2 350 ; GCN: bb.4: 351 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 352 ; GCN: S_ENDPGM 0 353 bb.0: 354 successors: %bb.1, %bb.4 355 356 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 357 358 bb.1: 359 successors: %bb.2, %bb.3 360 361 %2:vreg_128 = IMPLICIT_DEF 362 %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 363 364 bb.2: 365 366 bb.3: 367 SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 368 %5:vgpr_32 = COPY %2.sub2 369 370 bb.4: 371 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 372 S_ENDPGM 0 373 374... 375 376--- 377name: simple_nested_if_not_layout_successor 378tracksRegLiveness: true 379machineFunctionInfo: 380 isEntryFunction: true 381body: | 382 ; GCN-LABEL: name: simple_nested_if_not_layout_successor 383 ; GCN: bb.0: 384 ; GCN: successors: %bb.1(0x40000000), %bb.4(0x40000000) 385 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 386 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 387 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 388 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 389 ; GCN: bb.1: 390 ; GCN: successors: %bb.2(0x40000000), %bb.3(0x40000000) 391 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 392 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 393 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 394 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 395 ; GCN: bb.2: 396 ; GCN: successors: %bb.3(0x80000000) 397 ; GCN: bb.3: 398 ; GCN: successors: %bb.5(0x80000000) 399 ; GCN: S_BRANCH %bb.5 400 ; GCN: bb.4: 401 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 402 ; GCN: S_ENDPGM 0 403 ; GCN: bb.5: 404 ; GCN: successors: %bb.4(0x80000000) 405 ; GCN: S_BRANCH %bb.4 406 bb.0: 407 successors: %bb.1, %bb.4 408 409 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 410 411 bb.1: 412 successors: %bb.2, %bb.3 413 414 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 415 416 bb.2: 417 418 bb.3: 419 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 420 S_BRANCH %bb.5 421 422 bb.4: 423 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 424 S_ENDPGM 0 425 426 bb.5: 427 S_BRANCH %bb.4 428 429... 430 431# This should never happen, but check that we do not hang anyway 432 433--- 434name: resursive_endcf 435tracksRegLiveness: true 436liveins: 437 - { reg: '$vgpr0', virtual-reg: '%0' } 438machineFunctionInfo: 439 isEntryFunction: true 440body: | 441 ; GCN-LABEL: name: resursive_endcf 442 ; GCN: bb.0: 443 ; GCN: successors: %bb.1(0x80000000) 444 ; GCN: liveins: $vgpr0 445 ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 446 ; GCN: [[V_CMP_LT_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_U32_e64 1, [[COPY]], implicit $exec 447 ; GCN: bb.1: 448 ; GCN: successors: %bb.1(0x80000000) 449 ; GCN: $exec = S_OR_B64 $exec, [[V_CMP_LT_U32_e64_]], implicit-def $scc 450 ; GCN: S_BRANCH %bb.1 451 bb.0: 452 successors: %bb.1 453 liveins: $vgpr0 454 455 %0:vgpr_32 = COPY $vgpr0 456 %2:sreg_64 = V_CMP_LT_U32_e64 1, %0, implicit $exec 457 458 bb.1: 459 successors: %bb.1 460 461 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 462 S_BRANCH %bb.1 463 464... 465 466# Both s_or_b64 shall be preserved since the outer SI_END_CF belongs to SI_ELSE. 467 468--- 469name: simple_outer_if_else 470tracksRegLiveness: true 471machineFunctionInfo: 472 isEntryFunction: true 473body: | 474 ; GCN-LABEL: name: simple_outer_if_else 475 ; GCN: bb.0: 476 ; GCN: successors: %bb.1(0x40000000), %bb.2(0x40000000) 477 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 478 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 479 ; GCN: [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_]], [[COPY]], implicit-def dead $scc 480 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 481 ; GCN: S_CBRANCH_EXECZ %bb.2, implicit $exec 482 ; GCN: bb.1: 483 ; GCN: successors: %bb.2(0x80000000) 484 ; GCN: S_BRANCH %bb.2 485 ; GCN: bb.2: 486 ; GCN: successors: %bb.3(0x40000000), %bb.6(0x40000000) 487 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY [[S_XOR_B64_]] 488 ; GCN: [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[COPY1]], implicit-def $exec, implicit-def $scc, implicit $exec 489 ; GCN: $exec = S_XOR_B64_term $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc 490 ; GCN: S_CBRANCH_EXECZ %bb.6, implicit $exec 491 ; GCN: bb.3: 492 ; GCN: successors: %bb.3(0x40000000), %bb.4(0x40000000) 493 ; GCN: [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 494 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], undef %4:sreg_64, implicit-def dead $scc 495 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 496 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 497 ; GCN: bb.4: 498 ; GCN: successors: %bb.5(0x80000000) 499 ; GCN: bb.5: 500 ; GCN: successors: %bb.6(0x80000000) 501 ; GCN: $exec = S_OR_B64 $exec, [[COPY2]], implicit-def $scc 502 ; GCN: bb.6: 503 ; GCN: $exec = S_OR_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc 504 ; GCN: S_ENDPGM 0 505 bb.0: 506 successors: %bb.1, %bb.2 507 508 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 509 510 bb.1: 511 successors: %bb.2 512 S_BRANCH %bb.2 513 514 bb.2: 515 successors: %bb.3, %bb.6 516 %2:sreg_64 = SI_ELSE %0:sreg_64, %bb.6, 0, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 517 518 bb.3: 519 successors: %bb.3, %bb.4 520 521 %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 522 523 bb.4: 524 successors: %bb.5 525 526 bb.5: 527 successors: %bb.6 528 529 SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 530 531 bb.6: 532 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 533 S_ENDPGM 0 534 535... 536 537--- 538name: if_inside_loop 539tracksRegLiveness: true 540machineFunctionInfo: 541 isEntryFunction: true 542body: | 543 ; GCN-LABEL: name: if_inside_loop 544 ; GCN: bb.0: 545 ; GCN: successors: %bb.6(0x80000000) 546 ; GCN: S_BRANCH %bb.6 547 ; GCN: bb.1: 548 ; GCN: successors: %bb.3(0x40000000), %bb.2(0x40000000) 549 ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 550 ; GCN: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc 551 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_]] 552 ; GCN: S_CBRANCH_EXECZ %bb.3, implicit $exec 553 ; GCN: bb.2: 554 ; GCN: successors: %bb.6(0x80000000) 555 ; GCN: S_BRANCH %bb.6 556 ; GCN: bb.3: 557 ; GCN: successors: %bb.4(0x80000000) 558 ; GCN: $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc 559 ; GCN: bb.4: 560 ; GCN: successors: %bb.5(0x80000000) 561 ; GCN: $exec = S_OR_B64 $exec, %2, implicit-def $scc 562 ; GCN: bb.5: 563 ; GCN: successors: %bb.6(0x80000000) 564 ; GCN: bb.6: 565 ; GCN: successors: %bb.4(0x40000000), %bb.0(0x40000000) 566 ; GCN: [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec 567 ; GCN: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc 568 ; GCN: [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_1]], [[COPY1]], implicit-def dead $scc 569 ; GCN: $exec = S_MOV_B64_term killed [[S_AND_B64_1]] 570 ; GCN: S_CBRANCH_EXECZ %bb.4, implicit $exec 571 ; GCN: S_BRANCH %bb.0 572 ; GCN: S_ENDPGM 0 573 bb.0: 574 S_BRANCH %bb.6 575 576 bb.1: 577 %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 578 579 bb.2: 580 S_BRANCH %bb.6 581 582 bb.3: 583 SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 584 585 bb.4: 586 SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 587 588 bb.5: 589 590 bb.6: 591 %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 592 S_BRANCH %bb.0 593 S_ENDPGM 0 594 595... 596