summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-12-13 18:25:38 +0000
committerTim Northover <tnorthover@apple.com>2016-12-13 18:25:38 +0000
commitfe7c59adb8fd3b89e2b8379a5e16cf4fac68930f (patch)
tree7889cf84e77cf463a6576b5b6f10386558d81768
parentc8c1032c0c52d7f851ccfa29ec850b24047ebcb9 (diff)
downloadbcm5719-llvm-fe7c59adb8fd3b89e2b8379a5e16cf4fac68930f.tar.gz
bcm5719-llvm-fe7c59adb8fd3b89e2b8379a5e16cf4fac68930f.zip
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
-rw-r--r--llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp5
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir6
2 files changed, 6 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
index a5303fcdbb6..4274b4080cc 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 e362521ca5b..22210e49bd7 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
OpenPOWER on IntegriCloud