[PATCH] D115996: [AMDGPR] Don't remove VGPR to AGPR dead spills from frame info

Brendon Cahoon via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 18 13:24:23 PST 2021


bcahoon created this revision.
bcahoon added reviewers: rampitec, arsenm.
Herald added subscribers: foad, kerbowa, hiraditya, nhaehnle, jvesely.
bcahoon requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.

Removing dead frame indices for VGPR to AGPR spills is incorrect
when the frame index is shared by multiple objects, which may
occur due to stack slot coloring. The problem is that subsequent
code processes the other object will assert because the stack
frame index has been marked dead.

Removing dead frame indices is needed prior to stack slot
coloring, which is what happens with SGPR to VGPR spills. These
pills are lowered prior to stack slot coloring, but the VGPR
to AGPR spills are processed afterwards during the Prolog/Epilog
Inserter pass.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D115996

Files:
  llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp
  llvm/test/CodeGen/AMDGPU/same-slot-agpr-sgpr.mir


Index: llvm/test/CodeGen/AMDGPU/same-slot-agpr-sgpr.mir
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AMDGPU/same-slot-agpr-sgpr.mir
@@ -0,0 +1,32 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -run-pass=prologepilog -o - %s | FileCheck %s
+
+---
+name: same_slot_agpr_sgpr
+tracksRegLiveness: true
+stack:
+  - { id: 0, name: '', type: spill-slot, offset: 0, size: 8, alignment: 4 }
+machineFunctionInfo:
+  hasSpilledVGPRs: true
+  stackPtrOffsetReg: $sgpr32
+body: |
+  bb.0:
+    ; CHECK-LABEL: name: same_slot_agpr_sgpr
+    ; CHECK: liveins: $agpr0, $agpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: $vgpr0 = IMPLICIT_DEF
+    ; CHECK-NEXT: $agpr1 = V_ACCVGPR_WRITE_B32_e64 killed $vgpr0, implicit $exec
+    ; CHECK-NEXT: $sgpr6_sgpr7 = IMPLICIT_DEF
+    ; CHECK-NEXT: $sgpr0_sgpr1 = S_MOV_B64 $exec
+    ; CHECK-NEXT: $exec = S_MOV_B64 3, implicit-def $vgpr0
+    ; CHECK-NEXT: BUFFER_STORE_DWORD_OFFSET killed $vgpr0, $private_rsrc_reg, $sgpr32, 8, 0, 0, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)
+    ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr6, 0, undef $vgpr0, implicit $sgpr6_sgpr7
+    ; CHECK-NEXT: $vgpr0 = V_WRITELANE_B32 $sgpr7, 1, $vgpr0, implicit killed $sgpr6_sgpr7
+    ; CHECK-NEXT: $agpr1 = V_ACCVGPR_WRITE_B32_e64 killed $vgpr0, implicit $exec
+    ; CHECK-NEXT: $vgpr0 = BUFFER_LOAD_DWORD_OFFSET $private_rsrc_reg, $sgpr32, 8, 0, 0, 0, implicit $exec :: (load (s32) from %stack.1, addrspace 5)
+    ; CHECK-NEXT: $exec = S_MOV_B64 killed $sgpr0_sgpr1, implicit killed $vgpr0
+    $vgpr0 = IMPLICIT_DEF
+    SI_SPILL_AV32_SAVE killed $vgpr0, %stack.0, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.0, addrspace 5)
+    $sgpr6_sgpr7 = IMPLICIT_DEF
+    SI_SPILL_S64_SAVE killed renamable $sgpr6_sgpr7, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s64) into %stack.0, align 4, addrspace 5)
+...
Index: llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp
+++ llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp
@@ -443,10 +443,6 @@
     if (i != FramePointerSaveIndex && i != BasePointerSaveIndex)
       MFI.setStackID(i, TargetStackID::Default);
 
-  for (auto &R : VGPRToAGPRSpills) {
-    if (R.second.FullyAllocated)
-      MFI.RemoveStackObject(R.first);
-  }
 }
 
 int SIMachineFunctionInfo::getScavengeFI(MachineFrameInfo &MFI,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115996.395309.patch
Type: text/x-patch
Size: 2561 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211218/89f3921e/attachment.bin>


More information about the llvm-commits mailing list