From: Hal Finkel Date: Tue, 23 Dec 2014 09:45:06 +0000 (+0000) Subject: [PowerPC] Don't mark the return-address slot as immutable X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2bea9472076899721460b7aa106de2f6e21cef58;p=oota-llvm.git [PowerPC] Don't mark the return-address slot as immutable It is tempting to mark the fixed stack slot used to store the return address as immutable when lowering @llvm.returnaddress(i32 0). Unfortunately, within the function, it is not completely immutable: it is written during the function prologue. When using post-RA instruction scheduling, the prologue instructions are available for scheduling, and we're not free to interchange the order of a particular store in the prologue with loads from that stack location. Fixes PR21976. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224761 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 18384627ced..06cf9af80b6 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -5164,7 +5164,7 @@ PPCTargetLowering::getReturnAddrFrameIndex(SelectionDAG & DAG) const { // Find out what the fix offset of the frame pointer save area. int LROffset = PPCFrameLowering::getReturnSaveOffset(isPPC64, isDarwinABI); // Allocate the frame index for frame pointer save area. - RASI = MF.getFrameInfo()->CreateFixedObject(isPPC64? 8 : 4, LROffset, true); + RASI = MF.getFrameInfo()->CreateFixedObject(isPPC64? 8 : 4, LROffset, false); // Save the result. FI->setReturnAddrSaveIndex(RASI); } diff --git a/test/CodeGen/PowerPC/retaddr2.ll b/test/CodeGen/PowerPC/retaddr2.ll new file mode 100644 index 00000000000..8fa3b4d13b7 --- /dev/null +++ b/test/CodeGen/PowerPC/retaddr2.ll @@ -0,0 +1,25 @@ +; RUN: llc -mcpu=pwr7 < %s | FileCheck %s +target datalayout = "E-m:e-i64:64-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +; Function Attrs: nounwind readnone +define i8* @test1() #0 { +entry: + %0 = tail call i8* @llvm.returnaddress(i32 0) + ret i8* %0 +} + +; CHECK-LABEL: @test1 +; CHECK: mflr 0 +; CHECK: std 0, 16(1) +; FIXME: These next two lines don't both need to load the same value. +; CHECK-DAG: ld 3, 16(1) +; CHECK-DAG: ld 0, 16(1) +; CHECK: mtlr 0 +; CHECK: blr + +; Function Attrs: nounwind readnone +declare i8* @llvm.returnaddress(i32) #0 + +attributes #0 = { nounwind readnone } +