Index: llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp +++ llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -283,9 +283,11 @@ 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); } Index: llvm/trunk/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll +++ llvm/trunk/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 +} +