diff options
author | Hal Finkel <hfinkel@anl.gov> | 2014-12-23 09:45:06 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2014-12-23 09:45:06 +0000 |
commit | 6e27c6d4501c00fbe363c7d1fc7fd79344c8a8fb (patch) | |
tree | 4107a42351026ad52fcff015c7371273bcaf4e20 /llvm/test | |
parent | 3121449f0bccb61920568efd9bc60023ff3eb93e (diff) | |
download | bcm5719-llvm-6e27c6d4501c00fbe363c7d1fc7fd79344c8a8fb.tar.gz bcm5719-llvm-6e27c6d4501c00fbe363c7d1fc7fd79344c8a8fb.zip |
[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.
llvm-svn: 224761
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/PowerPC/retaddr2.ll | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/retaddr2.ll b/llvm/test/CodeGen/PowerPC/retaddr2.ll new file mode 100644 index 00000000000..8fa3b4d13b7 --- /dev/null +++ b/llvm/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 } + |