| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -run-pass=si-lower-sgpr-spills -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s |
| |
| # A simple SGPR spill. Implicit def for lane VGPR should be inserted just before the spill instruction. |
| --- |
| name: sgpr32_spill |
| tracksRegLiveness: true |
| frameInfo: |
| maxAlignment: 4 |
| stack: |
| - { id: 0, type: spill-slot, size: 4, alignment: 4, stack-id: sgpr-spill } |
| machineFunctionInfo: |
| isEntryFunction: false |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' |
| stackPtrOffsetReg: '$sgpr32' |
| frameOffsetReg: '$sgpr33' |
| hasSpilledSGPRs: true |
| body: | |
| bb.0: |
| liveins: $sgpr30_sgpr31, $sgpr10 |
| ; GCN-LABEL: name: sgpr32_spill |
| ; GCN: liveins: $sgpr30_sgpr31, $sgpr10 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr10, 0, [[DEF]] |
| ; GCN-NEXT: $sgpr10 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 0 |
| ; GCN-NEXT: S_SETPC_B64 $sgpr30_sgpr31 |
| S_NOP 0 |
| SI_SPILL_S32_SAVE killed $sgpr10, %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| renamable $sgpr10 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_SETPC_B64 $sgpr30_sgpr31 |
| ... |
| |
| # Needed an additional virtual lane register as the lanes of current register are fully occupied while spilling a wide SGPR tuple. |
| # There must be two implicit def for the two lane VGPRs. |
| |
| --- |
| name: sgpr_spill_lane_crossover |
| tracksRegLiveness: true |
| frameInfo: |
| maxAlignment: 4 |
| stack: |
| - { id: 0, type: spill-slot, size: 4, alignment: 4, stack-id: sgpr-spill } |
| - { id: 1, type: spill-slot, size: 128, alignment: 4, stack-id: sgpr-spill } |
| machineFunctionInfo: |
| isEntryFunction: false |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' |
| stackPtrOffsetReg: '$sgpr32' |
| frameOffsetReg: '$sgpr33' |
| hasSpilledSGPRs: true |
| body: | |
| bb.0: |
| liveins: $sgpr30_sgpr31, $sgpr10, $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 |
| ; GCN-LABEL: name: sgpr_spill_lane_crossover |
| ; GCN: liveins: $sgpr10, $sgpr64, $sgpr65, $sgpr66, $sgpr67, $sgpr68, $sgpr69, $sgpr70, $sgpr71, $sgpr80, $sgpr81, $sgpr82, $sgpr83, $sgpr84, $sgpr85, $sgpr86, $sgpr87, $vgpr63, $sgpr30_sgpr31, $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr64, 0, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr65, 1, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr66, 2, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr67, 3, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr68, 4, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr69, 5, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr70, 6, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr71, 7, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr80, 8, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr81, 9, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr82, 10, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr83, 11, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr84, 12, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr85, 13, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr86, 14, $vgpr63 |
| ; GCN-NEXT: $vgpr63 = SI_SPILL_S32_TO_VGPR $sgpr87, 15, $vgpr63 |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr10, 0, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr64, 1, [[DEF]], implicit-def $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr65, 2, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr66, 3, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr67, 4, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr68, 5, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr69, 6, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr70, 7, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr71, 8, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr72, 9, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr73, 10, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr74, 11, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr75, 12, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr76, 13, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr77, 14, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr78, 15, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr79, 16, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr80, 17, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr81, 18, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr82, 19, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr83, 20, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr84, 21, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr85, 22, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr86, 23, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr87, 24, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr88, 25, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr89, 26, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr90, 27, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr91, 28, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr92, 29, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr93, 30, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR $sgpr94, 31, [[DEF]] |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr95, 32, [[DEF]], implicit killed $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: $sgpr64 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 1, implicit-def $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 |
| ; GCN-NEXT: $sgpr65 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 2 |
| ; GCN-NEXT: $sgpr66 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 3 |
| ; GCN-NEXT: $sgpr67 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 4 |
| ; GCN-NEXT: $sgpr68 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 5 |
| ; GCN-NEXT: $sgpr69 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 6 |
| ; GCN-NEXT: $sgpr70 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 7 |
| ; GCN-NEXT: $sgpr71 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 8 |
| ; GCN-NEXT: $sgpr72 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 9 |
| ; GCN-NEXT: $sgpr73 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 10 |
| ; GCN-NEXT: $sgpr74 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 11 |
| ; GCN-NEXT: $sgpr75 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 12 |
| ; GCN-NEXT: $sgpr76 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 13 |
| ; GCN-NEXT: $sgpr77 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 14 |
| ; GCN-NEXT: $sgpr78 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 15 |
| ; GCN-NEXT: $sgpr79 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 16 |
| ; GCN-NEXT: $sgpr80 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 17 |
| ; GCN-NEXT: $sgpr81 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 18 |
| ; GCN-NEXT: $sgpr82 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 19 |
| ; GCN-NEXT: $sgpr83 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 20 |
| ; GCN-NEXT: $sgpr84 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 21 |
| ; GCN-NEXT: $sgpr85 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 22 |
| ; GCN-NEXT: $sgpr86 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 23 |
| ; GCN-NEXT: $sgpr87 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 24 |
| ; GCN-NEXT: $sgpr88 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 25 |
| ; GCN-NEXT: $sgpr89 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 26 |
| ; GCN-NEXT: $sgpr90 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 27 |
| ; GCN-NEXT: $sgpr91 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 28 |
| ; GCN-NEXT: $sgpr92 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 29 |
| ; GCN-NEXT: $sgpr93 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 30 |
| ; GCN-NEXT: $sgpr94 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 31 |
| ; GCN-NEXT: $sgpr95 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 32 |
| ; GCN-NEXT: $sgpr10 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 0 |
| ; GCN-NEXT: S_SETPC_B64 $sgpr30_sgpr31 |
| S_NOP 0 |
| SI_SPILL_S32_SAVE killed $sgpr10, %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| SI_SPILL_S1024_SAVE killed $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95, %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_NOP 0 |
| renamable $sgpr64_sgpr65_sgpr66_sgpr67_sgpr68_sgpr69_sgpr70_sgpr71_sgpr72_sgpr73_sgpr74_sgpr75_sgpr76_sgpr77_sgpr78_sgpr79_sgpr80_sgpr81_sgpr82_sgpr83_sgpr84_sgpr85_sgpr86_sgpr87_sgpr88_sgpr89_sgpr90_sgpr91_sgpr92_sgpr93_sgpr94_sgpr95 = SI_SPILL_S1024_RESTORE %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| renamable $sgpr10 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_SETPC_B64 $sgpr30_sgpr31 |
| ... |
| |
| # The implicit def for the lane VGPR should be inserted at the common dominator block (the entry block here). |
| |
| --- |
| name: lane_vgpr_implicit_def_at_common_dominator_block |
| tracksRegLiveness: true |
| frameInfo: |
| maxAlignment: 4 |
| stack: |
| - { id: 0, type: spill-slot, size: 4, alignment: 4, stack-id: sgpr-spill } |
| machineFunctionInfo: |
| isEntryFunction: false |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' |
| stackPtrOffsetReg: '$sgpr32' |
| frameOffsetReg: '$sgpr33' |
| hasSpilledSGPRs: true |
| body: | |
| ; GCN-LABEL: name: lane_vgpr_implicit_def_at_common_dominator_block |
| ; GCN: bb.0: |
| ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: S_CMP_EQ_U32 $sgpr11, 0, implicit-def $scc |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF |
| ; GCN-NEXT: S_CBRANCH_SCC1 %bb.2, implicit killed $scc |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.1: |
| ; GCN-NEXT: successors: %bb.3(0x80000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = S_MOV_B32 10 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr10, 0, [[DEF]] |
| ; GCN-NEXT: S_BRANCH %bb.3 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.2: |
| ; GCN-NEXT: successors: %bb.3(0x80000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = S_MOV_B32 20 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr10, 0, [[DEF]] |
| ; GCN-NEXT: S_BRANCH %bb.3 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.3: |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = SI_RESTORE_S32_FROM_VGPR [[DEF]], 0 |
| ; GCN-NEXT: S_SETPC_B64 $sgpr30_sgpr31, implicit $sgpr10 |
| bb.0: |
| liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| S_NOP 0 |
| S_CMP_EQ_U32 $sgpr11, 0, implicit-def $scc |
| S_CBRANCH_SCC1 %bb.2, implicit killed $scc |
| bb.1: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| $sgpr10 = S_MOV_B32 10 |
| SI_SPILL_S32_SAVE killed $sgpr10, %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_BRANCH %bb.3 |
| bb.2: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| $sgpr10 = S_MOV_B32 20 |
| SI_SPILL_S32_SAVE killed $sgpr10, %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_BRANCH %bb.3 |
| bb.3: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| renamable $sgpr10 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_SETPC_B64 $sgpr30_sgpr31, implicit $sgpr10 |
| ... |
| |
| # The common dominator block is visited only at the end. The insertion point was initially identified to the |
| # terminator instruction in the dominator block which later becomes the point where a spill get inserted in the same block. |
| |
| --- |
| name: dominator_block_follows_the_successors_bbs |
| tracksRegLiveness: true |
| frameInfo: |
| maxAlignment: 4 |
| stack: |
| - { id: 0, type: spill-slot, size: 4, alignment: 4, stack-id: sgpr-spill } |
| machineFunctionInfo: |
| isEntryFunction: false |
| scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3' |
| stackPtrOffsetReg: '$sgpr32' |
| frameOffsetReg: '$sgpr33' |
| hasSpilledSGPRs: true |
| body: | |
| ; GCN-LABEL: name: dominator_block_follows_the_successors_bbs |
| ; GCN: bb.0: |
| ; GCN-NEXT: successors: %bb.3(0x80000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: S_BRANCH %bb.3 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.1: |
| ; GCN-NEXT: successors: %bb.2(0x80000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = SI_RESTORE_S32_FROM_VGPR %0, 0 |
| ; GCN-NEXT: $sgpr10 = S_ADD_I32 $sgpr10, 15, implicit-def dead $scc |
| ; GCN-NEXT: S_BRANCH %bb.2 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.2: |
| ; GCN-NEXT: successors: %bb.3(0x80000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = SI_RESTORE_S32_FROM_VGPR %0, 0 |
| ; GCN-NEXT: $sgpr10 = S_ADD_I32 $sgpr10, 20, implicit-def dead $scc |
| ; GCN-NEXT: S_BRANCH %bb.3 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.3: |
| ; GCN-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: $sgpr10 = S_MOV_B32 10 |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF |
| ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = SI_SPILL_S32_TO_VGPR killed $sgpr10, 0, [[DEF]] |
| ; GCN-NEXT: S_CMP_EQ_U32 $sgpr11, 0, implicit-def $scc |
| ; GCN-NEXT: S_CBRANCH_SCC1 %bb.2, implicit killed $scc |
| ; GCN-NEXT: S_BRANCH %bb.1 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: bb.4: |
| ; GCN-NEXT: liveins: $sgpr10, $sgpr30_sgpr31 |
| ; GCN-NEXT: {{ $}} |
| ; GCN-NEXT: S_NOP 0 |
| ; GCN-NEXT: S_SETPC_B64 $sgpr30_sgpr31, implicit $sgpr10 |
| bb.0: |
| liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| S_NOP 0 |
| S_BRANCH %bb.3 |
| bb.1: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| renamable $sgpr10 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| $sgpr10 = S_ADD_I32 $sgpr10, 15, implicit-def dead $scc |
| S_BRANCH %bb.2 |
| bb.2: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| renamable $sgpr10 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| $sgpr10 = S_ADD_I32 $sgpr10, 20, implicit-def dead $scc |
| S_BRANCH %bb.3 |
| bb.3: |
| liveins: $sgpr10, $sgpr11, $sgpr30_sgpr31 |
| $sgpr10 = S_MOV_B32 10 |
| SI_SPILL_S32_SAVE killed $sgpr10, %stack.0, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr32 |
| S_CMP_EQ_U32 $sgpr11, 0, implicit-def $scc |
| S_CBRANCH_SCC1 %bb.2, implicit killed $scc |
| S_BRANCH %bb.1 |
| bb.4: |
| liveins: $sgpr10, $sgpr30_sgpr31 |
| S_NOP 0 |
| S_SETPC_B64 $sgpr30_sgpr31, implicit $sgpr10 |
| ... |