From e0f7b0e0f704dc3759925602e474b9e669270fcb Mon Sep 17 00:00:00 2001 From: Neumann Hon Date: Wed, 14 Jun 2023 13:20:45 -0400 Subject: [PATCH] [SystemZ][z/OS] Correct value of length/4 of params field in PPA1. The Length/4 of Params field in the PPA1 ought to be the length of the parameters for the current function. Currently we are storing the length of the parameter area in the current function's stack frame, which represents the length of the params of the longest callee in the current function. Differential revision: https://reviews.llvm.org/D119049 Reviewed By: uweigand --- llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 2 +- llvm/lib/Target/SystemZ/SystemZISelLowering.cpp | 1 + llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h | 13 +++++++++++-- llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll | 9 +++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp index 2bfde51..b24eade 100644 --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp @@ -1058,7 +1058,7 @@ void SystemZAsmPrinter::emitPPA1(MCSymbol *FnEndSym) { OutStreamer->AddComment("Length/4 of Parms"); OutStreamer->emitInt16( - static_cast(MFFrame.getMaxCallFrameSize() / 4)); // Parms/4. + static_cast(ZFI->getSizeOfFnParams() / 4)); // Parms/4. OutStreamer->AddComment("Length of Code"); OutStreamer->emitAbsoluteSymbolDiff(FnEndSym, CurrentFnEPMarkerSym, 4); diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp index 643b529..c50e939 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -1505,6 +1505,7 @@ SDValue SystemZTargetLowering::LowerFormalArguments( SmallVector ArgLocs; SystemZCCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext()); CCInfo.AnalyzeFormalArguments(Ins, CC_SystemZ); + FuncInfo->setSizeOfFnParams(CCInfo.getStackSize()); unsigned NumFixedGPRs = 0; unsigned NumFixedFPRs = 0; diff --git a/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h b/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h index 3331959..7a0802a 100644 --- a/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h +++ b/llvm/lib/Target/SystemZ/SystemZMachineFunctionInfo.h @@ -27,6 +27,9 @@ struct GPRRegs { class SystemZMachineFunctionInfo : public MachineFunctionInfo { virtual void anchor(); + /// Size of expected parameter area for current function. (Fixed args only). + unsigned SizeOfFnParams; + SystemZ::GPRRegs SpillGPRRegs; SystemZ::GPRRegs RestoreGPRRegs; Register VarArgsFirstGPR; @@ -38,14 +41,20 @@ class SystemZMachineFunctionInfo : public MachineFunctionInfo { public: SystemZMachineFunctionInfo(const Function &F, const TargetSubtargetInfo *STI) - : VarArgsFirstGPR(0), VarArgsFirstFPR(0), VarArgsFrameIndex(0), - RegSaveFrameIndex(0), FramePointerSaveIndex(0), NumLocalDynamics(0) {} + : SizeOfFnParams(0), VarArgsFirstGPR(0), VarArgsFirstFPR(0), + VarArgsFrameIndex(0), RegSaveFrameIndex(0), FramePointerSaveIndex(0), + NumLocalDynamics(0) {} MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap &Src2DstMBB) const override; + // z/OS: Get and set the size of the expected parameter area for the + // current function. (ie. Size of param area in caller). + unsigned getSizeOfFnParams() const { return SizeOfFnParams; } + void setSizeOfFnParams(unsigned Size) { SizeOfFnParams = Size; } + // Get and set the first and last call-saved GPR that should be saved by // this function and the SP offset for the STMG. These are 0 if no GPRs // need to be saved or restored. diff --git a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll index 13224c0..6b8c3bf 100644 --- a/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll +++ b/llvm/test/CodeGen/SystemZ/zos-prologue-epilog.ll @@ -14,6 +14,9 @@ ; CHECK64: lg 7, 2072(4) ; CHECK64: aghi 4, 192 ; CHECK64: b 2(7) + +; CHECK64: @@PPA1_func0_0: +; CHECK64: .short 0 * Length/4 of Parms define void @func0() { call i64 (i64) @fun(i64 10) ret void @@ -27,6 +30,9 @@ define void @func0() { ; CHECK64: lmg 7, 15, 2072(4) ; CHECK64: aghi 4, 160 ; CHECK64: b 2(7) + +; CHECK64: @@PPA1_func1_0: +; CHECK64: .short 2 * Length/4 of Parms define void @func1(ptr %ptr) { %l01 = load volatile i64, ptr %ptr %l02 = load volatile i64, ptr %ptr @@ -338,6 +344,9 @@ define void @large_stack0() { ; CHECK64: @BB7_2: ; CHECK64: stmg 6, 7, 2064(4) ; CHECK64: lgr 3, 0 + +; CHECK64: @@PPA1_large_stack1_0: +; CHECK64: .short 6 * Length/4 of Parms define void @large_stack1(i64 %n1, i64 %n2, i64 %n3) { %arr = alloca [131072 x i64], align 8 call i64 (ptr, i64, i64, i64) @fun3(ptr %arr, -- 2.7.4