brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.5 KiB · eaf398f Raw
273 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs -run-pass=si-lower-control-flow -o - %s | FileCheck %s3# RUN: llc -mtriple=amdgcn -mcpu=fiji -passes=si-lower-control-flow -o - %s | FileCheck %s4 5# Test si-lower-control-flow insertion points when other terminator6# instructions are present besides the control flow pseudo and a7# branch.8 9 10# There's another terminator instruction between SI_IF and11# S_BRANCH. The S_CBRANCH_EXECZ should be inserted immediately before12# S_BRANCH.13---14name: other_terminator_sbranch_after_si_if15tracksRegLiveness: true16body:             |17  ; CHECK-LABEL: name: other_terminator_sbranch_after_si_if18  ; CHECK: bb.0:19  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)20  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr4_sgpr521  ; CHECK-NEXT: {{  $}}22  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr023  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr524  ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, [[COPY]], implicit $exec25  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec26  ; CHECK-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc27  ; CHECK-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY2]], implicit-def dead $scc28  ; CHECK-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]29  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[COPY1]], implicit $exec30  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec31  ; CHECK-NEXT:   S_BRANCH %bb.232  ; CHECK-NEXT: {{  $}}33  ; CHECK-NEXT: bb.1:34  ; CHECK-NEXT:   successors: %bb.2(0x80000000)35  ; CHECK-NEXT: {{  $}}36  ; CHECK-NEXT:   S_BRANCH %bb.237  ; CHECK-NEXT: {{  $}}38  ; CHECK-NEXT: bb.2:39  ; CHECK-NEXT:   S_ENDPGM 0, implicit [[S_MOV_B64_term]]40  bb.0:41    successors: %bb.2, %bb.142    liveins: $vgpr0, $vgpr1, $sgpr4_sgpr543 44    %0:vgpr_32 = COPY killed $vgpr045    %1:sreg_64_xexec = COPY $sgpr4_sgpr546    %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, %0, implicit $exec47    %3:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec48    %4:sreg_64_xexec = S_MOV_B64_term killed %1, implicit $exec49    S_BRANCH %bb.250 51  bb.1:52    S_BRANCH %bb.253 54  bb.2:55    S_ENDPGM 0, implicit %456 57...58 59# S_CBRANCH_EXECZ should be inserted after the other terminator60---61name: other_terminator_fallthrough_after_si_if62tracksRegLiveness: true63body:             |64  ; CHECK-LABEL: name: other_terminator_fallthrough_after_si_if65  ; CHECK: bb.0:66  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)67  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr4_sgpr568  ; CHECK-NEXT: {{  $}}69  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr070  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr571  ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, [[COPY]], implicit $exec72  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec73  ; CHECK-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc74  ; CHECK-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY2]], implicit-def dead $scc75  ; CHECK-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]76  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[COPY1]], implicit $exec77  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec78  ; CHECK-NEXT: {{  $}}79  ; CHECK-NEXT: bb.1:80  ; CHECK-NEXT:   successors: %bb.2(0x80000000)81  ; CHECK-NEXT: {{  $}}82  ; CHECK-NEXT:   S_BRANCH %bb.283  ; CHECK-NEXT: {{  $}}84  ; CHECK-NEXT: bb.2:85  ; CHECK-NEXT:   S_ENDPGM 0, implicit [[S_MOV_B64_term]]86  bb.0:87    successors: %bb.2, %bb.188    liveins: $vgpr0, $vgpr1, $sgpr4_sgpr589 90    %0:vgpr_32 = COPY killed $vgpr091    %1:sreg_64_xexec = COPY $sgpr4_sgpr592    %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, %0, implicit $exec93    %3:sreg_64_xexec = SI_IF %2, %bb.2, implicit-def $exec, implicit-def dead $scc, implicit $exec94    %4:sreg_64_xexec = S_MOV_B64_term killed %1, implicit $exec95 96  bb.1:97    S_BRANCH %bb.298 99  bb.2:100    S_ENDPGM 0, implicit %4101 102...103 104---105name: other_terminator_sbranch_after_si_else106tracksRegLiveness: true107body:             |108  ; CHECK-LABEL: name: other_terminator_sbranch_after_si_else109  ; CHECK: bb.0:110  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)111  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr4_sgpr5112  ; CHECK-NEXT: {{  $}}113  ; CHECK-NEXT:   [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 %2, implicit-def $exec, implicit-def $scc, implicit $exec114  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0115  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr5116  ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, [[COPY]], implicit $exec117  ; CHECK-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64_xexec = S_AND_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc118  ; CHECK-NEXT:   $exec = S_XOR_B64_term $exec, [[S_AND_B64_]], implicit-def $scc119  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[COPY1]], implicit $exec120  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec121  ; CHECK-NEXT:   S_BRANCH %bb.2122  ; CHECK-NEXT: {{  $}}123  ; CHECK-NEXT: bb.1:124  ; CHECK-NEXT:   successors: %bb.2(0x80000000)125  ; CHECK-NEXT: {{  $}}126  ; CHECK-NEXT:   S_BRANCH %bb.2127  ; CHECK-NEXT: {{  $}}128  ; CHECK-NEXT: bb.2:129  ; CHECK-NEXT:   S_ENDPGM 0, implicit [[S_MOV_B64_term]]130  bb.0:131    successors: %bb.2, %bb.1132    liveins: $vgpr0, $vgpr1, $sgpr4_sgpr5133 134    %0:vgpr_32 = COPY killed $vgpr0135    %1:sreg_64_xexec = COPY $sgpr4_sgpr5136    %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, %0, implicit $exec137    %3:sreg_64_xexec = SI_ELSE %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec138    %4:sreg_64_xexec = S_MOV_B64_term killed %1, implicit $exec139    S_BRANCH %bb.2140 141  bb.1:142    S_BRANCH %bb.2143 144  bb.2:145    S_ENDPGM 0, implicit %4146 147...148 149---150name: other_terminator_sbranch_after_si_loop151tracksRegLiveness: true152body:             |153  ; CHECK-LABEL: name: other_terminator_sbranch_after_si_loop154  ; CHECK: bb.0:155  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)156  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr4_sgpr5157  ; CHECK-NEXT: {{  $}}158  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0159  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr5160  ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, [[COPY]], implicit $exec161  ; CHECK-NEXT:   $exec = S_ANDN2_B64_term $exec, [[V_CMP_EQ_U32_e64_]], implicit-def $scc162  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[COPY1]], implicit $exec163  ; CHECK-NEXT:   S_CBRANCH_EXECNZ %bb.1, implicit $exec164  ; CHECK-NEXT:   S_BRANCH %bb.2165  ; CHECK-NEXT: {{  $}}166  ; CHECK-NEXT: bb.1:167  ; CHECK-NEXT:   successors: %bb.2(0x80000000)168  ; CHECK-NEXT: {{  $}}169  ; CHECK-NEXT:   S_BRANCH %bb.2170  ; CHECK-NEXT: {{  $}}171  ; CHECK-NEXT: bb.2:172  ; CHECK-NEXT:   S_ENDPGM 0, implicit [[S_MOV_B64_term]]173  bb.0:174    successors: %bb.2, %bb.1175    liveins: $vgpr0, $vgpr1, $sgpr4_sgpr5176 177    %0:vgpr_32 = COPY killed $vgpr0178    %1:sreg_64_xexec = COPY $sgpr4_sgpr5179    %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, %0, implicit $exec180    SI_LOOP %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec181    %4:sreg_64_xexec = S_MOV_B64_term killed %1, implicit $exec182    S_BRANCH %bb.2183 184  bb.1:185    S_BRANCH %bb.2186 187  bb.2:188    S_ENDPGM 0, implicit %4189 190...191 192# The save exec result register of SI_IF is used by other terminators193# inserted to behave as a lowered phi. The output register of SI_IF194# was ignored, and the def was removed, so the S_MOV_B64_term uses195# would fail the verifier.196 197---198name:            si_if_use199alignment:       1200legalized:       true201regBankSelected: true202selected:        true203tracksRegLiveness: true204body:             |205  ; CHECK-LABEL: name: si_if_use206  ; CHECK: bb.0:207  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)208  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr30_sgpr31209  ; CHECK-NEXT: {{  $}}210  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0211  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vgpr_32 = COPY killed $vgpr1212  ; CHECK-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 killed [[COPY]], killed [[COPY1]], implicit $exec213  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec214  ; CHECK-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc215  ; CHECK-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY2]], implicit-def dead $scc216  ; CHECK-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]217  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term [[S_XOR_B64_]], implicit $exec218  ; CHECK-NEXT:   [[S_MOV_B64_term1:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term [[S_XOR_B64_]], implicit $exec219  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec220  ; CHECK-NEXT:   S_BRANCH %bb.2221  ; CHECK-NEXT: {{  $}}222  ; CHECK-NEXT: bb.1:223  ; CHECK-NEXT:   successors: %bb.2(0x80000000)224  ; CHECK-NEXT: {{  $}}225  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sreg_64_xexec = COPY [[S_MOV_B64_term1]]226  ; CHECK-NEXT:   dead [[GLOBAL_LOAD_DWORD:%[0-9]+]]:vgpr_32 = GLOBAL_LOAD_DWORD undef %8:vreg_64, 0, 0, implicit $exec :: (volatile load (s32), addrspace 1)227  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = COPY [[COPY3]]228  ; CHECK-NEXT: {{  $}}229  ; CHECK-NEXT: bb.2:230  ; CHECK-NEXT:   successors: %bb.3(0x80000000)231  ; CHECK-NEXT: {{  $}}232  ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:sreg_64_xexec = COPY [[S_MOV_B64_term]]233  ; CHECK-NEXT:   $exec = S_OR_B64_term $exec, killed [[COPY4]], implicit-def $scc234  ; CHECK-NEXT: {{  $}}235  ; CHECK-NEXT: bb.3:236  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)237  ; CHECK-NEXT: {{  $}}238  ; CHECK-NEXT:   S_SLEEP 1239  ; CHECK-NEXT:   [[COPY5:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec240  ; CHECK-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY5]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc241  ; CHECK-NEXT:   [[S_XOR_B64_1:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_1]], [[COPY5]], implicit-def dead $scc242  ; CHECK-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]243  ; CHECK-NEXT:   [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term [[S_XOR_B64_1]], implicit $exec244  ; CHECK-NEXT:   [[S_MOV_B64_term1:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term [[S_XOR_B64_1]], implicit $exec245  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec246  ; CHECK-NEXT:   S_BRANCH %bb.2247  bb.0:248    liveins: $vgpr0, $vgpr1, $sgpr30_sgpr31249 250    %0:vgpr_32 = COPY killed $vgpr0251    %1:vgpr_32 = COPY killed $vgpr1252    %3:sreg_64_xexec = V_CMP_EQ_U32_e64 killed %0, killed %1, implicit $exec253    %10:sreg_64_xexec = SI_IF %3, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec254    %14:sreg_64_xexec = S_MOV_B64_term %10, implicit $exec255    %13:sreg_64_xexec = S_MOV_B64_term %10, implicit $exec256    S_BRANCH %bb.2257 258  bb.1:259    %11:sreg_64_xexec = COPY %13260    dead %6:vgpr_32 = GLOBAL_LOAD_DWORD undef %8:vreg_64, 0, 0, implicit $exec :: (volatile load (s32), addrspace 1)261    %14:sreg_64_xexec = COPY %11262 263  bb.2:264    %12:sreg_64_xexec = COPY %14265    SI_END_CF killed %12, implicit-def $exec, implicit-def dead $scc, implicit $exec266    S_SLEEP 1267    %9:sreg_64_xexec = SI_IF %3, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec268    %14:sreg_64_xexec = S_MOV_B64_term %9, implicit $exec269    %13:sreg_64_xexec = S_MOV_B64_term %9, implicit $exec270    S_BRANCH %bb.2271 272...273