Index: lib/Target/Sparc/SparcISelLowering.cpp =================================================================== --- lib/Target/Sparc/SparcISelLowering.cpp +++ lib/Target/Sparc/SparcISelLowering.cpp @@ -2730,6 +2730,8 @@ return RetAddr; } + SDValue Chain = getFLUSHW(Op, DAG); + // Need frame address to find return address of the caller. SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget); @@ -2738,7 +2740,7 @@ dl, VT, FrameAddr, DAG.getIntPtrConstant(Offset, dl)); - RetAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), Ptr, MachinePointerInfo()); + RetAddr = DAG.getLoad(VT, dl, Chain, Ptr, MachinePointerInfo()); return RetAddr; } Index: test/CodeGen/SPARC/2011-01-11-FrameAddr.ll =================================================================== --- test/CodeGen/SPARC/2011-01-11-FrameAddr.ll +++ 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