diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-25 16:05:55 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-25 16:05:55 +0000 | 
| commit | 921f7a27cc4e92f0af53c2d454461e41ea3b6f4f (patch) | |
| tree | d52ff517ecf4dfcd927096ce4635216e313ff371 /llvm/test/CodeGen/AMDGPU | |
| parent | 988f2da613ee0cba2db489eb0cc6c8b537901973 (diff) | |
| download | bcm5719-llvm-921f7a27cc4e92f0af53c2d454461e41ea3b6f4f.tar.gz bcm5719-llvm-921f7a27cc4e92f0af53c2d454461e41ea3b6f4f.zip  | |
StackSlotColoring: Decide colors per stack ID
I thought I fixed this in r308673, but that fix was
very broken. The assumption that any frame index can be used
in place of another was more widespread than I realized.
Even when stack slot sharing was disabled, this was still
replacing frame index uses with a different ID with a different
stack slot.
Really fix this by doing the coloring per-stack ID, so all of
the coloring logically done in a separate namespace. This is a lot
simpler than trying to figure out how to change the color if
the stack ID is different.
llvm-svn: 335488
Diffstat (limited to 'llvm/test/CodeGen/AMDGPU')
| -rw-r--r-- | llvm/test/CodeGen/AMDGPU/sgpr-spill-wrong-stack-id.mir | 97 | 
1 files changed, 97 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AMDGPU/sgpr-spill-wrong-stack-id.mir b/llvm/test/CodeGen/AMDGPU/sgpr-spill-wrong-stack-id.mir new file mode 100644 index 00000000000..be8b207a740 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/sgpr-spill-wrong-stack-id.mir @@ -0,0 +1,97 @@ +# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -stress-regalloc=3 -start-before=greedy -stop-after=stack-slot-coloring -o - %s | FileCheck -check-prefixes=SHARE,GCN %s +# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -stress-regalloc=3 -start-before=greedy -stop-after=stack-slot-coloring -no-stack-slot-sharing -o - %s | FileCheck -check-prefixes=NOSHARE,GCN %s + +# Make sure that stack slot coloring doesn't try to merge frame +# indexes used for SGPR spilling with those that aren't. +# Even when stack slot sharing was disabled, it was still moving the +# FI ID used for an SGPR spill to a normal frame index. + +--- | + +  define void @sgpr_spill_wrong_stack_id(float addrspace(1)* nocapture readnone %arg, float addrspace(1)* noalias %arg1) { +  bb: +    %tmp = load i32, i32 addrspace(1)* null, align 4 +    call void @func(i32 undef) +    call void @func(i32 %tmp) +    unreachable +  } + +  declare void @func(i32) + +... +--- + +# GCN-LABEL: name:            sgpr_spill_wrong_stack_id +# SHARE: stack: +# SHARE:   - { id: 0, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, +# SHARE:       stack-id: 0, callee-saved-register: '', callee-saved-restored: true, +# SHARE:       debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +# SHARE:   - { id: 1, name: '', type: spill-slot, offset: 0, size: 8, alignment: 4, +# SHARE:       stack-id: 1, callee-saved-register: '', callee-saved-restored: true, +# SHARE:       debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +# SHARE:   - { id: 2, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, +# SHARE:       stack-id: 1, callee-saved-register: '', callee-saved-restored: true, +# SHARE:       debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + +# SHARE: SI_SPILL_S32_SAVE $sgpr5, %stack.2, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (store 4 into %stack.2, addrspace 5) +# SHARE: SI_SPILL_V32_SAVE killed $vgpr0, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr5, 0, implicit $exec :: (store 4 into %stack.0, addrspace 5) +# SHARE: SI_SPILL_S64_SAVE killed renamable $sgpr6_sgpr7, %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (store 8 into %stack.1, align 4, addrspace 5) +# SHARE: renamable $sgpr6_sgpr7 = SI_SPILL_S64_RESTORE %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 8 from %stack.1, align 4, addrspace 5) +# SHARE: dead $sgpr30_sgpr31 = SI_CALL killed renamable $sgpr6_sgpr7, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit undef $vgpr0 +# SHARE: $sgpr5 = SI_SPILL_S32_RESTORE %stack.2, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 4 from %stack.2, addrspace 5) +# SHARE: $vgpr0 = SI_SPILL_V32_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr5, 0, implicit $exec :: (load 4 from %stack.0, addrspace 5) +# SHARE: renamable $sgpr6_sgpr7 = SI_SPILL_S64_RESTORE %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 8 from %stack.1, align 4, addrspace 5) +# SHARE: dead $sgpr30_sgpr31 = SI_CALL killed renamable $sgpr6_sgpr7, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit $vgpr0 +# SHARE:  $sgpr5 = SI_SPILL_S32_RESTORE %stack.2, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 4 from %stack.2, addrspace 5) + +# NOSHARE: stack: +# NOSHARE: - { id: 0, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, +# NOSHARE: stack-id: 0, callee-saved-register: '', callee-saved-restored: true, +# NOSHARE: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +# NOSHARE: - { id: 1, name: '', type: spill-slot, offset: 0, size: 8, alignment: 4, +# NOSHARE: stack-id: 1, callee-saved-register: '', callee-saved-restored: true, +# NOSHARE: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +# NOSHARE: - { id: 2, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, +# NOSHARE: stack-id: 1, callee-saved-register: '', callee-saved-restored: true, +# NOSHARE: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +# NOSHARE: - { id: 3, name: '', type: spill-slot, offset: 0, size: 4, alignment: 4, +# NOSHARE: stack-id: 1, callee-saved-register: '', callee-saved-restored: true, +# NOSHARE: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + +# NOSHARE: SI_SPILL_S32_SAVE $sgpr5, %stack.2, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (store 4 into %stack.2, addrspace 5) +# NOSHARE: SI_SPILL_V32_SAVE killed $vgpr0, %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr5, 0, implicit $exec :: (store 4 into %stack.0, addrspace 5) +# NOSHARE: SI_SPILL_S64_SAVE killed renamable $sgpr6_sgpr7, %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (store 8 into %stack.1, align 4, addrspace 5) +# NOSHARE: renamable $sgpr6_sgpr7 = SI_SPILL_S64_RESTORE %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 8 from %stack.1, align 4, addrspace 5) +# NOSHARE: dead $sgpr30_sgpr31 = SI_CALL killed renamable $sgpr6_sgpr7, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit undef $vgpr0 +# NOSHARE: $sgpr5 = SI_SPILL_S32_RESTORE %stack.2, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 4 from %stack.2, addrspace 5) +# NOSHARE: SI_SPILL_S32_SAVE $sgpr5, %stack.3, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (store 4 into %stack.3, addrspace 5) +# NOSHARE: $vgpr0 = SI_SPILL_V32_RESTORE %stack.0, $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr5, 0, implicit $exec :: (load 4 from %stack.0, addrspace 5) +# NOSHARE: renamable $sgpr6_sgpr7 = SI_SPILL_S64_RESTORE %stack.1, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 8 from %stack.1, align 4, addrspace 5) +# NOSHARE: dead $sgpr30_sgpr31 = SI_CALL killed renamable $sgpr6_sgpr7, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit $vgpr0 +# NOSHARE: $sgpr5 = SI_SPILL_S32_RESTORE %stack.3, implicit $exec, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr5 :: (load 4 from %stack.3, addrspace 5) + +... + +name:            sgpr_spill_wrong_stack_id +tracksRegLiveness: true +frameInfo: +  adjustsStack:    false +  hasCalls:        true +body:             | +  bb.0.bb: +    %8:sreg_32_xm0 = COPY $sgpr5 +    %4:vreg_64 = IMPLICIT_DEF +    %3:vgpr_32 = FLAT_LOAD_DWORD %4, 0, 0, 0, implicit $exec, implicit $flat_scr +    %5:sreg_64 = SI_PC_ADD_REL_OFFSET target-flags(amdgpu-rel32-lo) @func + 4, target-flags(amdgpu-rel32-hi) @func + 4, implicit-def dead $scc +    ADJCALLSTACKUP 0, 0, implicit-def $sgpr32, implicit $sgpr32, implicit $sgpr5 +    dead $sgpr30_sgpr31 = SI_CALL %5, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit undef $vgpr0 +    $sgpr5 = COPY %8 +    %12:sreg_32_xm0 = COPY $sgpr5 +    ADJCALLSTACKDOWN 0, 0, implicit-def $sgpr32, implicit $sgpr32, implicit $sgpr5 +    ADJCALLSTACKUP 0, 0, implicit-def $sgpr32, implicit $sgpr32, implicit $sgpr5 +    $vgpr0 = COPY %3 +    dead $sgpr30_sgpr31 = SI_CALL %5, @func, csr_amdgpu_highregs, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4, implicit killed $vgpr0 +    $sgpr5 = COPY %12 +    ADJCALLSTACKDOWN 0, 0, implicit-def $sgpr32, implicit $sgpr32, implicit $sgpr5 + +...  | 

