514 lines · plain
1# RUN: llc -verify-machineinstrs -mtriple=amdgcn -run-pass si-shrink-instructions -o - %s | FileCheck -check-prefix=GCN %s2# RUN: llc -verify-machineinstrs -mtriple=amdgcn -passes si-shrink-instructions -o - %s | FileCheck -check-prefix=GCN %s3# Check that add with carry out isn't incorrectly reduced to e32 when4# the carry out is a virtual register.5 6# TODO: We should run this test until the end of codegen to make sure7# that the post-RA run does manage to shrink it, but right now the8# resume crashes9 10...11# GCN-LABEL: name: shrink_add_vop3{{$}}12# GCN: %29:vgpr_32, %9:sreg_64_xexec = V_ADD_CO_U32_e64 %19, %17, 0, implicit $exec13# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec14name: shrink_add_vop315alignment: 116exposesReturnsTwice: false17legalized: false18regBankSelected: false19selected: false20tracksRegLiveness: true21registers:22 - { id: 0, class: sgpr_64 }23 - { id: 1, class: sreg_32_xm0 }24 - { id: 2, class: sgpr_32 }25 - { id: 3, class: vgpr_32 }26 - { id: 4, class: sreg_64_xexec }27 - { id: 5, class: sreg_64_xexec }28 - { id: 6, class: sreg_32 }29 - { id: 7, class: sreg_32 }30 - { id: 8, class: sreg_32_xm0 }31 - { id: 9, class: sreg_64_xexec }32 - { id: 10, class: sreg_32_xm0 }33 - { id: 11, class: sreg_32_xm0 }34 - { id: 12, class: sgpr_64 }35 - { id: 13, class: sgpr_128 }36 - { id: 14, class: sreg_32_xm0 }37 - { id: 15, class: sreg_64 }38 - { id: 16, class: sgpr_128 }39 - { id: 17, class: vgpr_32 }40 - { id: 18, class: vreg_64 }41 - { id: 19, class: vgpr_32 }42 - { id: 20, class: vreg_64 }43 - { id: 21, class: sreg_32_xm0 }44 - { id: 22, class: sreg_32 }45 - { id: 23, class: sreg_32 }46 - { id: 24, class: vgpr_32 }47 - { id: 25, class: vreg_64 }48 - { id: 26, class: vgpr_32 }49 - { id: 27, class: vreg_64 }50 - { id: 28, class: vreg_64 }51 - { id: 29, class: vgpr_32 }52liveins:53 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }54 - { reg: '$vgpr0', virtual-reg: '%3' }55frameInfo:56 isFrameAddressTaken: false57 isReturnAddressTaken: false58 hasStackMap: false59 hasPatchPoint: false60 stackSize: 061 offsetAdjustment: 062 maxAlignment: 063 adjustsStack: false64 hasCalls: false65 maxCallFrameSize: 066 hasOpaqueSPAdjustment: false67 hasVAStart: false68 hasMustTailInVarArgFunc: false69body: |70 bb.0:71 liveins: $sgpr0_sgpr1, $vgpr072 73 %3 = COPY $vgpr074 %0 = COPY $sgpr0_sgpr175 %4 = S_LOAD_DWORDX2_IMM %0, 9, 076 %5 = S_LOAD_DWORDX2_IMM %0, 11, 077 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec78 %27 = REG_SEQUENCE %3, 1, %26, 279 %10 = S_MOV_B32 6144080 %11 = S_MOV_B32 081 %12 = REG_SEQUENCE killed %11, 1, killed %10, 282 %13 = REG_SEQUENCE killed %5, 17, %12, 1883 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec84 %16 = REG_SEQUENCE killed %4, 17, %12, 1885 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec86 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec87 %29, %9 = V_ADD_CO_U32_e64 %19, %17, 0, implicit $exec88 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec89 BUFFER_STORE_DWORD_ADDR64 %24, %28, killed %16, 0, 0, 0, 0, implicit $exec90 S_ENDPGM 091 92...93---94# GCN-LABEL: name: shrink_sub_vop3{{$}}95# GCN: %29:vgpr_32, %9:sreg_64_xexec = V_SUB_CO_U32_e64 %19, %17, 0, implicit $exec96# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec97 98name: shrink_sub_vop399alignment: 1100exposesReturnsTwice: false101legalized: false102regBankSelected: false103selected: false104tracksRegLiveness: true105registers:106 - { id: 0, class: sgpr_64 }107 - { id: 1, class: sreg_32_xm0 }108 - { id: 2, class: sgpr_32 }109 - { id: 3, class: vgpr_32 }110 - { id: 4, class: sreg_64_xexec }111 - { id: 5, class: sreg_64_xexec }112 - { id: 6, class: sreg_32 }113 - { id: 7, class: sreg_32 }114 - { id: 8, class: sreg_32_xm0 }115 - { id: 9, class: sreg_64_xexec }116 - { id: 10, class: sreg_32_xm0 }117 - { id: 11, class: sreg_32_xm0 }118 - { id: 12, class: sgpr_64 }119 - { id: 13, class: sgpr_128 }120 - { id: 14, class: sreg_32_xm0 }121 - { id: 15, class: sreg_64 }122 - { id: 16, class: sgpr_128 }123 - { id: 17, class: vgpr_32 }124 - { id: 18, class: vreg_64 }125 - { id: 19, class: vgpr_32 }126 - { id: 20, class: vreg_64 }127 - { id: 21, class: sreg_32_xm0 }128 - { id: 22, class: sreg_32 }129 - { id: 23, class: sreg_32 }130 - { id: 24, class: vgpr_32 }131 - { id: 25, class: vreg_64 }132 - { id: 26, class: vgpr_32 }133 - { id: 27, class: vreg_64 }134 - { id: 28, class: vreg_64 }135 - { id: 29, class: vgpr_32 }136liveins:137 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }138 - { reg: '$vgpr0', virtual-reg: '%3' }139frameInfo:140 isFrameAddressTaken: false141 isReturnAddressTaken: false142 hasStackMap: false143 hasPatchPoint: false144 stackSize: 0145 offsetAdjustment: 0146 maxAlignment: 0147 adjustsStack: false148 hasCalls: false149 maxCallFrameSize: 0150 hasOpaqueSPAdjustment: false151 hasVAStart: false152 hasMustTailInVarArgFunc: false153body: |154 bb.0:155 liveins: $sgpr0_sgpr1, $vgpr0156 157 %3 = COPY $vgpr0158 %0 = COPY $sgpr0_sgpr1159 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0160 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0161 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec162 %27 = REG_SEQUENCE %3, 1, %26, 2163 %10 = S_MOV_B32 61440164 %11 = S_MOV_B32 0165 %12 = REG_SEQUENCE killed %11, 1, killed %10, 2166 %13 = REG_SEQUENCE killed %5, 17, %12, 18167 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec168 %16 = REG_SEQUENCE killed %4, 17, %12, 18169 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec170 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec171 %29, %9 = V_SUB_CO_U32_e64 %19, %17, 0, implicit $exec172 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec173 BUFFER_STORE_DWORD_ADDR64 %24, %28, killed %16, 0, 0, 0, 0, implicit $exec174 S_ENDPGM 0175 176...177---178# GCN-LABEL: name: shrink_subrev_vop3{{$}}179# GCN: %29:vgpr_32, %9:sreg_64_xexec = V_SUBREV_CO_U32_e64 %19, %17, 0, implicit $exec180# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec181 182name: shrink_subrev_vop3183alignment: 1184exposesReturnsTwice: false185legalized: false186regBankSelected: false187selected: false188tracksRegLiveness: true189registers:190 - { id: 0, class: sgpr_64 }191 - { id: 1, class: sreg_32_xm0 }192 - { id: 2, class: sgpr_32 }193 - { id: 3, class: vgpr_32 }194 - { id: 4, class: sreg_64_xexec }195 - { id: 5, class: sreg_64_xexec }196 - { id: 6, class: sreg_32 }197 - { id: 7, class: sreg_32 }198 - { id: 8, class: sreg_32_xm0 }199 - { id: 9, class: sreg_64_xexec }200 - { id: 10, class: sreg_32_xm0 }201 - { id: 11, class: sreg_32_xm0 }202 - { id: 12, class: sgpr_64 }203 - { id: 13, class: sgpr_128 }204 - { id: 14, class: sreg_32_xm0 }205 - { id: 15, class: sreg_64 }206 - { id: 16, class: sgpr_128 }207 - { id: 17, class: vgpr_32 }208 - { id: 18, class: vreg_64 }209 - { id: 19, class: vgpr_32 }210 - { id: 20, class: vreg_64 }211 - { id: 21, class: sreg_32_xm0 }212 - { id: 22, class: sreg_32 }213 - { id: 23, class: sreg_32 }214 - { id: 24, class: vgpr_32 }215 - { id: 25, class: vreg_64 }216 - { id: 26, class: vgpr_32 }217 - { id: 27, class: vreg_64 }218 - { id: 28, class: vreg_64 }219 - { id: 29, class: vgpr_32 }220liveins:221 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }222 - { reg: '$vgpr0', virtual-reg: '%3' }223frameInfo:224 isFrameAddressTaken: false225 isReturnAddressTaken: false226 hasStackMap: false227 hasPatchPoint: false228 stackSize: 0229 offsetAdjustment: 0230 maxAlignment: 0231 adjustsStack: false232 hasCalls: false233 maxCallFrameSize: 0234 hasOpaqueSPAdjustment: false235 hasVAStart: false236 hasMustTailInVarArgFunc: false237body: |238 bb.0:239 liveins: $sgpr0_sgpr1, $vgpr0240 241 %3 = COPY $vgpr0242 %0 = COPY $sgpr0_sgpr1243 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0244 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0245 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec246 %27 = REG_SEQUENCE %3, 1, %26, 2247 %10 = S_MOV_B32 61440248 %11 = S_MOV_B32 0249 %12 = REG_SEQUENCE killed %11, 1, killed %10, 2250 %13 = REG_SEQUENCE killed %5, 17, %12, 18251 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec252 %16 = REG_SEQUENCE killed %4, 17, %12, 18253 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec254 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec255 %29, %9 = V_SUBREV_CO_U32_e64 %19, %17, 0, implicit $exec256 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed %9, implicit $exec257 BUFFER_STORE_DWORD_ADDR64 %29, %28, killed %16, 0, 0, 0, 0, implicit $exec258 S_ENDPGM 0259 260...261---262# GCN-LABEL: name: check_addc_src2_vop3{{$}}263# GCN: %29:vgpr_32, $vcc = V_ADDC_U32_e64 %19, %17, %9, 0, implicit $exec264# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec265name: check_addc_src2_vop3266alignment: 1267exposesReturnsTwice: false268legalized: false269regBankSelected: false270selected: false271tracksRegLiveness: true272registers:273 - { id: 0, class: sgpr_64 }274 - { id: 1, class: sreg_32_xm0 }275 - { id: 2, class: sgpr_32 }276 - { id: 3, class: vgpr_32 }277 - { id: 4, class: sreg_64_xexec }278 - { id: 5, class: sreg_64_xexec }279 - { id: 6, class: sreg_32 }280 - { id: 7, class: sreg_32 }281 - { id: 8, class: sreg_32_xm0 }282 - { id: 9, class: sreg_64_xexec }283 - { id: 10, class: sreg_32_xm0 }284 - { id: 11, class: sreg_32_xm0 }285 - { id: 12, class: sgpr_64 }286 - { id: 13, class: sgpr_128 }287 - { id: 14, class: sreg_32_xm0 }288 - { id: 15, class: sreg_64 }289 - { id: 16, class: sgpr_128 }290 - { id: 17, class: vgpr_32 }291 - { id: 18, class: vreg_64 }292 - { id: 19, class: vgpr_32 }293 - { id: 20, class: vreg_64 }294 - { id: 21, class: sreg_32_xm0 }295 - { id: 22, class: sreg_32 }296 - { id: 23, class: sreg_32 }297 - { id: 24, class: vgpr_32 }298 - { id: 25, class: vreg_64 }299 - { id: 26, class: vgpr_32 }300 - { id: 27, class: vreg_64 }301 - { id: 28, class: vreg_64 }302 - { id: 29, class: vgpr_32 }303liveins:304 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }305 - { reg: '$vgpr0', virtual-reg: '%3' }306frameInfo:307 isFrameAddressTaken: false308 isReturnAddressTaken: false309 hasStackMap: false310 hasPatchPoint: false311 stackSize: 0312 offsetAdjustment: 0313 maxAlignment: 0314 adjustsStack: false315 hasCalls: false316 maxCallFrameSize: 0317 hasOpaqueSPAdjustment: false318 hasVAStart: false319 hasMustTailInVarArgFunc: false320body: |321 bb.0:322 liveins: $sgpr0_sgpr1, $vgpr0323 324 %3 = COPY $vgpr0325 %0 = COPY $sgpr0_sgpr1326 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0327 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0328 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec329 %27 = REG_SEQUENCE %3, 1, %26, 2330 %10 = S_MOV_B32 61440331 %11 = S_MOV_B32 0332 %12 = REG_SEQUENCE killed %11, 1, killed %10, 2333 %13 = REG_SEQUENCE killed %5, 17, %12, 18334 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec335 %16 = REG_SEQUENCE killed %4, 17, %12, 18336 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec337 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec338 %9 = S_MOV_B64 0339 %29, $vcc = V_ADDC_U32_e64 %19, %17, %9, 0, implicit $exec340 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec341 BUFFER_STORE_DWORD_ADDR64 %24, %28, killed %16, 0, 0, 0, 0, implicit $exec342 S_ENDPGM 0343 344...345---346# GCN-LABEL: name: shrink_addc_vop3{{$}}347# GCN: %29:vgpr_32 = V_ADDC_U32_e32 %19, %17, implicit-def $vcc, implicit $vcc, implicit $exec348# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec349 350name: shrink_addc_vop3351alignment: 1352exposesReturnsTwice: false353legalized: false354regBankSelected: false355selected: false356tracksRegLiveness: true357registers:358 - { id: 0, class: sgpr_64 }359 - { id: 1, class: sreg_32_xm0 }360 - { id: 2, class: sgpr_32 }361 - { id: 3, class: vgpr_32 }362 - { id: 4, class: sreg_64_xexec }363 - { id: 5, class: sreg_64_xexec }364 - { id: 6, class: sreg_32 }365 - { id: 7, class: sreg_32 }366 - { id: 8, class: sreg_32_xm0 }367 - { id: 9, class: sreg_64 }368 - { id: 10, class: sreg_32_xm0 }369 - { id: 11, class: sreg_32_xm0 }370 - { id: 12, class: sgpr_64 }371 - { id: 13, class: sgpr_128 }372 - { id: 14, class: sreg_32_xm0 }373 - { id: 15, class: sreg_64 }374 - { id: 16, class: sgpr_128 }375 - { id: 17, class: vgpr_32 }376 - { id: 18, class: vreg_64 }377 - { id: 19, class: vgpr_32 }378 - { id: 20, class: vreg_64 }379 - { id: 21, class: sreg_32_xm0 }380 - { id: 22, class: sreg_32 }381 - { id: 23, class: sreg_32 }382 - { id: 24, class: vgpr_32 }383 - { id: 25, class: vreg_64 }384 - { id: 26, class: vgpr_32 }385 - { id: 27, class: vreg_64 }386 - { id: 28, class: vreg_64 }387 - { id: 29, class: vgpr_32 }388liveins:389 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }390 - { reg: '$vgpr0', virtual-reg: '%3' }391frameInfo:392 isFrameAddressTaken: false393 isReturnAddressTaken: false394 hasStackMap: false395 hasPatchPoint: false396 stackSize: 0397 offsetAdjustment: 0398 maxAlignment: 0399 adjustsStack: false400 hasCalls: false401 maxCallFrameSize: 0402 hasOpaqueSPAdjustment: false403 hasVAStart: false404 hasMustTailInVarArgFunc: false405body: |406 bb.0:407 liveins: $sgpr0_sgpr1, $vgpr0408 409 %3 = COPY $vgpr0410 %0 = COPY $sgpr0_sgpr1411 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0412 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0413 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec414 %27 = REG_SEQUENCE %3, 1, %26, 2415 %10 = S_MOV_B32 61440416 %11 = S_MOV_B32 0417 %12 = REG_SEQUENCE killed %11, 1, killed %10, 2418 %13 = REG_SEQUENCE killed %5, 17, %12, 18419 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec420 %16 = REG_SEQUENCE killed %4, 17, %12, 18421 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec422 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec423 $vcc = S_MOV_B64 0424 %29, $vcc = V_ADDC_U32_e64 %19, %17, $vcc, 0, implicit $exec425 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec426 BUFFER_STORE_DWORD_ADDR64 %24, %28, killed %16, 0, 0, 0, 0, implicit $exec427 S_ENDPGM 0428 429...430 431---432# GCN-LABEL: name: shrink_addc_undef_vcc{{$}}433# GCN: %29:vgpr_32 = V_ADDC_U32_e32 %19, %17, implicit-def $vcc, implicit undef $vcc, implicit $exec434# GCN: %24:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec435name: shrink_addc_undef_vcc436alignment: 1437exposesReturnsTwice: false438legalized: false439regBankSelected: false440selected: false441tracksRegLiveness: true442registers:443 - { id: 0, class: sgpr_64 }444 - { id: 1, class: sreg_32_xm0 }445 - { id: 2, class: sgpr_32 }446 - { id: 3, class: vgpr_32 }447 - { id: 4, class: sreg_64_xexec }448 - { id: 5, class: sreg_64_xexec }449 - { id: 6, class: sreg_32 }450 - { id: 7, class: sreg_32 }451 - { id: 8, class: sreg_32_xm0 }452 - { id: 9, class: sreg_64 }453 - { id: 10, class: sreg_32_xm0 }454 - { id: 11, class: sreg_32_xm0 }455 - { id: 12, class: sgpr_64 }456 - { id: 13, class: sgpr_128 }457 - { id: 14, class: sreg_32_xm0 }458 - { id: 15, class: sreg_64 }459 - { id: 16, class: sgpr_128 }460 - { id: 17, class: vgpr_32 }461 - { id: 18, class: vreg_64 }462 - { id: 19, class: vgpr_32 }463 - { id: 20, class: vreg_64 }464 - { id: 21, class: sreg_32_xm0 }465 - { id: 22, class: sreg_32 }466 - { id: 23, class: sreg_32 }467 - { id: 24, class: vgpr_32 }468 - { id: 25, class: vreg_64 }469 - { id: 26, class: vgpr_32 }470 - { id: 27, class: vreg_64 }471 - { id: 28, class: vreg_64 }472 - { id: 29, class: vgpr_32 }473liveins:474 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' }475 - { reg: '$vgpr0', virtual-reg: '%3' }476frameInfo:477 isFrameAddressTaken: false478 isReturnAddressTaken: false479 hasStackMap: false480 hasPatchPoint: false481 stackSize: 0482 offsetAdjustment: 0483 maxAlignment: 0484 adjustsStack: false485 hasCalls: false486 maxCallFrameSize: 0487 hasOpaqueSPAdjustment: false488 hasVAStart: false489 hasMustTailInVarArgFunc: false490body: |491 bb.0:492 liveins: $sgpr0_sgpr1, $vgpr0493 494 %3 = COPY $vgpr0495 %0 = COPY $sgpr0_sgpr1496 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0497 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0498 %26 = V_ASHRREV_I32_e32 31, %3, implicit $exec499 %27 = REG_SEQUENCE %3, 1, %26, 2500 %10 = S_MOV_B32 61440501 %11 = S_MOV_B32 0502 %12 = REG_SEQUENCE killed %11, 1, killed %10, 2503 %13 = REG_SEQUENCE killed %5, 17, %12, 18504 %28 = V_LSHL_B64_e64 killed %27, 2, implicit $exec505 %16 = REG_SEQUENCE killed %4, 17, %12, 18506 %17 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 0, 0, 0, implicit $exec507 %19 = BUFFER_LOAD_DWORD_ADDR64 %28, %13, 0, 4, 0, 0, implicit $exec508 %29, $vcc = V_ADDC_U32_e64 %19, %17, undef $vcc, 0, implicit $exec509 %24 = V_CNDMASK_B32_e64 0, 0, 0, 1, killed $vcc, implicit $exec510 BUFFER_STORE_DWORD_ADDR64 %24, %28, killed %16, 0, 0, 0, 0, implicit $exec511 S_ENDPGM 0512 513...514