553 lines · plain
1# RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass si-optimize-exec-masking -o - %s | FileCheck %s2 3--- |4 define amdgpu_kernel void @optimize_if_and_saveexec_xor(i32 %z, i32 %v) {5 main_body:6 br i1 poison, label %if, label %end7 8 if: ; preds = %main_body9 %v.if = load volatile i32, ptr addrspace(1) poison10 br label %end11 12 end: ; preds = %if, %main_body13 ret void14 }15 16 define amdgpu_kernel void @optimize_if_and_saveexec(i32 %z, i32 %v) {17 main_body:18 br i1 poison, label %if, label %end19 20 if:21 br label %end22 23 end:24 ret void25 }26 27 define amdgpu_kernel void @optimize_if_or_saveexec(i32 %z, i32 %v) {28 main_body:29 br i1 poison, label %if, label %end30 31 if:32 br label %end33 34 end:35 ret void36 }37 38 define amdgpu_kernel void @optimize_if_and_saveexec_xor_valu_middle(i32 %z, i32 %v) {39 main_body:40 br i1 poison, label %if, label %end41 42 if: ; preds = %main_body43 br label %end44 45 end: ; preds = %if, %main_body46 ret void47 }48 49 define amdgpu_kernel void @optimize_if_and_saveexec_xor_wrong_reg(i32 %z, i32 %v) {50 main_body:51 br i1 poison, label %if, label %end52 53 if:54 br label %end55 56 end:57 ret void58 }59 60 define amdgpu_kernel void @optimize_if_and_saveexec_xor_modify_copy_to_exec(i32 %z, i32 %v) {61 main_body:62 br i1 poison, label %if, label %end63 64 if:65 br label %end66 67 end:68 ret void69 }70 71 define amdgpu_kernel void @optimize_if_and_saveexec_xor_live_out_setexec(i32 %z, i32 %v) {72 main_body:73 br i1 poison, label %if, label %end74 75 if:76 br label %end77 78 end:79 ret void80 }81 82 define amdgpu_kernel void @optimize_if_unknown_saveexec(i32 %z, i32 %v) {83 main_body:84 br i1 poison, label %if, label %end85 86 if:87 br label %end88 89 end:90 ret void91 }92 93 define amdgpu_kernel void @optimize_if_andn2_saveexec(i32 %z, i32 %v) {94 main_body:95 br i1 poison, label %if, label %end96 97 if:98 br label %end99 100 end:101 ret void102 }103 104 define amdgpu_kernel void @optimize_if_andn2_saveexec_no_commute(i32 %z, i32 %v) {105 main_body:106 br i1 poison, label %if, label %end107 108 if:109 br label %end110 111 end:112 ret void113 }114 115 define amdgpu_kernel void @if_and_xor_read_exec_copy_subreg() {116 main_body:117 br i1 poison, label %if, label %end118 119 if: ; preds = %main_body120 br label %end121 122 end: ; preds = %if, %main_body123 ret void124 }125 126...127---128# CHECK-LABEL: name: optimize_if_and_saveexec_xor{{$}}129# CHECK: $sgpr0_sgpr1 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec130# CHECK-NEXT: $sgpr0_sgpr1 = S_XOR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc131# CHECK-NEXT: S_CBRANCH_EXECZ132 133name: optimize_if_and_saveexec_xor134liveins:135 - { reg: '$vgpr0' }136body: |137 bb.0.main_body:138 liveins: $vgpr0139 140 $sgpr0_sgpr1 = COPY $exec141 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec142 $vgpr0 = V_MOV_B32_e32 4, implicit $exec143 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc144 $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc145 $exec = S_MOV_B64_term killed $sgpr2_sgpr3146 S_CBRANCH_EXECZ %bb.2, implicit $exec147 S_BRANCH %bb.1148 149 bb.1.if:150 liveins: $sgpr0_sgpr1151 152 $sgpr7 = S_MOV_B32 61440153 $sgpr6 = S_MOV_B32 -1154 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec155 156 bb.2.end:157 liveins: $vgpr0, $sgpr0_sgpr1158 159 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc160 $sgpr3 = S_MOV_B32 61440161 $sgpr2 = S_MOV_B32 -1162 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec163 S_ENDPGM 0164 165...166---167# CHECK-LABEL: name: optimize_if_and_saveexec{{$}}168# CHECK: $sgpr0_sgpr1 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec169# CHECK-NEXT: S_CBRANCH_EXECZ170 171name: optimize_if_and_saveexec172liveins:173 - { reg: '$vgpr0' }174body: |175 bb.0.main_body:176 liveins: $vgpr0177 178 $sgpr0_sgpr1 = COPY $exec179 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec180 $vgpr0 = V_MOV_B32_e32 4, implicit $exec181 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc182 $exec = S_MOV_B64_term killed $sgpr2_sgpr3183 S_CBRANCH_EXECZ %bb.2, implicit $exec184 S_BRANCH %bb.1185 186 bb.1.if:187 liveins: $sgpr0_sgpr1188 189 $sgpr7 = S_MOV_B32 61440190 $sgpr6 = S_MOV_B32 -1191 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec192 193 bb.2.end:194 liveins: $vgpr0, $sgpr0_sgpr1195 196 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc197 $sgpr3 = S_MOV_B32 61440198 $sgpr2 = S_MOV_B32 -1199 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec200 S_ENDPGM 0201 202...203---204# CHECK-LABEL: name: optimize_if_or_saveexec{{$}}205# CHECK: $sgpr0_sgpr1 = S_OR_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec206# CHECK-NEXT: S_CBRANCH_EXECZ207 208name: optimize_if_or_saveexec209liveins:210 - { reg: '$vgpr0' }211body: |212 bb.0.main_body:213 liveins: $vgpr0214 215 $sgpr0_sgpr1 = COPY $exec216 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec217 $vgpr0 = V_MOV_B32_e32 4, implicit $exec218 $sgpr2_sgpr3 = S_OR_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc219 $exec = S_MOV_B64_term killed $sgpr2_sgpr3220 S_CBRANCH_EXECZ %bb.2, implicit $exec221 S_BRANCH %bb.1222 223 bb.1.if:224 liveins: $sgpr0_sgpr1225 226 $sgpr7 = S_MOV_B32 61440227 $sgpr6 = S_MOV_B32 -1228 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec229 230 bb.2.end:231 liveins: $vgpr0, $sgpr0_sgpr1232 233 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc234 $sgpr3 = S_MOV_B32 61440235 $sgpr2 = S_MOV_B32 -1236 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec237 S_ENDPGM 0238 239...240---241# CHECK-LABEL: name: optimize_if_and_saveexec_xor_valu_middle242# CHECK: $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc243# CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr0, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec244# CHECK-NEXT: $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc245# CHECK-NEXT: $exec = COPY killed $sgpr2_sgpr3246# CHECK-NEXT: S_CBRANCH_EXECZ247name: optimize_if_and_saveexec_xor_valu_middle248liveins:249 - { reg: '$vgpr0' }250body: |251 bb.0.main_body:252 liveins: $vgpr0253 254 $sgpr0_sgpr1 = COPY $exec255 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec256 $vgpr0 = V_MOV_B32_e32 4, implicit $exec257 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc258 BUFFER_STORE_DWORD_OFFSET $vgpr0, undef $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec259 $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc260 $exec = S_MOV_B64_term killed $sgpr2_sgpr3261 S_CBRANCH_EXECZ %bb.2, implicit $exec262 S_BRANCH %bb.1263 264 bb.1.if:265 liveins: $sgpr0_sgpr1266 267 $sgpr7 = S_MOV_B32 61440268 $sgpr6 = S_MOV_B32 -1269 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec270 271 bb.2.end:272 liveins: $vgpr0, $sgpr0_sgpr1273 274 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc275 $sgpr3 = S_MOV_B32 61440276 $sgpr2 = S_MOV_B32 -1277 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec278 S_ENDPGM 0279 280...281---282# CHECK-LABEL: name: optimize_if_and_saveexec_xor_wrong_reg{{$}}283# CHECK: $sgpr0_sgpr1 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc284# CHECK-NEXT: $sgpr0_sgpr1 = S_XOR_B64 undef $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc285# CHECK-NEXT: $exec = COPY $sgpr0_sgpr1286# CHECK-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec287name: optimize_if_and_saveexec_xor_wrong_reg288liveins:289 - { reg: '$vgpr0' }290body: |291 bb.0.main_body:292 liveins: $vgpr0293 294 $sgpr6 = S_MOV_B32 -1295 $sgpr7 = S_MOV_B32 61440296 $sgpr0_sgpr1 = COPY $exec297 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec298 $vgpr0 = V_MOV_B32_e32 4, implicit $exec299 $sgpr0_sgpr1 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc300 $sgpr0_sgpr1 = S_XOR_B64 undef $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc301 $exec = S_MOV_B64_term $sgpr0_sgpr1302 S_CBRANCH_EXECZ %bb.2, implicit $exec303 S_BRANCH %bb.1304 305 bb.1.if:306 liveins: $sgpr0_sgpr1 , $sgpr4_sgpr5_sgpr6_sgpr7307 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec308 309 bb.2.end:310 liveins: $vgpr0, $sgpr0_sgpr1, $sgpr4_sgpr5_sgpr6_sgpr7311 312 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc313 $sgpr3 = S_MOV_B32 61440314 $sgpr2 = S_MOV_B32 -1315 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec316 S_ENDPGM 0317 318...319---320# CHECK-LABEL: name: optimize_if_and_saveexec_xor_modify_copy_to_exec{{$}}321# CHECK: $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc322# CHECK-NEXT: $sgpr2_sgpr3 = S_OR_B64 killed $sgpr2_sgpr3, 1, implicit-def $scc323# CHECK-NEXT: $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc324# CHECK-NEXT: $exec = COPY killed $sgpr2_sgpr3325# CHECK-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec326 327name: optimize_if_and_saveexec_xor_modify_copy_to_exec328liveins:329 - { reg: '$vgpr0' }330body: |331 bb.0.main_body:332 liveins: $vgpr0333 334 $sgpr0_sgpr1 = COPY $exec335 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec336 $vgpr0 = V_MOV_B32_e32 4, implicit $exec337 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc338 $sgpr2_sgpr3 = S_OR_B64 killed $sgpr2_sgpr3, 1, implicit-def $scc339 $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc340 $exec = S_MOV_B64_term killed $sgpr2_sgpr3341 S_CBRANCH_EXECZ %bb.2, implicit $exec342 S_BRANCH %bb.1343 344 bb.1.if:345 liveins: $sgpr0_sgpr1346 347 $sgpr7 = S_MOV_B32 61440348 $sgpr6 = S_MOV_B32 -1349 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec350 351 bb.2.end:352 liveins: $vgpr0, $sgpr0_sgpr1353 354 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc355 $sgpr0 = S_MOV_B32 0356 $sgpr1 = S_MOV_B32 1357 $sgpr2 = S_MOV_B32 -1358 $sgpr3 = S_MOV_B32 61440359 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec360 S_ENDPGM 0361 362...363---364# CHECK-LABEL: name: optimize_if_and_saveexec_xor_live_out_setexec{{$}}365# CHECK: $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc366# CHECK-NEXT: $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc367# CHECK-NEXT: $exec = COPY $sgpr2_sgpr3368# CHECK-NEXT: S_CBRANCH_EXECZ369name: optimize_if_and_saveexec_xor_live_out_setexec370liveins:371 - { reg: '$vgpr0' }372body: |373 bb.0.main_body:374 liveins: $vgpr0375 376 $sgpr0_sgpr1 = COPY $exec377 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec378 $vgpr0 = V_MOV_B32_e32 4, implicit $exec379 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc380 $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc381 $exec = S_MOV_B64_term $sgpr2_sgpr3382 S_CBRANCH_EXECZ %bb.2, implicit $exec383 S_BRANCH %bb.1384 385 bb.1.if:386 liveins: $sgpr0_sgpr1, $sgpr2_sgpr3387 S_SLEEP 0, implicit $sgpr2_sgpr3388 $sgpr7 = S_MOV_B32 61440389 $sgpr6 = S_MOV_B32 -1390 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec391 392 bb.2.end:393 liveins: $vgpr0, $sgpr0_sgpr1394 395 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc396 $sgpr3 = S_MOV_B32 61440397 $sgpr2 = S_MOV_B32 -1398 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec399 S_ENDPGM 0400 401...402 403# CHECK-LABEL: name: optimize_if_unknown_saveexec{{$}}404# CHECK: $sgpr0_sgpr1 = COPY $exec405# CHECK: $sgpr2_sgpr3 = S_LSHR_B64 $sgpr0_sgpr1, killed $vcc_lo, implicit-def $scc406# CHECK-NEXT: $exec = COPY killed $sgpr2_sgpr3407# CHECK-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec408 409name: optimize_if_unknown_saveexec410liveins:411 - { reg: '$vgpr0' }412body: |413 bb.0.main_body:414 liveins: $vgpr0415 416 $sgpr0_sgpr1 = COPY $exec417 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec418 $vgpr0 = V_MOV_B32_e32 4, implicit $exec419 $sgpr2_sgpr3 = S_LSHR_B64 $sgpr0_sgpr1, killed $vcc_lo, implicit-def $scc420 $exec = S_MOV_B64_term killed $sgpr2_sgpr3421 S_CBRANCH_EXECZ %bb.2, implicit $exec422 S_BRANCH %bb.1423 424 bb.1.if:425 liveins: $sgpr0_sgpr1426 427 $sgpr7 = S_MOV_B32 61440428 $sgpr6 = S_MOV_B32 -1429 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec430 431 bb.2.end:432 liveins: $vgpr0, $sgpr0_sgpr1433 434 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc435 $sgpr3 = S_MOV_B32 61440436 $sgpr2 = S_MOV_B32 -1437 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec438 S_ENDPGM 0439 440...441---442# CHECK-LABEL: name: optimize_if_andn2_saveexec{{$}}443# CHECK: $sgpr0_sgpr1 = S_ANDN2_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec444# CHECK-NEXT: S_CBRANCH_EXECZ445 446name: optimize_if_andn2_saveexec447liveins:448 - { reg: '$vgpr0' }449body: |450 bb.0.main_body:451 liveins: $vgpr0452 453 $sgpr0_sgpr1 = COPY $exec454 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec455 $vgpr0 = V_MOV_B32_e32 4, implicit $exec456 $sgpr2_sgpr3 = S_ANDN2_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc457 $exec = S_MOV_B64_term killed $sgpr2_sgpr3458 S_CBRANCH_EXECZ %bb.2, implicit $exec459 S_BRANCH %bb.1460 461 bb.1.if:462 liveins: $sgpr0_sgpr1463 464 $sgpr7 = S_MOV_B32 61440465 $sgpr6 = S_MOV_B32 -1466 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec467 468 bb.2.end:469 liveins: $vgpr0, $sgpr0_sgpr1470 471 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc472 $sgpr3 = S_MOV_B32 61440473 $sgpr2 = S_MOV_B32 -1474 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec475 S_ENDPGM 0476 477...478---479# CHECK-LABEL: name: optimize_if_andn2_saveexec_no_commute{{$}}480# CHECK: $sgpr2_sgpr3 = S_ANDN2_B64 killed $vcc, $sgpr0_sgpr1, implicit-def $scc481# CHECK-NEXT: $exec = COPY killed $sgpr2_sgpr3482# CHECK-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec483name: optimize_if_andn2_saveexec_no_commute484liveins:485 - { reg: '$vgpr0' }486body: |487 bb.0.main_body:488 liveins: $vgpr0489 490 $sgpr0_sgpr1 = COPY $exec491 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec492 $vgpr0 = V_MOV_B32_e32 4, implicit $exec493 $sgpr2_sgpr3 = S_ANDN2_B64 killed $vcc, $sgpr0_sgpr1, implicit-def $scc494 $exec = S_MOV_B64_term killed $sgpr2_sgpr3495 S_CBRANCH_EXECZ %bb.2, implicit $exec496 S_BRANCH %bb.1497 498 bb.1.if:499 liveins: $sgpr0_sgpr1500 501 $sgpr7 = S_MOV_B32 61440502 $sgpr6 = S_MOV_B32 -1503 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec504 505 bb.2.end:506 liveins: $vgpr0, $sgpr0_sgpr1507 508 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc509 $sgpr3 = S_MOV_B32 61440510 $sgpr2 = S_MOV_B32 -1511 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec512 S_ENDPGM 0513 514...515---516# A read from exec copy subreg prevents optimization517# CHECK-LABEL: name: if_and_xor_read_exec_copy_subreg{{$}}518# CHECK: $sgpr0_sgpr1 = COPY $exec519# CHECK-NEXT: $sgpr4 = S_MOV_B32 $sgpr1520name: if_and_xor_read_exec_copy_subreg521liveins:522 - { reg: '$vgpr0' }523body: |524 bb.0.main_body:525 liveins: $vgpr0526 527 $sgpr0_sgpr1 = COPY $exec528 $sgpr4 = S_MOV_B32 $sgpr1529 $vcc = V_CMP_EQ_I32_e64 0, killed $vgpr0, implicit $exec530 $vgpr0 = V_MOV_B32_e32 4, implicit $exec531 $sgpr2_sgpr3 = S_AND_B64 $sgpr0_sgpr1, killed $vcc, implicit-def $scc532 $sgpr0_sgpr1 = S_XOR_B64 $sgpr2_sgpr3, killed $sgpr0_sgpr1, implicit-def $scc533 $exec = S_MOV_B64_term killed $sgpr2_sgpr3534 S_CBRANCH_EXECZ %bb.2, implicit $exec535 S_BRANCH %bb.1536 537 bb.1.if:538 liveins: $sgpr0_sgpr1539 540 $sgpr7 = S_MOV_B32 61440541 $sgpr6 = S_MOV_B32 -1542 $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec543 544 bb.2.end:545 liveins: $vgpr0, $sgpr0_sgpr1546 547 $exec = S_OR_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc548 $sgpr3 = S_MOV_B32 61440549 $sgpr2 = S_MOV_B32 -1550 BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec551 S_ENDPGM 0552...553