[clang] [AArch64] Bump default CPUs for iOS 26/watchOS 26 to A12/S6. (PR #152235)

Ahmed Bougacha via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 6 10:06:30 PDT 2025


https://github.com/ahmedbougacha updated https://github.com/llvm/llvm-project/pull/152235

>From 16b2542900c5599a87e4a6b02ec3e08dff1d2730 Mon Sep 17 00:00:00 2001
From: Ahmed Bougacha <ahmed at bougacha.org>
Date: Tue, 5 Aug 2025 15:20:18 -0700
Subject: [PATCH 1/2] [AArch64] Bump default CPUs for iOS 26/watchOS 26 to
 A12/S6.

iOS 26/watchOS 26 deprecate some devices, allowing the default CPU to be
raised based on the deployment target.

watchOS 26 also introduces arm64 (vs. arm64_32/arm64e).

The defaults are now:
- arm64-apple-ios26         apple-a12
- arm64-apple-watchos26     apple-s6
- arm64_32-apple-watchos26  apple-s6
- arm64e-apple-watchos26    apple-s6

Left unchanged are:
- arm64-apple-tvos26        apple-a7
- arm64e-apple-tvos26       apple-a12
- arm64e-apple-ios26        apple-a12
- arm64_32-apple-watchos11  apple-s4

While there, rewrite an outdated comment in a related Mac test.
---
 clang/lib/Driver/ToolChains/Arch/AArch64.cpp  | 16 ++++++++++++++
 .../Driver/aarch64-cpu-defaults-appleos26.c   | 22 +++++++++++++++++++
 clang/test/Driver/aarch64-mac-cpus.c          |  2 +-
 3 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Driver/aarch64-cpu-defaults-appleos26.c

diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index 418f9fd9ca4c4..98f5efbe5652f 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -52,6 +52,22 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
     return "apple-m1";
   }
 
+  if (Triple.getOS() == llvm::Triple::IOS) {
+    assert(!Triple.isSimulatorEnvironment() && "iossim should be mac-like");
+    // iOS 26 only runs on apple-a12 and later CPUs.
+    if (!Triple.isOSVersionLT(26))
+      return "apple-a12";
+  }
+
+  if (Triple.isWatchOS()) {
+    assert(!Triple.isSimulatorEnvironment() && "watchossim should be mac-like");
+    // arm64_32/arm64e watchOS requires S4 before watchOS 26, S6 after.
+    if (Triple.getArch() == llvm::Triple::aarch64_32 || Triple.isArm64e())
+      return Triple.isOSVersionLT(26) ? "apple-s4" : "apple-s6";
+    // arm64 (non-e, non-32) watchOS comes later, and requires S6 anyway.
+    return "apple-s6";
+  }
+
   if (Triple.isXROS()) {
     // The xrOS simulator runs on M1 as well, it should have been covered above.
     assert(!Triple.isSimulatorEnvironment() && "xrossim should be mac-like");
diff --git a/clang/test/Driver/aarch64-cpu-defaults-appleos26.c b/clang/test/Driver/aarch64-cpu-defaults-appleos26.c
new file mode 100644
index 0000000000000..7ad460ee86fcf
--- /dev/null
+++ b/clang/test/Driver/aarch64-cpu-defaults-appleos26.c
@@ -0,0 +1,22 @@
+/// iOS 26 and watchOS 26 bump the default arm64 CPU targets.
+
+/// arm64 iOS 26 defaults to apple-a12.  arm64e already did.
+// RUN: %clang -target arm64-apple-ios26  -### -c %s 2>&1 | FileCheck %s --check-prefix=A12
+// RUN: %clang -target arm64e-apple-ios26 -### -c %s 2>&1 | FileCheck %s --check-prefix=A12
+
+// arm64e/arm64_32 watchOS 26 default to apple-s6.
+// RUN: %clang -target arm64e-apple-watchos26   -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
+// RUN: %clang -target arm64_32-apple-watchos26 -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
+
+// arm64 is new in watchOS 26, and defaults to apple-s6.
+// RUN: %clang -target arm64-apple-watchos26  -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
+
+/// llvm usually treats tvOS like iOS, but it runs on different hardware.
+// RUN: %clang -target arm64-apple-tvos26  -### -c %s 2>&1 | FileCheck %s --check-prefix=A7
+// RUN: %clang -target arm64e-apple-tvos26 -### -c %s 2>&1 | FileCheck %s --check-prefix=A12
+
+/// Simulators are tested with other Mac-like targets in aarch64-mac-cpus.c.
+
+// A12: "-target-cpu" "apple-a12"
+// S6:  "-target-cpu" "apple-s6"
+// A7:  "-target-cpu" "apple-a7"
diff --git a/clang/test/Driver/aarch64-mac-cpus.c b/clang/test/Driver/aarch64-mac-cpus.c
index 8d23ad8c956fd..1aef1ae285e86 100644
--- a/clang/test/Driver/aarch64-mac-cpus.c
+++ b/clang/test/Driver/aarch64-mac-cpus.c
@@ -1,4 +1,4 @@
-// arm64 Mac-based targets default to Apple A13.
+// arm64/arm64e Mac-based targets default to Apple M1.
 
 // RUN: %clang --target=arm64-apple-macos             -### -c %s 2>&1 | FileCheck %s
 // RUN: %clang --target=arm64-apple-ios-macabi        -### -c %s 2>&1 | FileCheck %s

>From 34cfb56ef6205b552e8be18d68fb0bfcdd85fe94 Mon Sep 17 00:00:00 2001
From: Ahmed Bougacha <ahmed at bougacha.org>
Date: Wed, 6 Aug 2025 10:02:22 -0700
Subject: [PATCH 2/2] Fix test comment formatting.

---
 clang/test/Driver/aarch64-cpu-defaults-appleos26.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/Driver/aarch64-cpu-defaults-appleos26.c b/clang/test/Driver/aarch64-cpu-defaults-appleos26.c
index 7ad460ee86fcf..99176050bf5ae 100644
--- a/clang/test/Driver/aarch64-cpu-defaults-appleos26.c
+++ b/clang/test/Driver/aarch64-cpu-defaults-appleos26.c
@@ -4,11 +4,11 @@
 // RUN: %clang -target arm64-apple-ios26  -### -c %s 2>&1 | FileCheck %s --check-prefix=A12
 // RUN: %clang -target arm64e-apple-ios26 -### -c %s 2>&1 | FileCheck %s --check-prefix=A12
 
-// arm64e/arm64_32 watchOS 26 default to apple-s6.
+/// arm64e/arm64_32 watchOS 26 default to apple-s6.
 // RUN: %clang -target arm64e-apple-watchos26   -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
 // RUN: %clang -target arm64_32-apple-watchos26 -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
 
-// arm64 is new in watchOS 26, and defaults to apple-s6.
+/// arm64 is new in watchOS 26, and defaults to apple-s6.
 // RUN: %clang -target arm64-apple-watchos26  -### -c %s 2>&1 | FileCheck %s --check-prefix=S6
 
 /// llvm usually treats tvOS like iOS, but it runs on different hardware.



More information about the cfe-commits mailing list