https://github.com/tomershafir updated https://github.com/llvm/llvm-project/pull/179136
>From cad8959d50799faeb4710f53c59ba2ca3c5b4956 Mon Sep 17 00:00:00 2001 From: tomershafir <[email protected]> Date: Sun, 1 Feb 2026 13:54:23 +0200 Subject: [PATCH 1/4] [Clang][AArch64] Set default tune-cpu on macOS This patch sets a default tune-cpu on macOS targets to `apple-m5` (current latest). The implementation adds a helper in `clang/lib/Driver/ToolChains/Arch/AArch64.h` called by `clang/lib/Driver/ToolChains/Clang.cpp`. It doesnt follow a "check then get" flow because its very concise, and returns an optional instead. It adds a missing test file for mtune on Apple macOS targets, including the new logic. --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 49 +++++++++++++++++-- clang/lib/Driver/ToolChains/Arch/AArch64.h | 5 ++ clang/lib/Driver/ToolChains/Clang.cpp | 8 ++- clang/test/Driver/aarch64-mtune-apple-macos.c | 28 +++++++++++ 4 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 clang/test/Driver/aarch64-mtune-apple-macos.c diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index cfc7cdfe0aedb..55653702ffc88 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -13,6 +13,7 @@ #include "llvm/Option/ArgList.h" #include "llvm/TargetParser/AArch64TargetParser.h" #include "llvm/TargetParser/Host.h" +#include <optional> using namespace clang::driver; using namespace clang::driver::tools; @@ -97,6 +98,47 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args, return getAArch64TargetCPUByTriple(Triple); } +/// \return the target tune CPU LLVM name based on the target triple. +static std::optional<std::string> +getAArch64TargetTuneCPUByTriple(const llvm::Triple &Triple) { + // Apple Silicon macs default to the latest available target for tuning. + if (Triple.isTargetMachineMac() && + Triple.getArch() == llvm::Triple::aarch64) { + return "apple-m5"; + } + return std::nullopt; +} + +/// \return the LLVM name of the AArch64 tune CPU we should target. +/// Returns std::nullopt if no tune CPU should be specified. +/// +/// Note: Unlike getAArch64TargetCPU, this function does not resolve +/// CPU aliases, as it is currently not used for target architecture feature +/// collection, but defers it to the backend. +std::optional<std::string> +aarch64::getAArch64TargetTuneCPU(const llvm::opt::ArgList &Args, + const llvm::Triple &Triple) { + std::string TuneCPU; + // -mtune has highest priority, then -mcpu + if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) { + StringRef Mtune = A->getValue(); + TuneCPU = Mtune.lower(); + + if (TuneCPU == "native") + return std::string(llvm::sys::getHostCPUName()); + + return TuneCPU; + } + + // If -mcpu is present, let the backend mirror it for tuning + if (Args.getLastArg(options::OPT_mcpu_EQ)) + return std::nullopt; + + // If both -mtune and -mcpu are not present, try infer tune CPU from the + // target triple, or let the backend mirror the inferred target CPU for tuning + return getAArch64TargetTuneCPUByTriple(Triple); +} + // Decode AArch64 features from string like +[no]featureA+[no]featureB+... static bool DecodeAArch64Features(const Driver &D, StringRef text, llvm::AArch64::ExtensionSet &Extensions) { @@ -244,9 +286,10 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, success = getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args); else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ))) success = getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args); - else if (success && isCPUDeterminedByTriple(Triple)) - success = getAArch64MicroArchFeaturesFromMcpu( - D, getAArch64TargetCPUByTriple(Triple), Args); + else if (success) { + if (auto TuneCPUOpt = getAArch64TargetTuneCPUByTriple(Triple)) + success = getAArch64MicroArchFeaturesFromMtune(D, *TuneCPUOpt, Args); + } if (!success) { auto Diag = D.Diag(diag::err_drv_unsupported_option_argument); diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.h b/clang/lib/Driver/ToolChains/Arch/AArch64.h index 97ebfa61a0f0d..8a1ac27d1aefd 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.h +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.h @@ -12,6 +12,7 @@ #include "clang/Driver/Driver.h" #include "llvm/ADT/StringRef.h" #include "llvm/Option/Option.h" +#include <optional> #include <string> #include <vector> @@ -28,6 +29,10 @@ void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args, const llvm::Triple &Triple, llvm::opt::Arg *&A); +std::optional<std::string> +getAArch64TargetTuneCPU(const llvm::opt::ArgList &Args, + const llvm::Triple &Triple); + bool isAArch64BareMetal(const llvm::Triple &Triple); } // end namespace aarch64 diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 87d4d73748940..54b6a2569eb40 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "Clang.h" +#include "Arch/AArch64.h" #include "Arch/ARM.h" #include "Arch/LoongArch.h" #include "Arch/Mips.h" @@ -1688,12 +1689,9 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args, AddAAPCSVolatileBitfieldArgs(Args, CmdArgs); - if (const Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) { + if (auto TuneCPU = aarch64::getAArch64TargetTuneCPU(Args, Triple)) { CmdArgs.push_back("-tune-cpu"); - if (strcmp(A->getValue(), "native") == 0) - CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName())); - else - CmdArgs.push_back(A->getValue()); + CmdArgs.push_back(Args.MakeArgString(*TuneCPU)); } AddUnalignedAccessWarning(CmdArgs); diff --git a/clang/test/Driver/aarch64-mtune-apple-macos.c b/clang/test/Driver/aarch64-mtune-apple-macos.c new file mode 100644 index 0000000000000..f5992a2d63b7b --- /dev/null +++ b/clang/test/Driver/aarch64-mtune-apple-macos.c @@ -0,0 +1,28 @@ +// Test -mtune flag on Apple Silicon AArch64 macOS. + +// Test default -mtune on macOS +// RUN: %clang -### -c --target=arm64-apple-macos %s 2>&1 | FileCheck %s --check-prefixes=CPU-MACOS-DEFAULT,TUNE-MACOS-DEFAULT + +// RUN: %clang -### -c --target=arm64-apple-macos %s -mtune=generic 2>&1 | FileCheck %s --check-prefixes=CPU-MACOS-DEFAULT,TUNE-GENERIC + +// RUN: %clang -### -c --target=arm64-apple-macos %s -mtune=apple-m5 2>&1 | FileCheck %s --check-prefixes=CPU-MACOS-DEFAULT,TUNE-APPLE-M5 + +// Check interaction between march and mtune. + +// RUN: %clang -### -c --target=arm64-apple-macos %s -march=armv8-a 2>&1 | FileCheck %s --check-prefixes=CPU-MACOS-DEFAULT,TUNE-MACOS-DEFAULT + +// RUN: %clang -### -c --target=arm64-apple-macos %s -march=armv8-a -mtune=apple-m5 2>&1 | FileCheck %s --check-prefixes=CPU-MACOS-DEFAULT,TUNE-APPLE-M5 + +// Check interaction between mcpu and mtune. + +// RUN: %clang -### -c --target=arm64-apple-macos %s -mcpu=apple-m4 2>&1 | FileCheck %s --check-prefixes=CPU-APPLE-M4,NO-TUNE + +// RUN: %clang -### -c --target=arm64-apple-macos %s -mcpu=apple-m4 -mtune=apple-m5 2>&1 | FileCheck %s --check-prefixes=CPU-APPLE-M4,TUNE-APPLE-M5 + +// CPU-MACOS-DEFAULT: "-target-cpu" "apple-m1" +// CPU-APPLE-M4: "-target-cpu" "apple-m4" + +// TUNE-MACOS-DEFAULT: "-tune-cpu" "apple-m5" +// TUNE-APPLE-M5: "-tune-cpu" "apple-m5" +// TUNE-GENERIC: "-tune-cpu" "generic" +// NO-TUNE-NOT: "-tune-cpu" >From 707268d097090a248178352068c44a229bb72362 Mon Sep 17 00:00:00 2001 From: tomershafir <[email protected]> Date: Tue, 10 Feb 2026 20:09:43 +0200 Subject: [PATCH 2/4] small cleanups --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index 55653702ffc88..7a80dbffdb801 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -102,18 +102,17 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args, static std::optional<std::string> getAArch64TargetTuneCPUByTriple(const llvm::Triple &Triple) { // Apple Silicon macs default to the latest available target for tuning. - if (Triple.isTargetMachineMac() && - Triple.getArch() == llvm::Triple::aarch64) { + if (Triple.isTargetMachineMac() && Triple.getArch() == llvm::Triple::aarch64) return "apple-m5"; - } + return std::nullopt; } /// \return the LLVM name of the AArch64 tune CPU we should target. /// Returns std::nullopt if no tune CPU should be specified. /// -/// Note: Unlike getAArch64TargetCPU, this function does not resolve -/// CPU aliases, as it is currently not used for target architecture feature +/// Note: Unlike getAArch64TargetCPU, this function does not resolve CPU +/// aliases, as it is currently not used for target architecture feature /// collection, but defers it to the backend. std::optional<std::string> aarch64::getAArch64TargetTuneCPU(const llvm::opt::ArgList &Args, @@ -287,8 +286,8 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ))) success = getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args); else if (success) { - if (auto TuneCPUOpt = getAArch64TargetTuneCPUByTriple(Triple)) - success = getAArch64MicroArchFeaturesFromMtune(D, *TuneCPUOpt, Args); + if (auto TuneCPU = getAArch64TargetTuneCPUByTriple(Triple)) + success = getAArch64MicroArchFeaturesFromMtune(D, *TuneCPU, Args); } if (!success) { >From fb9ef913ed702ec312d89eec0ab0ff311d61ba1a Mon Sep 17 00:00:00 2001 From: tomershafir <[email protected]> Date: Tue, 10 Feb 2026 22:36:48 +0200 Subject: [PATCH 3/4] sink TuneCPU decl --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index 7a80dbffdb801..f44d842664b45 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -117,11 +117,10 @@ getAArch64TargetTuneCPUByTriple(const llvm::Triple &Triple) { std::optional<std::string> aarch64::getAArch64TargetTuneCPU(const llvm::opt::ArgList &Args, const llvm::Triple &Triple) { - std::string TuneCPU; // -mtune has highest priority, then -mcpu if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) { StringRef Mtune = A->getValue(); - TuneCPU = Mtune.lower(); + std::string TuneCPU = Mtune.lower(); if (TuneCPU == "native") return std::string(llvm::sys::getHostCPUName()); >From dd4c3c001c1a41fded4d266b812ffc05b6e8eab6 Mon Sep 17 00:00:00 2001 From: tomershafir <[email protected]> Date: Wed, 11 Feb 2026 09:37:22 +0200 Subject: [PATCH 4/4] remove redundant include from AArch64.cpp --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index f44d842664b45..93fdbd17d1a43 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -13,7 +13,6 @@ #include "llvm/Option/ArgList.h" #include "llvm/TargetParser/AArch64TargetParser.h" #include "llvm/TargetParser/Host.h" -#include <optional> using namespace clang::driver; using namespace clang::driver::tools; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
