[llvm] r209638 - [PPC] Use alias symbols in address computation.

Hal Finkel hfinkel at anl.gov
Wed May 28 08:42:24 PDT 2014


----- Original Message -----
> From: "Rafael Espindola" <rafael.espindola at gmail.com>
> To: llvm-commits at cs.uiuc.edu
> Sent: Monday, May 26, 2014 2:08:20 PM
> Subject: [llvm] r209638 - [PPC] Use alias symbols in address computation.
> 
> Author: rafael
> Date: Mon May 26 14:08:19 2014
> New Revision: 209638
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=209638&view=rev
> Log:
> [PPC] Use alias symbols in address computation.
> 
> This seems to match what gcc does for ppc and what every other llvm
> backend does.

Unfortunately, this turns out not to be such a good idea... it completely breaks self-hosting on ppc64/Linux (we can't even compile a TableGen that doesn't segfault)). I've reverted this for now.

 -Hal

> 
> Added:
>     llvm/trunk/test/CodeGen/PowerPC/alias.ll
> Modified:
>     llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
>     llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
> 
> Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=209638&r1=209637&r2=209638&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon May 26
> 14:08:19 2014
> @@ -380,15 +380,12 @@ void PPCAsmPrinter::EmitInstruction(cons
>      bool IsAvailExt = false;
>  
>      if (MO.isGlobal()) {
> -      const GlobalValue *GValue = MO.getGlobal();
> -      const GlobalAlias *GAlias = dyn_cast<GlobalAlias>(GValue);
> -      const GlobalValue *RealGValue = GAlias ? GAlias->getAliasee()
> : GValue;
> -      MOSymbol = getSymbol(RealGValue);
> -      const GlobalVariable *GVar =
> dyn_cast<GlobalVariable>(RealGValue);
> -      IsExternal = GVar && !GVar->hasInitializer();
> -      IsCommon = GVar && RealGValue->hasCommonLinkage();
> -      IsFunction = !GVar;
> -      IsAvailExt = GVar &&
> RealGValue->hasAvailableExternallyLinkage();
> +      const GlobalValue *GV = MO.getGlobal();
> +      MOSymbol = getSymbol(GV);
> +      IsExternal = GV->isDeclaration();
> +      IsCommon = GV->hasCommonLinkage();
> +      IsFunction = GV->getType()->getElementType()->isFunctionTy();
> +      IsAvailExt = GV->hasAvailableExternallyLinkage();
>      } else if (MO.isCPI())
>        MOSymbol = GetCPISymbol(MO.getIndex());
>      else if (MO.isJTI())
> @@ -427,13 +424,9 @@ void PPCAsmPrinter::EmitInstruction(cons
>      }
>      else if (MO.isGlobal()) {
>        const GlobalValue *GValue = MO.getGlobal();
> -      const GlobalAlias *GAlias = dyn_cast<GlobalAlias>(GValue);
> -      const GlobalValue *RealGValue = GAlias ? GAlias->getAliasee()
> : GValue;
> -      MOSymbol = getSymbol(RealGValue);
> -      const GlobalVariable *GVar =
> dyn_cast<GlobalVariable>(RealGValue);
> -
> -      if (!GVar || !GVar->hasInitializer() ||
> RealGValue->hasCommonLinkage() ||
> -          RealGValue->hasAvailableExternallyLinkage() ||
> +      MOSymbol = getSymbol(GValue);
> +      if (GValue->isDeclaration() || GValue->hasCommonLinkage() ||
> +          GValue->hasAvailableExternallyLinkage() ||
>            TM.getCodeModel() == CodeModel::Large)
>          MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
>      }
> @@ -460,13 +453,10 @@ void PPCAsmPrinter::EmitInstruction(cons
>      bool IsFunction = false;
>  
>      if (MO.isGlobal()) {
> -      const GlobalValue *GValue = MO.getGlobal();
> -      const GlobalAlias *GAlias = dyn_cast<GlobalAlias>(GValue);
> -      const GlobalValue *RealGValue = GAlias ? GAlias->getAliasee()
> : GValue;
> -      MOSymbol = getSymbol(RealGValue);
> -      const GlobalVariable *GVar =
> dyn_cast<GlobalVariable>(RealGValue);
> -      IsExternal = GVar && !GVar->hasInitializer();
> -      IsFunction = !GVar;
> +      const GlobalValue *GV = MO.getGlobal();
> +      MOSymbol = getSymbol(GV);
> +      IsExternal = GV->isDeclaration();
> +      IsFunction = GV->getType()->getElementType()->isFunctionTy();
>      } else if (MO.isCPI())
>        MOSymbol = GetCPISymbol(MO.getIndex());
>  
> 
> Modified: llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp?rev=209638&r1=209637&r2=209638&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon May 26
> 14:08:19 2014
> @@ -1472,17 +1472,8 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *
>  
>      if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(GA))
>      {
>        const GlobalValue *GValue = G->getGlobal();
> -      const GlobalAlias *GAlias = dyn_cast<GlobalAlias>(GValue);
> -      const GlobalValue *RealGValue = GAlias ? GAlias->getAliasee()
> : GValue;
> -      const GlobalVariable *GVar =
> dyn_cast<GlobalVariable>(RealGValue);
> -      assert((GVar || isa<Function>(RealGValue)) &&
> -             "Unexpected global value subclass!");
> -
> -      // An external variable is one without an initializer.  For
> these,
> -      // for variables with common linkage, and for Functions,
> generate
> -      // the LDtocL form.
> -      if (!GVar || !GVar->hasInitializer() ||
> RealGValue->hasCommonLinkage() ||
> -          RealGValue->hasAvailableExternallyLinkage())
> +      if (GValue->isDeclaration() || GValue->hasCommonLinkage() ||
> +        GValue->hasAvailableExternallyLinkage())
>          return CurDAG->getMachineNode(PPC::LDtocL, dl, MVT::i64, GA,
>                                        SDValue(Tmp, 0));
>      }
> 
> Added: llvm/trunk/test/CodeGen/PowerPC/alias.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/alias.ll?rev=209638&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/alias.ll (added)
> +++ llvm/trunk/test/CodeGen/PowerPC/alias.ll Mon May 26 14:08:19 2014
> @@ -0,0 +1,31 @@
> +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu
> -code-model=medium| FileCheck --check-prefix=CHECK
> --check-prefix=MEDIUM %s
> +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu
> -code-model=large | FileCheck --check-prefix=CHECK
> --check-prefix=LARGE %s
> +
> + at foo = global i32 42
> + at fooa = alias i32* @foo
> +
> + at foo2 = global i64 42
> + at foo2a = alias i64* @foo2
> +
> +; CHECK-LABEL: bar:
> +define i32 @bar() {
> +; MEDIUM: addis 3, 2, fooa at toc@ha
> +; LARGE: addis 3, 2, .LC1 at toc@ha
> +  %a = load i32* @fooa
> +  ret i32 %a
> +}
> +
> +; CHECK-LABEL: bar2:
> +define i64 @bar2() {
> +; MEDIUM: addis 3, 2, foo2a at toc@ha
> +; MEDIUM: addi 3, 3, foo2a at toc@l
> +; LARGE: addis 3, 2, .LC3 at toc@ha
> +  %a = load i64* @foo2a
> +  ret i64 %a
> +}
> +
> +; LARGE: .LC1:
> +; LARGE-NEXT: .tc fooa[TC],fooa
> +
> +; LARGE: .LC3:
> +; LARGE-NEXT: .tc foo2a[TC],foo2a
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list