[llvm] r323810 - [AArch64] Properly handle dllimport of variables when using fast-isel

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 31 00:59:33 PST 2018


Merged to 6.0 in r323852.

On Tue, Jan 30, 2018 at 8:50 PM, Martin Storsjo via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: mstorsjo
> Date: Tue Jan 30 11:50:51 2018
> New Revision: 323810
>
> URL: http://llvm.org/viewvc/llvm-project?rev=323810&view=rev
> Log:
> [AArch64] Properly handle dllimport of variables when using fast-isel
>
> Differential Revision: https://reviews.llvm.org/D42567
>
> Modified:
>     llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
>     llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp
>     llvm/trunk/test/CodeGen/AArch64/dllimport.ll
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/
> AArch64/AArch64FastISel.cpp?rev=323810&r1=323809&r2=323810&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Tue Jan 30 11:50:51
> 2018
> @@ -476,26 +476,27 @@ unsigned AArch64FastISel::materializeGV(
>      // ADRP + LDRX
>      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
> TII.get(AArch64::ADRP),
>              ADRPReg)
> -      .addGlobalAddress(GV, 0, AArch64II::MO_GOT | AArch64II::MO_PAGE);
> +        .addGlobalAddress(GV, 0, AArch64II::MO_PAGE | OpFlags);
>
>      ResultReg = createResultReg(&AArch64::GPR64RegClass);
>      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
> TII.get(AArch64::LDRXui),
>              ResultReg)
> -      .addReg(ADRPReg)
> -      .addGlobalAddress(GV, 0, AArch64II::MO_GOT | AArch64II::MO_PAGEOFF |
> -                        AArch64II::MO_NC);
> +        .addReg(ADRPReg)
> +        .addGlobalAddress(GV, 0,
> +                          AArch64II::MO_PAGEOFF | AArch64II::MO_NC |
> OpFlags);
>    } else {
>      // ADRP + ADDX
>      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
> TII.get(AArch64::ADRP),
>              ADRPReg)
> -      .addGlobalAddress(GV, 0, AArch64II::MO_PAGE);
> +        .addGlobalAddress(GV, 0, AArch64II::MO_PAGE | OpFlags);
>
>      ResultReg = createResultReg(&AArch64::GPR64spRegClass);
>      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
> TII.get(AArch64::ADDXri),
>              ResultReg)
> -      .addReg(ADRPReg)
> -      .addGlobalAddress(GV, 0, AArch64II::MO_PAGEOFF | AArch64II::MO_NC)
> -      .addImm(0);
> +        .addReg(ADRPReg)
> +        .addGlobalAddress(GV, 0,
> +                          AArch64II::MO_PAGEOFF | AArch64II::MO_NC |
> OpFlags)
> +        .addImm(0);
>    }
>    return ResultReg;
>  }
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/
> AArch64/AArch64Subtarget.cpp?rev=323810&r1=323809&r2=323810&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp Tue Jan 30
> 11:50:51 2018
> @@ -195,15 +195,18 @@ AArch64Subtarget::ClassifyGlobalReferenc
>    if (TM.getCodeModel() == CodeModel::Large && isTargetMachO())
>      return AArch64II::MO_GOT;
>
> +  unsigned Flags = GV->hasDLLImportStorageClass() ?
> AArch64II::MO_DLLIMPORT
> +                                                  : AArch64II::MO_NO_FLAG;
> +
>    if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV))
> -    return AArch64II::MO_GOT;
> +    return AArch64II::MO_GOT | Flags;
>
>    // The small code model's direct accesses use ADRP, which cannot
>    // necessarily produce the value 0 (if the code is above 4GB).
>    if (useSmallAddressing() && GV->hasExternalWeakLinkage())
> -    return AArch64II::MO_GOT;
> +    return AArch64II::MO_GOT | Flags;
>
> -  return AArch64II::MO_NO_FLAG;
> +  return Flags;
>  }
>
>  unsigned char AArch64Subtarget::classifyGlobalFunctionReference(
>
> Modified: llvm/trunk/test/CodeGen/AArch64/dllimport.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> CodeGen/AArch64/dllimport.ll?rev=323810&r1=323809&r2=323810&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/CodeGen/AArch64/dllimport.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/dllimport.ll Tue Jan 30 11:50:51 2018
> @@ -1,4 +1,5 @@
> -; RUN: llc -mtriple aarch64-unknown-windows-msvc -filetype asm -o - %s |
> FileCheck %s
> +; RUN: llc -mtriple aarch64-unknown-windows-msvc -filetype asm -o - %s |
> FileCheck %s -check-prefixes=CHECK,DAG-ISEL
> +; RUN: llc -mtriple aarch64-unknown-windows-msvc -fast-isel -filetype asm
> -o - %s | FileCheck %s -check-prefixes=CHECK,FAST-ISEL
>
>  @var = external dllimport global i32
>  @ext = external global i32
> @@ -23,7 +24,9 @@ define i32 @get_ext() {
>
>  ; CHECK-LABEL: get_ext
>  ; CHECK: adrp x8, ext
> -; CHECK: ldr w0, [x8, ext]
> +; DAG-ISEL: ldr w0, [x8, ext]
> +; FAST-ISEL: add x8, x8, ext
> +; FAST-ISEL: ldr w0, [x8]
>  ; CHECK: ret
>
>  define i32* @get_var_pointer() {
> @@ -31,8 +34,8 @@ define i32* @get_var_pointer() {
>  }
>
>  ; CHECK-LABEL: get_var_pointer
> -; CHECK: adrp x0, __imp_var
> -; CHECK: ldr x0, [x0, __imp_var]
> +; CHECK: adrp [[REG1:x[0-9]+]], __imp_var
> +; CHECK: ldr {{x[0-9]+}}, {{\[}}[[REG1]], __imp_var]
>  ; CHECK: ret
>
>  define i32 @call_external() {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180131/717d24d7/attachment.html>


More information about the llvm-commits mailing list