[PATCH] D75367: [SystemZ] Bugfix for backchain with packed-stack

Jonas Paulsson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 28 10:14:34 PST 2020


jonpa created this revision.
jonpa added a reviewer: uweigand.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

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.


https://reviews.llvm.org/D75367

Files:
  llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
  llvm/test/CodeGen/SystemZ/frame-25.ll


Index: llvm/test/CodeGen/SystemZ/frame-25.ll
===================================================================
--- /dev/null
+++ 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" }
Index: llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
===================================================================
--- llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
+++ llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
@@ -317,9 +317,10 @@
 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 ...


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75367.247302.patch
Type: text/x-patch
Size: 1687 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200228/6df4198f/attachment.bin>


More information about the llvm-commits mailing list