Skip to content

Commit 6972265

Browse files
committed
[VE] Support FRAMEADDR
Implement FRAMEADDR for VE. Add a regression test also. Reviewed By: simoll Differential Revision: https://reviews.llvm.org/D93295
1 parent 2a2268a commit 6972265

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Target/VE/VEISelLowering.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,6 +1489,27 @@ SDValue VETargetLowering::lowerDYNAMIC_STACKALLOC(SDValue Op,
14891489
return DAG.getMergeValues(Ops, DL);
14901490
}
14911491

1492+
static SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG,
1493+
const VETargetLowering &TLI,
1494+
const VESubtarget *Subtarget) {
1495+
SDLoc DL(Op);
1496+
MachineFunction &MF = DAG.getMachineFunction();
1497+
EVT PtrVT = TLI.getPointerTy(MF.getDataLayout());
1498+
1499+
MachineFrameInfo &MFI = MF.getFrameInfo();
1500+
MFI.setFrameAddressIsTaken(true);
1501+
1502+
unsigned Depth = Op.getConstantOperandVal(0);
1503+
const VERegisterInfo *RegInfo = Subtarget->getRegisterInfo();
1504+
unsigned FrameReg = RegInfo->getFrameRegister(MF);
1505+
SDValue FrameAddr =
1506+
DAG.getCopyFromReg(DAG.getEntryNode(), DL, FrameReg, PtrVT);
1507+
while (Depth--)
1508+
FrameAddr = DAG.getLoad(Op.getValueType(), DL, DAG.getEntryNode(),
1509+
FrameAddr, MachinePointerInfo());
1510+
return FrameAddr;
1511+
}
1512+
14921513
static SDValue getSplatValue(SDNode *N) {
14931514
if (auto *BuildVec = dyn_cast<BuildVectorSDNode>(N)) {
14941515
return BuildVec->getSplatValue();
@@ -1529,6 +1550,8 @@ SDValue VETargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
15291550
return lowerConstantPool(Op, DAG);
15301551
case ISD::DYNAMIC_STACKALLOC:
15311552
return lowerDYNAMIC_STACKALLOC(Op, DAG);
1553+
case ISD::FRAMEADDR:
1554+
return lowerFRAMEADDR(Op, DAG, *this, Subtarget);
15321555
case ISD::GlobalAddress:
15331556
return lowerGlobalAddress(Op, DAG);
15341557
case ISD::GlobalTLSAddress:
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
; RUN: llc < %s -mtriple=ve | FileCheck %s
2+
3+
define i8* @test1() nounwind {
4+
; CHECK-LABEL: test1:
5+
; CHECK: .LBB{{[0-9]+}}_2:
6+
; CHECK-NEXT: or %s0, 0, %s9
7+
; CHECK-NEXT: or %s11, 0, %s9
8+
entry:
9+
%ret = tail call i8* @llvm.frameaddress(i32 0)
10+
ret i8* %ret
11+
}
12+
13+
define i8* @test2() nounwind {
14+
; CHECK-LABEL: test2:
15+
; CHECK: .LBB{{[0-9]+}}_2:
16+
; CHECK-NEXT: ld %s0, (, %s9)
17+
; CHECK-NEXT: ld %s0, (, %s0)
18+
; CHECK-NEXT: or %s11, 0, %s9
19+
entry:
20+
%ret = tail call i8* @llvm.frameaddress(i32 2)
21+
ret i8* %ret
22+
}
23+
24+
declare i8* @llvm.frameaddress(i32) nounwind readnone

0 commit comments

Comments
 (0)