summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/AArch64/AArch64TargetMachine.cpp6
-rw-r--r--llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll16
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
index 11a4f991fed..b3ed96e815b 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -283,9 +283,11 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
this->Options.TrapUnreachable = true;
}
- // Enable GlobalISel at or below EnableGlobalISelAt0.
+ // Enable GlobalISel at or below EnableGlobalISelAt0, unless this is
+ // MachO/CodeModel::Large, which GlobalISel does not support.
if (getOptLevel() <= EnableGlobalISelAtO &&
- TT.getArch() != Triple::aarch64_32) {
+ TT.getArch() != Triple::aarch64_32 &&
+ !(getCodeModel() == CodeModel::Large && TT.isOSBinFormatMachO())) {
setGlobalISel(true);
setGlobalISelAbort(GlobalISelAbortMode::Disable);
}
diff --git a/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll b/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll
new file mode 100644
index 00000000000..8ad93af8e72
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll
@@ -0,0 +1,16 @@
+; Check that AArch64 is honoring code-model=large at -O0 and -O2.
+;
+; RUN: llc -mtriple=arm64-apple-darwin19 -code-model=large -O0 -o - %s | FileCheck %s
+; RUN: llc -mtriple=arm64-apple-darwin19 -code-model=large -O2 -o - %s | FileCheck %s
+
+; CHECK: adrp [[REG1:x[0-9]+]], _bar@GOTPAGE
+; CHECK: ldr [[REG1]], {{\[}}[[REG1]], _bar@GOTPAGEOFF]
+; CHECK: blr [[REG1]]
+
+declare void @bar()
+
+define void @foo() {
+ call void @bar()
+ ret void
+}
+
OpenPOWER on IntegriCloud