[llvm] r335043 - [PowerPC] Fix label address calculation for ppc32

Strahinja Petrovic via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 19 06:07:41 PDT 2018


Author: spetrovic
Date: Tue Jun 19 06:07:40 2018
New Revision: 335043

URL: http://llvm.org/viewvc/llvm-project?rev=335043&view=rev
Log:
[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

Added:
    llvm/trunk/test/CodeGen/PowerPC/ppc-label.ll
Modified:
    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp

Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=335043&r1=335042&r2=335043&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Tue Jun 19 06:07:40 2018
@@ -2581,10 +2581,11 @@ SDValue PPCTargetLowering::LowerBlockAdd
 
   // 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;

Added: llvm/trunk/test/CodeGen/PowerPC/ppc-label.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/ppc-label.ll?rev=335043&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/ppc-label.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/ppc-label.ll Tue Jun 19 06:07:40 2018
@@ -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 at l
+; CHECK-NOT: addis 4, 30, .Ltmp1-.L1$pb at ha
\ No newline at end of file




More information about the llvm-commits mailing list