diff options
-rw-r--r-- | llvm/lib/Target/Sparc/SparcISelLowering.cpp | 17 | ||||
-rw-r--r-- | llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll | 18 |
2 files changed, 24 insertions, 11 deletions
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp index b04c6b11268..9a4f67e0ee8 100644 --- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp +++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp @@ -2666,7 +2666,8 @@ static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG) { } 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 @@ static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG, 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 @@ static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, } // 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, diff --git a/llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll b/llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll index 0d0ce0e28cb..1c55966e6dd 100644 --- a/llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll +++ b/llvm/test/CodeGen/SPARC/2011-01-11-FrameAddr.ll @@ -96,4 +96,22 @@ entry: 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 |