[PATCH] D48636: [Sparc] Flush register windows for @llvm.returnaddress(1)
Daniel Cederman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 17 02:19:20 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL340003: [Sparc] Flush register windows for @llvm.returnaddress(1) (authored by dcederman, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D48636?vs=160364&id=161186#toc
Repository:
rL LLVM
https://reviews.llvm.org/D48636
Files:
llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
llvm/trunk/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
Index: llvm/trunk/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
===================================================================
--- llvm/trunk/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
+++ llvm/trunk/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
@@ -96,4 +96,22 @@
ret i8* %0
}
+define i8* @retaddr3() nounwind readnone {
+entry:
+;V8-LABEL: retaddr3:
+;V8: ta 3
+;V8: ld [%fp+60], {{.+}}
+
+;V9-LABEL: retaddr3:
+;V9: flushw
+;V9: ld [%fp+60], {{.+}}
+
+;SPARC64-LABEL: retaddr3
+;SPARC64: flushw
+;SPARC64: ldx [%fp+2167], %[[R0:[goli][0-7]]]
+
+ %0 = tail call i8* @llvm.returnaddress(i32 1)
+ ret i8* %0
+}
+
declare i8* @llvm.returnaddress(i32) nounwind readnone
Index: llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
===================================================================
--- llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
+++ llvm/trunk/lib/Target/Sparc/SparcISelLowering.cpp
@@ -2666,7 +2666,8 @@
}
static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG,
- const SparcSubtarget *Subtarget) {
+ const SparcSubtarget *Subtarget,
+ bool AlwaysFlush = false) {
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
MFI.setFrameAddressIsTaken(true);
@@ -2676,17 +2677,11 @@
unsigned stackBias = Subtarget->getStackPointerBias();
SDValue FrameAddr;
-
- if (depth == 0) {
- FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
- if (Subtarget->is64Bit())
- FrameAddr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
- DAG.getIntPtrConstant(stackBias, dl));
- return FrameAddr;
- }
+ SDValue Chain;
// flush first to make sure the windowed registers' values are in stack
- SDValue Chain = getFLUSHW(Op, DAG);
+ Chain = (depth || AlwaysFlush) ? getFLUSHW(Op, DAG) : DAG.getEntryNode();
+
FrameAddr = DAG.getCopyFromReg(Chain, dl, FrameReg, VT);
unsigned Offset = (Subtarget->is64Bit()) ? (stackBias + 112) : 56;
@@ -2735,7 +2730,7 @@
}
// Need frame address to find return address of the caller.
- SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget);
+ SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget, true);
unsigned Offset = (Subtarget->is64Bit()) ? 120 : 60;
SDValue Ptr = DAG.getNode(ISD::ADD,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48636.161186.patch
Type: text/x-patch
Size: 2381 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180817/1628d66d/attachment.bin>
More information about the llvm-commits
mailing list