263 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=amdgcn-amd-amdhsa -start-before=livevars -stop-after=twoaddressinstruction -verify-machineinstrs -o - %s | FileCheck %s3 4# FIXME: update_mir_test_checks tries to incorrectly re-use a variable5# name used for a copy, so some of the check variable names were6# manually fixed.7 8# Check for LiveVariables verifier error after lowering SI_END_CF9 10---11name: live_variables_update_block_split12tracksRegLiveness: true13body: |14 ; CHECK-LABEL: name: live_variables_update_block_split15 ; CHECK: bb.0:16 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)17 ; CHECK-NEXT: liveins: $vgpr018 ; CHECK-NEXT: {{ $}}19 ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr020 ; CHECK-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec21 ; CHECK-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed [[COPY]], implicit $exec22 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[V_MOV_B32_e32_]]23 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_MOV_B32_e32_]]24 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec25 ; CHECK-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY3]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc26 ; CHECK-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY3]], implicit-def dead $scc27 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]28 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_]], implicit $exec29 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec30 ; CHECK-NEXT: S_BRANCH %bb.231 ; CHECK-NEXT: {{ $}}32 ; CHECK-NEXT: bb.1:33 ; CHECK-NEXT: successors: %bb.3(0x80000000)34 ; CHECK-NEXT: {{ $}}35 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:sreg_64_xexec = COPY killed [[S_MOV_B64_term]]36 ; CHECK-NEXT: $exec = S_OR_B64_term $exec, killed [[COPY4]], implicit-def $scc37 ; CHECK-NEXT: {{ $}}38 ; CHECK-NEXT: bb.3:39 ; CHECK-NEXT: successors: %bb.2(0x80000000)40 ; CHECK-NEXT: {{ $}}41 ; CHECK-NEXT: [[COPY5:%[0-9]+]]:vgpr_32 = COPY killed [[COPY1]]42 ; CHECK-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = nsw V_ADD_U32_e32 1, killed [[COPY5]], implicit $exec43 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_ADD_U32_e32_]]44 ; CHECK-NEXT: {{ $}}45 ; CHECK-NEXT: bb.2:46 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)47 ; CHECK-NEXT: {{ $}}48 ; CHECK-NEXT: [[COPY6:%[0-9]+]]:vgpr_32 = COPY killed [[COPY2]]49 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef %10:vreg_64, [[COPY6]], 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)50 ; CHECK-NEXT: [[COPY7:%[0-9]+]]:vgpr_32 = COPY killed [[COPY6]]51 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[COPY7]]52 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[COPY7]]53 ; CHECK-NEXT: [[COPY8:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec54 ; CHECK-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY8]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc55 ; CHECK-NEXT: [[S_XOR_B64_1:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_1]], [[COPY8]], implicit-def dead $scc56 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]57 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_1]], implicit $exec58 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec59 ; CHECK-NEXT: S_BRANCH %bb.260 bb.0:61 successors: %bb.2(0x40000000), %bb.1(0x40000000)62 liveins: $vgpr063 64 %0:vgpr_32 = COPY killed $vgpr065 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec66 %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed %0, implicit $exec67 %3:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec68 S_BRANCH %bb.269 70 bb.1:71 successors: %bb.2(0x80000000)72 73 %4:sreg_64_xexec = PHI %5, %bb.2, %3, %bb.074 %6:vgpr_32 = PHI %7, %bb.2, %1, %bb.075 SI_END_CF killed %4, implicit-def $exec, implicit-def dead $scc, implicit $exec76 %8:vgpr_32 = nsw V_ADD_U32_e32 1, killed %6, implicit $exec77 78 bb.2:79 successors: %bb.2(0x40000000), %bb.1(0x40000000)80 81 %9:vgpr_32 = PHI %8, %bb.1, %7, %bb.2, %1, %bb.082 GLOBAL_STORE_DWORD undef %10:vreg_64, %9, 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)83 %7:vgpr_32 = COPY killed %984 %5:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec85 S_BRANCH %bb.286 87...88 89# Here %4 which is not a phi join reg has its last use in bb.2. When90# bb.2 is split into MBB/SplitBB, %4 will be live through MBB.91---92name: live_variables_update_block_split_non_phi_live_across93tracksRegLiveness: true94body: |95 ; CHECK-LABEL: name: live_variables_update_block_split_non_phi_live_across96 ; CHECK: bb.0:97 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.1(0x40000000)98 ; CHECK-NEXT: liveins: $vgpr099 ; CHECK-NEXT: {{ $}}100 ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0101 ; CHECK-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec102 ; CHECK-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed [[COPY]], implicit $exec103 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[V_MOV_B32_e32_]]104 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_MOV_B32_e32_]]105 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec106 ; CHECK-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY3]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc107 ; CHECK-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY3]], implicit-def dead $scc108 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]109 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_]], implicit $exec110 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec111 ; CHECK-NEXT: S_BRANCH %bb.3112 ; CHECK-NEXT: {{ $}}113 ; CHECK-NEXT: bb.1:114 ; CHECK-NEXT: successors: %bb.2(0x80000000)115 ; CHECK-NEXT: {{ $}}116 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr_32 = COPY killed [[COPY1]]117 ; CHECK-NEXT: [[COPY5:%[0-9]+]]:sreg_64_xexec = COPY killed [[S_MOV_B64_term]]118 ; CHECK-NEXT: S_BRANCH %bb.2119 ; CHECK-NEXT: {{ $}}120 ; CHECK-NEXT: bb.2:121 ; CHECK-NEXT: successors: %bb.4(0x80000000)122 ; CHECK-NEXT: {{ $}}123 ; CHECK-NEXT: [[COPY6:%[0-9]+]]:sreg_64_xexec = COPY killed [[COPY5]]124 ; CHECK-NEXT: $exec = S_OR_B64_term $exec, killed [[COPY6]], implicit-def $scc125 ; CHECK-NEXT: {{ $}}126 ; CHECK-NEXT: bb.4:127 ; CHECK-NEXT: successors: %bb.3(0x80000000)128 ; CHECK-NEXT: {{ $}}129 ; CHECK-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = nsw V_ADD_U32_e32 1, killed [[COPY4]], implicit $exec130 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_ADD_U32_e32_]]131 ; CHECK-NEXT: {{ $}}132 ; CHECK-NEXT: bb.3:133 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.1(0x40000000)134 ; CHECK-NEXT: {{ $}}135 ; CHECK-NEXT: [[COPY7:%[0-9]+]]:vgpr_32 = COPY killed [[COPY2]]136 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef %11:vreg_64, [[COPY7]], 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)137 ; CHECK-NEXT: [[COPY8:%[0-9]+]]:vgpr_32 = COPY killed [[COPY7]]138 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[COPY8]]139 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[COPY8]]140 ; CHECK-NEXT: [[COPY9:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec141 ; CHECK-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY9]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc142 ; CHECK-NEXT: [[S_XOR_B64_1:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_1]], [[COPY9]], implicit-def dead $scc143 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]144 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_1]], implicit $exec145 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec146 ; CHECK-NEXT: S_BRANCH %bb.3147 bb.0:148 successors: %bb.3(0x40000000), %bb.1(0x40000000)149 liveins: $vgpr0150 151 %0:vgpr_32 = COPY killed $vgpr0152 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec153 %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed %0, implicit $exec154 %3:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec155 S_BRANCH %bb.3156 157 bb.1:158 successors: %bb.2(0x80000000)159 160 %4:sreg_64_xexec = PHI %5, %bb.3, %3, %bb.0161 %6:vgpr_32 = PHI %7, %bb.3, %1, %bb.0162 S_BRANCH %bb.2163 164 bb.2:165 successors: %bb.3(0x80000000)166 167 %8:sreg_64_xexec = COPY %4168 SI_END_CF killed %8, implicit-def $exec, implicit-def dead $scc, implicit $exec169 %9:vgpr_32 = nsw V_ADD_U32_e32 1, killed %6, implicit $exec170 171 bb.3:172 successors: %bb.3(0x40000000), %bb.1(0x40000000)173 174 %10:vgpr_32 = PHI %9, %bb.2, %7, %bb.3, %1, %bb.0175 GLOBAL_STORE_DWORD undef %11:vreg_64, %10, 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)176 %7:vgpr_32 = COPY killed %10177 %5:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec178 S_BRANCH %bb.3179 180...181 182# Check we don't get "Block should not be in AliveBlocks" for183# registers defined before si_end_cf184---185name: live_variables_update_block_split_split_killed_def_before_si_end_cf186tracksRegLiveness: true187body: |188 ; CHECK-LABEL: name: live_variables_update_block_split_split_killed_def_before_si_end_cf189 ; CHECK: bb.0:190 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)191 ; CHECK-NEXT: liveins: $vgpr0192 ; CHECK-NEXT: {{ $}}193 ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0194 ; CHECK-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec195 ; CHECK-NEXT: [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed [[COPY]], implicit $exec196 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[V_MOV_B32_e32_]]197 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_MOV_B32_e32_]]198 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec199 ; CHECK-NEXT: [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY3]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc200 ; CHECK-NEXT: [[S_XOR_B64_:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_]], [[COPY3]], implicit-def dead $scc201 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_]]202 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_]], implicit $exec203 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec204 ; CHECK-NEXT: S_BRANCH %bb.2205 ; CHECK-NEXT: {{ $}}206 ; CHECK-NEXT: bb.1:207 ; CHECK-NEXT: successors: %bb.3(0x80000000)208 ; CHECK-NEXT: {{ $}}209 ; CHECK-NEXT: [[COPY4:%[0-9]+]]:sreg_64_xexec = COPY killed [[S_MOV_B64_term]]210 ; CHECK-NEXT: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 1211 ; CHECK-NEXT: $exec = S_OR_B64_term $exec, killed [[COPY4]], implicit-def $scc212 ; CHECK-NEXT: {{ $}}213 ; CHECK-NEXT: bb.3:214 ; CHECK-NEXT: successors: %bb.2(0x80000000)215 ; CHECK-NEXT: {{ $}}216 ; CHECK-NEXT: S_NOP 0, implicit killed [[S_MOV_B64_]]217 ; CHECK-NEXT: [[COPY5:%[0-9]+]]:vgpr_32 = COPY killed [[COPY1]]218 ; CHECK-NEXT: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = nsw V_ADD_U32_e32 1, killed [[COPY5]], implicit $exec219 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[V_ADD_U32_e32_]]220 ; CHECK-NEXT: {{ $}}221 ; CHECK-NEXT: bb.2:222 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)223 ; CHECK-NEXT: {{ $}}224 ; CHECK-NEXT: [[COPY6:%[0-9]+]]:vgpr_32 = COPY killed [[COPY2]]225 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef %11:vreg_64, [[COPY6]], 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)226 ; CHECK-NEXT: [[COPY7:%[0-9]+]]:vgpr_32 = COPY killed [[COPY6]]227 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY [[COPY7]]228 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY killed [[COPY7]]229 ; CHECK-NEXT: [[COPY8:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec230 ; CHECK-NEXT: [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY8]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc231 ; CHECK-NEXT: [[S_XOR_B64_1:%[0-9]+]]:sreg_64_xexec = S_XOR_B64 [[S_AND_B64_1]], [[COPY8]], implicit-def dead $scc232 ; CHECK-NEXT: $exec = S_MOV_B64_term killed [[S_AND_B64_1]]233 ; CHECK-NEXT: [[S_MOV_B64_term:%[0-9]+]]:sreg_64_xexec = S_MOV_B64_term killed [[S_XOR_B64_1]], implicit $exec234 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec235 ; CHECK-NEXT: S_BRANCH %bb.2236 bb.0:237 liveins: $vgpr0238 239 %0:vgpr_32 = COPY killed $vgpr0240 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec241 %2:sreg_64_xexec = V_CMP_EQ_U32_e64 0, killed %0, implicit $exec242 %3:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec243 S_BRANCH %bb.2244 245 bb.1:246 %4:sreg_64_xexec = PHI %5, %bb.2, %3, %bb.0247 %6:vgpr_32 = PHI %7, %bb.2, %1, %bb.0248 %8:sreg_64 = S_MOV_B64 1249 SI_END_CF killed %4, implicit-def $exec, implicit-def dead $scc, implicit $exec250 S_NOP 0, implicit killed %8251 %9:vgpr_32 = nsw V_ADD_U32_e32 1, killed %6, implicit $exec252 253 bb.2:254 successors: %bb.2(0x40000000), %bb.1(0x40000000)255 256 %10:vgpr_32 = PHI %9, %bb.1, %7, %bb.2, %1, %bb.0257 GLOBAL_STORE_DWORD undef %11:vreg_64, %10, 0, 0, implicit $exec :: (volatile store (s32), addrspace 1)258 %7:vgpr_32 = COPY killed %10259 %5:sreg_64_xexec = SI_IF %2, %bb.1, implicit-def $exec, implicit-def dead $scc, implicit $exec260 S_BRANCH %bb.2261 262...263