A future change will add SCC liveness checks. Since we are still relying on forward register scavenging, add dead flags to avoid spuriously detecting SCC as live.
136 lines
7.7 KiB
YAML
136 lines
7.7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-lower-sgpr-spills,prologepilog,machine-cp -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
|
|
|
|
# Make sure the initial first $sgpr1 = COPY $sgpr2 copy is not deleted
|
|
# by the copy propagation after lowering the spill.
|
|
|
|
---
|
|
name: spill_sgpr128_use_subreg
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
hasSpilledSGPRs: true
|
|
scratchRSrcReg: $sgpr100_sgpr101_sgpr102_sgpr103
|
|
stackPtrOffsetReg: $sgpr32
|
|
|
|
stack:
|
|
- { id: 0, stack-id: sgpr-spill, type: spill-slot, size: 16, alignment: 4 }
|
|
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7, $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
; GCN-LABEL: name: spill_sgpr128_use_subreg
|
|
; GCN: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7, $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: $sgpr8_sgpr9 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)
|
|
; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr8_sgpr9
|
|
; GCN-NEXT: renamable $sgpr1 = COPY $sgpr2
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr2, 2, $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr3, 3, $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: renamable $sgpr8 = COPY killed renamable $sgpr1
|
|
; GCN-NEXT: $sgpr0_sgpr1 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec
|
|
; GCN-NEXT: $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec :: (load (s32) from %stack.1, addrspace 5)
|
|
; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr0_sgpr1
|
|
; GCN-NEXT: S_ENDPGM 0, implicit $sgpr8
|
|
renamable $sgpr1 = COPY $sgpr2
|
|
SI_SPILL_S128_SAVE renamable $sgpr0_sgpr1_sgpr2_sgpr3, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s128) into %stack.0, align 4, addrspace 5)
|
|
renamable $sgpr8 = COPY killed renamable $sgpr1
|
|
S_ENDPGM 0, implicit $sgpr8
|
|
...
|
|
|
|
---
|
|
name: spill_sgpr128_use_kill
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
hasSpilledSGPRs: true
|
|
scratchRSrcReg: $sgpr100_sgpr101_sgpr102_sgpr103
|
|
stackPtrOffsetReg: $sgpr32
|
|
|
|
stack:
|
|
- { id: 0, stack-id: sgpr-spill, type: spill-slot, size: 16, alignment: 4 }
|
|
|
|
body: |
|
|
bb.0:
|
|
liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7, $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
; GCN-LABEL: name: spill_sgpr128_use_kill
|
|
; GCN: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $sgpr5, $sgpr6, $sgpr7, $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: $sgpr8_sgpr9 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)
|
|
; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr8_sgpr9
|
|
; GCN-NEXT: renamable $sgpr1 = COPY $sgpr2
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr0, 0, $vgpr0, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr1, 1, $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr2, 2, $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $vgpr0 = V_WRITELANE_B32 killed $sgpr3, 3, $vgpr0, implicit killed $sgpr0_sgpr1_sgpr2_sgpr3
|
|
; GCN-NEXT: $sgpr0_sgpr1 = S_OR_SAVEEXEC_B64 -1, implicit-def $exec, implicit-def dead $scc, implicit $exec
|
|
; GCN-NEXT: $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec :: (load (s32) from %stack.1, addrspace 5)
|
|
; GCN-NEXT: $exec = S_MOV_B64 killed $sgpr0_sgpr1
|
|
; GCN-NEXT: S_ENDPGM 0
|
|
renamable $sgpr1 = COPY $sgpr2
|
|
SI_SPILL_S128_SAVE renamable killed $sgpr0_sgpr1_sgpr2_sgpr3, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s128) into %stack.0, align 4, addrspace 5)
|
|
S_ENDPGM 0
|
|
...
|
|
|
|
---
|
|
name: spill_vgpr128_use_subreg
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
scratchRSrcReg: $sgpr100_sgpr101_sgpr102_sgpr103
|
|
stackPtrOffsetReg: $sgpr32
|
|
|
|
stack:
|
|
- { id: 0, type: spill-slot, size: 16, alignment: 4 }
|
|
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
|
|
|
|
; GCN-LABEL: name: spill_vgpr128_use_subreg
|
|
; GCN: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: renamable $vgpr1 = COPY $vgpr2
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr0, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1_vgpr2_vgpr3, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr1, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 4, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr2, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 8, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 8, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET $vgpr3, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 12, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 12, addrspace 5)
|
|
; GCN-NEXT: renamable $vgpr8 = COPY killed renamable $vgpr1
|
|
; GCN-NEXT: S_ENDPGM 0, implicit $vgpr8
|
|
renamable $vgpr1 = COPY $vgpr2
|
|
SI_SPILL_V128_SAVE renamable $vgpr0_vgpr1_vgpr2_vgpr3, %stack.0, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.0, align 4, addrspace 5)
|
|
renamable $vgpr8 = COPY killed renamable $vgpr1
|
|
S_ENDPGM 0, implicit $vgpr8
|
|
...
|
|
|
|
---
|
|
name: spill_vgpr128_use_kill
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
scratchRSrcReg: $sgpr100_sgpr101_sgpr102_sgpr103
|
|
stackPtrOffsetReg: $sgpr32
|
|
|
|
stack:
|
|
- { id: 0, type: spill-slot, size: 16, alignment: 4 }
|
|
|
|
body: |
|
|
bb.0:
|
|
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
|
|
|
|
; GCN-LABEL: name: spill_vgpr128_use_kill
|
|
; GCN: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7
|
|
; GCN-NEXT: {{ $}}
|
|
; GCN-NEXT: renamable $vgpr1 = COPY $vgpr2
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 0, 0, 0, 0, implicit $exec, implicit-def $vgpr0_vgpr1_vgpr2_vgpr3, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr1, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 4, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 4, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr2, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 8, 0, 0, 0, implicit $exec, implicit $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 8, addrspace 5)
|
|
; GCN-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr3, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr32, 12, 0, 0, 0, implicit $exec, implicit killed $vgpr0_vgpr1_vgpr2_vgpr3 :: (store (s32) into %stack.0 + 12, addrspace 5)
|
|
; GCN-NEXT: S_ENDPGM 0
|
|
renamable $vgpr1 = COPY $vgpr2
|
|
SI_SPILL_V128_SAVE renamable killed $vgpr0_vgpr1_vgpr2_vgpr3, %stack.0, $sgpr32, 0, implicit $exec :: (store (s128) into %stack.0, align 4, addrspace 5)
|
|
S_ENDPGM 0
|
|
...
|