Author: Jonas Paulsson Date: 2020-12-14T12:39:38-06:00 New Revision: 653b97690f0d5c26a93002fb94ddd86397ed6c1c
URL: https://github.com/llvm/llvm-project/commit/653b97690f0d5c26a93002fb94ddd86397ed6c1c DIFF: https://github.com/llvm/llvm-project/commit/653b97690f0d5c26a93002fb94ddd86397ed6c1c.diff LOG: [SystemZ] Improve handling of backchain offset. - New function SDValue getBackchainAddress() used by lowerDYNAMIC_STACKALLOC() and lowerSTACKRESTORE() to properly handle the backchain offset also with packed-stack. - Make a common function getBackchainOffset() for the computation of the backchain offset and use in some places (NFC). Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D93171 Added: Modified: llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp llvm/lib/Target/SystemZ/SystemZFrameLowering.h llvm/lib/Target/SystemZ/SystemZISelLowering.cpp llvm/lib/Target/SystemZ/SystemZISelLowering.h llvm/test/CodeGen/SystemZ/backchain.ll Removed: ################################################################################ diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp index d9e030de5af8..994f471b75b1 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp @@ -511,13 +511,10 @@ void SystemZFrameLowering::emitPrologue(MachineFunction &MF, .addReg(SystemZ::R1D, RegState::Define).addReg(SystemZ::R15D); emitIncrement(MBB, MBBI, DL, SystemZ::R15D, Delta, ZII); buildCFAOffs(MBB, MBBI, DL, SPOffsetFromCFA + Delta, ZII); - if (StoreBackchain) { - // The back chain is stored topmost with packed-stack. - int Offset = usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0; + if (StoreBackchain) BuildMI(MBB, MBBI, DL, ZII->get(SystemZ::STG)) .addReg(SystemZ::R1D, RegState::Kill).addReg(SystemZ::R15D) - .addImm(Offset).addReg(0); - } + .addImm(getBackchainOffset(MF)).addReg(0); } SPOffsetFromCFA += Delta; } @@ -709,13 +706,10 @@ void SystemZFrameLowering::inlineStackProbe(MachineFunction &MF, if (Residual) allocateAndProbe(*MBB, MBBI, Residual, true/*EmitCFI*/); - if (StoreBackchain) { - // The back chain is stored topmost with packed-stack. - int Offset = usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0; + if (StoreBackchain) BuildMI(*MBB, MBBI, DL, ZII->get(SystemZ::STG)) .addReg(SystemZ::R1D, RegState::Kill).addReg(SystemZ::R15D) - .addImm(Offset).addReg(0); - } + .addImm(getBackchainOffset(MF)).addReg(0); StackAllocMI->eraseFromParent(); if (DoneMBB != nullptr) { @@ -790,8 +784,7 @@ getOrCreateFramePointerSaveIndex(MachineFunction &MF) const { int FI = ZFI->getFramePointerSaveIndex(); if (!FI) { MachineFrameInfo &MFFrame = MF.getFrameInfo(); - // The back chain is stored topmost with packed-stack. - int Offset = usePackedStack(MF) ? -8 : -SystemZMC::CallFrameSize; + int Offset = getBackchainOffset(MF) - SystemZMC::CallFrameSize; FI = MFFrame.CreateFixedObject(8, Offset, false); ZFI->setFramePointerSaveIndex(FI); } diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.h b/llvm/lib/Target/SystemZ/SystemZFrameLowering.h index 001d26d4d3bb..085c31ca0f18 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.h +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H #define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZFRAMELOWERING_H +#include "MCTargetDesc/SystemZMCTargetDesc.h" #include "llvm/ADT/IndexedMap.h" #include "llvm/CodeGen/TargetFrameLowering.h" #include "llvm/Support/TypeSize.h" @@ -63,6 +64,12 @@ class SystemZFrameLowering : public TargetFrameLowering { int getOrCreateFramePointerSaveIndex(MachineFunction &MF) const; bool usePackedStack(MachineFunction &MF) const; + + // Return the offset of the backchain. + unsigned getBackchainOffset(MachineFunction &MF) const { + // The back chain is stored topmost with packed-stack. + return usePackedStack(MF) ? SystemZMC::CallFrameSize - 8 : 0; + } }; } // end namespace llvm diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp index 812fe80864ac..663af1d64943 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -3435,7 +3435,8 @@ lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const { // If we need a backchain, save it now. SDValue Backchain; if (StoreBackchain) - Backchain = DAG.getLoad(MVT::i64, DL, Chain, OldSP, MachinePointerInfo()); + Backchain = DAG.getLoad(MVT::i64, DL, Chain, getBackchainAddress(OldSP, DAG), + MachinePointerInfo()); // Add extra space for alignment if needed. if (ExtraAlignSpace) @@ -3472,7 +3473,8 @@ lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const { } if (StoreBackchain) - Chain = DAG.getStore(Chain, DL, Backchain, NewSP, MachinePointerInfo()); + Chain = DAG.getStore(Chain, DL, Backchain, getBackchainAddress(NewSP, DAG), + MachinePointerInfo()); SDValue Ops[2] = { Result, Chain }; return DAG.getMergeValues(Ops, DL); @@ -4095,13 +4097,15 @@ SDValue SystemZTargetLowering::lowerSTACKRESTORE(SDValue Op, if (StoreBackchain) { SDValue OldSP = DAG.getCopyFromReg(Chain, DL, SystemZ::R15D, MVT::i64); - Backchain = DAG.getLoad(MVT::i64, DL, Chain, OldSP, MachinePointerInfo()); + Backchain = DAG.getLoad(MVT::i64, DL, Chain, getBackchainAddress(OldSP, DAG), + MachinePointerInfo()); } Chain = DAG.getCopyToReg(Chain, DL, SystemZ::R15D, NewSP); if (StoreBackchain) - Chain = DAG.getStore(Chain, DL, Backchain, NewSP, MachinePointerInfo()); + Chain = DAG.getStore(Chain, DL, Backchain, getBackchainAddress(NewSP, DAG), + MachinePointerInfo()); return Chain; } @@ -8144,6 +8148,16 @@ MachineBasicBlock *SystemZTargetLowering::emitProbedAlloca( return DoneMBB; } +SDValue SystemZTargetLowering:: +getBackchainAddress(SDValue SP, SelectionDAG &DAG) const { + MachineFunction &MF = DAG.getMachineFunction(); + auto *TFL = + static_cast<const SystemZFrameLowering *>(Subtarget.getFrameLowering()); + SDLoc DL(SP); + return DAG.getNode(ISD::ADD, DL, MVT::i64, SP, + DAG.getIntPtrConstant(TFL->getBackchainOffset(MF), DL)); +} + MachineBasicBlock *SystemZTargetLowering::EmitInstrWithCustomInserter( MachineInstr &MI, MachineBasicBlock *MBB) const { switch (MI.getOpcode()) { diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.h b/llvm/lib/Target/SystemZ/SystemZISelLowering.h index 1ab6366ec016..955587da626f 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.h +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.h @@ -698,6 +698,8 @@ class SystemZTargetLowering : public TargetLowering { MachineBasicBlock *emitProbedAlloca(MachineInstr &MI, MachineBasicBlock *MBB) const; + SDValue getBackchainAddress(SDValue SP, SelectionDAG &DAG) const; + MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const override; const TargetRegisterClass *getRepRegClassFor(MVT VT) const override; diff --git a/llvm/test/CodeGen/SystemZ/backchain.ll b/llvm/test/CodeGen/SystemZ/backchain.ll index c7c9d03b838a..b295c75c1072 100644 --- a/llvm/test/CodeGen/SystemZ/backchain.ll +++ b/llvm/test/CodeGen/SystemZ/backchain.ll @@ -82,3 +82,36 @@ define void @f5(i32 %count1, i32 %count2) "backchain" { store volatile i8 0, i8 *%array2 ret void } + +; same, but with the kernel backchain +define void @f6(i32 %count1, i32 %count2) #0 { +; CHECK-LABEL: f6: +; CHECK: stmg %r11, %r15, 112(%r15) +; CHECK: lgr %r1, %r15 +; CHECK: aghi %r15, -48 +; CHECK: stg %r1, 152(%r15) +; CHECK: lgr %r11, %r15 +; CHECK-DAG: lgr [[SAVESP:%r[0-9]+]], %r15 +; CHECK-DAG: lg [[BC:%r[0-9]+]], 152(%r15) +; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r15 +; CHECK-DAG: lgr %r15, [[NEWSP]] +; CHECK-DAG: stg [[BC]], 152([[NEWSP]]) +; CHECK-DAG: lg [[BC2:%r[0-9]+]], 152(%r15) +; CHECK-DAG: lgr %r15, [[SAVESP]] +; CHECK-DAG: stg [[BC2]], 152([[SAVESP]]) +; CHECK-DAG: lg [[BC3:%r[0-9]+]], 152(%r15) +; CHECK-DAG: lgr [[NEWSP2:%r[0-9]+]], %r15 +; CHECK-DAG: lgr %r15, [[NEWSP2]] +; CHECK-DAG: stg [[BC3]], 152([[NEWSP2]]) +; CHECK: lmg %r11, %r15, 160(%r11) +; CHECK: br %r14 + %src = call i8 *@llvm.stacksave() + %array1 = alloca i8, i32 %count1 + store volatile i8 0, i8 *%array1 + call void @llvm.stackrestore(i8 *%src) + %array2 = alloca i8, i32 %count2 + store volatile i8 0, i8 *%array2 + ret void +} + +attributes #0 = { "backchain" "packed-stack" "use-soft-float"="true" } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits