From fe7c59adb8fd3b89e2b8379a5e16cf4fac68930f Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Tue, 13 Dec 2016 18:25:38 +0000 Subject: [PATCH] GlobalISel: fix GOT accesses on AArch64. We were using the correct pseudo-instruction, but because the operand's flags weren't set correctly we still ended up emitting incorrect relocations during MC lowering. llvm-svn: 289566 --- llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp | 5 +++-- llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp index a5303fc..4274b40 100644 --- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -662,9 +662,10 @@ bool AArch64InstructionSelector::select(MachineInstr &I) const { return false; } unsigned char OpFlags = STI.ClassifyGlobalReference(GV, TM); - if (OpFlags & AArch64II::MO_GOT) + if (OpFlags & AArch64II::MO_GOT) { I.setDesc(TII.get(AArch64::LOADgot)); - else { + I.getOperand(1).setTargetFlags(OpFlags); + } else { I.setDesc(TII.get(AArch64::MOVaddr)); I.getOperand(1).setTargetFlags(OpFlags | AArch64II::MO_PAGE); MachineInstrBuilder MIB(MF, I); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir index e362521..22210e4 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir @@ -2408,7 +2408,7 @@ registers: # CHECK: body: # IOS: %0 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local # LINUX-DEFAULT: %0 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local -# LINUX-PIC: %0 = LOADgot @var_local +# LINUX-PIC: %0 = LOADgot target-flags(aarch64-got) @var_local body: | bb.0: %0(p0) = G_GLOBAL_VALUE @var_local @@ -2423,9 +2423,9 @@ registers: - { id: 0, class: gpr } # CHECK: body: -# IOS: %0 = LOADgot @var_got +# IOS: %0 = LOADgot target-flags(aarch64-got) @var_got # LINUX-DEFAULT: %0 = MOVaddr target-flags(aarch64-page) @var_got, target-flags(aarch64-pageoff, aarch64-nc) @var_got -# LINUX-PIC: %0 = LOADgot @var_got +# LINUX-PIC: %0 = LOADgot target-flags(aarch64-got) @var_got body: | bb.0: %0(p0) = G_GLOBAL_VALUE @var_got -- 2.7.4