summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStrahinja Petrovic <strahinja.petrovic@rt-rk.com>2018-06-19 13:07:40 +0000
committerStrahinja Petrovic <strahinja.petrovic@rt-rk.com>2018-06-19 13:07:40 +0000
commitbb2b00bb80e0646a78847c7d7a916b69f1010f65 (patch)
treeb352908c2e2c0d45ed33b62011432f7a07c93551
parent3de9664494777f30c1c50f8a8c9cb9b914b476fa (diff)
downloadbcm5719-llvm-bb2b00bb80e0646a78847c7d7a916b69f1010f65.tar.gz
bcm5719-llvm-bb2b00bb80e0646a78847c7d7a916b69f1010f65.zip
[PowerPC] Fix label address calculation for ppc32
This patch fixes calculating address of label on ppc32 (for -fPIC). Differential Revision: https://reviews.llvm.org/D46582 llvm-svn: 335043
-rw-r--r--llvm/lib/Target/PowerPC/PPCISelLowering.cpp7
-rw-r--r--llvm/test/CodeGen/PowerPC/ppc-label.ll44
2 files changed, 48 insertions, 3 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index f845f412130..548876008d0 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -2581,10 +2581,11 @@ SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,
// 64-bit SVR4 ABI code is always position-independent.
// The actual BlockAddress is stored in the TOC.
- if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) {
- setUsesTOCBasePtr(DAG);
+ if (Subtarget.isSVR4ABI() && isPositionIndependent()) {
+ if (Subtarget.isPPC64())
+ setUsesTOCBasePtr(DAG);
SDValue GA = DAG.getTargetBlockAddress(BA, PtrVT, BASDN->getOffset());
- return getTOCEntry(DAG, SDLoc(BASDN), true, GA);
+ return getTOCEntry(DAG, SDLoc(BASDN), Subtarget.isPPC64(), GA);
}
unsigned MOHiFlag, MOLoFlag;
diff --git a/llvm/test/CodeGen/PowerPC/ppc-label.ll b/llvm/test/CodeGen/PowerPC/ppc-label.ll
new file mode 100644
index 00000000000..4a74b8d07c0
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/ppc-label.ll
@@ -0,0 +1,44 @@
+; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -relocation-model=pic | FileCheck %s
+
+; unsigned int foo(void) {
+; return 0;
+; }
+;
+; int main() {
+; L: __attribute__ ((unused));
+; static const unsigned int arr[] =
+; {
+; (unsigned int) &&x - (unsigned int)&&L ,
+; (unsigned int) &&y - (unsigned int)&&L
+; };
+;
+; unsigned int ret = foo();
+; void* g = (void *) ((unsigned int)&&L + arr[ret]);
+; goto *g;
+;
+; x:
+; return 15;
+; y:
+; return 25;
+; }
+
+define i32 @foo() local_unnamed_addr {
+entry:
+ ret i32 0
+}
+
+define i32 @main() {
+entry:
+ br label %L
+
+L: ; preds = %L, %entry
+ indirectbr i8* inttoptr (i32 add (i32 ptrtoint (i8* blockaddress(@main, %L) to i32), i32 sub (i32 ptrtoint (i8* blockaddress(@main, %return) to i32), i32 ptrtoint (i8* blockaddress(@main, %L) to i32))) to i8*), [label %return, label %L]
+
+return: ; preds = %L
+ ret i32 15
+}
+
+
+; CHECK: lwz 3, .LC0-.LTOC(30)
+; CHECK-NOT: li 3, .Ltmp1-.L1$pb@l
+; CHECK-NOT: addis 4, 30, .Ltmp1-.L1$pb@ha \ No newline at end of file
OpenPOWER on IntegriCloud