[llvm] 2376257 - [SystemZ] Bugfix for backchain with packed-stack

Jonas Paulsson via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 06:04:14 PST 2020


Author: Jonas Paulsson
Date: 2020-03-03T15:03:01+01:00
New Revision: 237625757a1f4a42c2efcf4bb16419a07f74e196

URL: https://github.com/llvm/llvm-project/commit/237625757a1f4a42c2efcf4bb16419a07f74e196
DIFF: https://github.com/llvm/llvm-project/commit/237625757a1f4a42c2efcf4bb16419a07f74e196.diff

LOG: [SystemZ]  Bugfix for backchain with packed-stack

The incoming back chain slot was implicitly allocated whenever a GPR was
saved in SystemZFrameLowering::getRegSpillOffset(), but in cases where no
GPRs were saved/restored this did not take effect.

Review: Ulrich Weigand

Differential Revision: https://reviews.llvm.org/D75367

Added: 
    llvm/test/CodeGen/SystemZ/frame-25.ll

Modified: 
    llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
index 9eeccc25e1e6..0f43ccf63097 100644
--- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
@@ -315,9 +315,10 @@ void SystemZFrameLowering::
 processFunctionBeforeFrameFinalized(MachineFunction &MF,
                                     RegScavenger *RS) const {
   MachineFrameInfo &MFFrame = MF.getFrameInfo();
+  bool BackChain = MF.getFunction().hasFnAttribute("backchain");
 
-  if (!usePackedStack(MF))
-    // Always create the full incoming register save area.
+  if (!usePackedStack(MF) || BackChain)
+    // Create the incoming register save area.
     getOrCreateFramePointerSaveIndex(MF);
 
   // Get the size of our stack frame to be allocated ...

diff  --git a/llvm/test/CodeGen/SystemZ/frame-25.ll b/llvm/test/CodeGen/SystemZ/frame-25.ll
new file mode 100644
index 000000000000..64c175bd4eca
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/frame-25.ll
@@ -0,0 +1,24 @@
+; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
+;
+; Test that space is allocated for the incoming back chain also in cases
+; where no GPRs are saved / restored.
+
+define void @fun0() #0 {
+; CHECK-LABEL: fun0:
+; CHECK: lgr     %r1, %r15
+; CHECK-NEXT: aghi    %r15, -24
+; CHECK-NEXT: stg     %r1, 152(%r15)
+; CHECK-NEXT: #APP
+; CHECK-NEXT: stcke   160(%r15)
+; CHECK-NEXT: #NO_APP
+; CHECK-NEXT: aghi    %r15, 24
+; CHECK-NEXT: br      %r14
+
+entry:
+  %b = alloca [16 x i8], align 1
+  %0 = getelementptr inbounds [16 x i8], [16 x i8]* %b, i64 0, i64 0
+  call void asm "stcke $0", "=*Q"([16 x i8]* nonnull %b) #2
+  ret void
+}
+
+attributes #0 = { nounwind "packed-stack" "backchain" "use-soft-float"="true" }


        


More information about the llvm-commits mailing list