[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