From f9eee9f1c72205fbd4701c9adcb68bf43638c04a Mon Sep 17 00:00:00 2001 From: Strahinja Petrovic Date: Tue, 19 Jun 2018 13:07:40 +0000 Subject: [PATCH] [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 --- lib/Target/PowerPC/PPCISelLowering.cpp | 7 ++-- test/CodeGen/PowerPC/ppc-label.ll | 44 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/PowerPC/ppc-label.ll diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index f845f412130..548876008d0 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/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/test/CodeGen/PowerPC/ppc-label.ll b/test/CodeGen/PowerPC/ppc-label.ll new file mode 100644 index 00000000000..4a74b8d07c0 --- /dev/null +++ b/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