Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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
  • Loading branch information
JonPsson committed Dec 14, 2020
1 parent 5f53d28 commit 653b976
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 16 deletions.
17 changes: 5 additions & 12 deletions llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZFrameLowering.h
Expand Up @@ -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"
Expand Down Expand Up @@ -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

Expand Down
22 changes: 18 additions & 4 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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()) {
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.h
Expand Up @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/CodeGen/SystemZ/backchain.ll
Expand Up @@ -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" }

0 comments on commit 653b976

Please sign in to comment.