Author: Ricardo Jesus
Date: 2026-01-29T10:08:26Z
New Revision: a0e0f515419841a0c46e5192db318b207c6faab3

URL: 
https://github.com/llvm/llvm-project/commit/a0e0f515419841a0c46e5192db318b207c6faab3
DIFF: 
https://github.com/llvm/llvm-project/commit/a0e0f515419841a0c46e5192db318b207c6faab3.diff

LOG: [AArch64][Driver] Enable host supported features with march=native. 
(#177128)

Currently, march=native enables the base features implied by the host
system architecture, such as Armv8.2-A, Armv9-A, etc, rather than the
actual features supported by the host (e.g. crypto). This is suboptimal
as it generally leaves optional but supported features disabled.

This patch aligns the behaviour of march=native with mcpu=native by
using the latter's decoding logic to decode the former as well. This
means both options should enable a similar set of features. We also set
the target-cpu accordingly, so that march=native becomes a drop-in
replacement for mcpu=native.

Added: 
    

Modified: 
    clang/lib/Driver/ToolChains/Arch/AArch64.cpp
    clang/test/Driver/aarch64-mcpu-native.c
    clang/test/Driver/print-enabled-extensions/aarch64-grace.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp 
b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index cc6e408f45e07..4aa3743fb5cd5 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -35,6 +35,11 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
   if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
     StringRef Mcpu = A->getValue();
     CPU = Mcpu.split("+").first.lower();
+  } else if (const Arg *MArch = Args.getLastArg(options::OPT_march_EQ)) {
+    // Otherwise, use -march=native if specified.
+    StringRef MArchValue = MArch->getValue();
+    if (MArchValue.split("+").first.equals_insensitive("native"))
+      CPU = "native";
   }
 
   CPU = llvm::AArch64::resolveCPUAlias(CPU);
@@ -159,10 +164,11 @@ getAArch64ArchFeaturesFromMarch(const Driver &D, 
StringRef March,
   std::string MarchLowerCase = March.lower();
   std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
 
+  if (Split.first == "native")
+    return DecodeAArch64Mcpu(D, MarchLowerCase, Extensions);
+
   const llvm::AArch64::ArchInfo *ArchInfo =
       llvm::AArch64::parseArch(Split.first);
-  if (Split.first == "native")
-    ArchInfo = llvm::AArch64::getArchForCpu(llvm::sys::getHostCPUName().str());
   if (!ArchInfo)
     return false;
 

diff  --git a/clang/test/Driver/aarch64-mcpu-native.c 
b/clang/test/Driver/aarch64-mcpu-native.c
index e132081062851..6fb959b2afb3b 100644
--- a/clang/test/Driver/aarch64-mcpu-native.c
+++ b/clang/test/Driver/aarch64-mcpu-native.c
@@ -1,6 +1,7 @@
 // REQUIRES: aarch64-registered-target,system-linux,aarch64-host
 // RUN: export LLVM_CPUINFO=%S/Inputs/cpunative/neoverse-n1
 // RUN: %clang --target=aarch64 --print-enabled-extensions -mcpu=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-NN1 
--implicit-check-not=FEAT_ %s
+// RUN: %clang --target=aarch64 --print-enabled-extensions -march=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-NN1 
--implicit-check-not=FEAT_ %s
 
 // CHECK-FEAT-NN1: Extensions enabled for the given AArch64 target
 // CHECK-FEAT-NN1-EMPTY:
@@ -26,9 +27,13 @@
 // CHECK-FEAT-NN1:    FEAT_UAO                                               
Enable Armv8.2-A UAO PState
 // CHECK-FEAT-NN1:    FEAT_VHE                                               
Enable Armv8.1-A Virtual Host extension
 
+// RUN: %clang --target=aarch64 -mcpu=native -### -c %s 2>&1 | FileCheck 
-check-prefix=NEOVERSE-N1 %s
+// RUN: %clang --target=aarch64 -march=native -### -c %s 2>&1 | FileCheck 
-check-prefix=NEOVERSE-N1 %s
+// NEOVERSE-N1: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" 
"neoverse-n1"
 
 // RUN: export LLVM_CPUINFO=%S/Inputs/cpunative/cortex-a57
 // RUN: %clang --target=aarch64 --print-enabled-extensions -mcpu=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-CA57 
--implicit-check-not=FEAT_ %s
+// RUN: %clang --target=aarch64 --print-enabled-extensions -march=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-CA57 
--implicit-check-not=FEAT_ %s
 
 // CHECK-FEAT-CA57: Extensions enabled for the given AArch64 target
 // CHECK-FEAT-CA57-EMPTY:
@@ -38,8 +43,13 @@
 // CHECK-FEAT-CA57:    FEAT_FP                                                
Enable Armv8.0-A Floating Point Extensions
 // CHECK-FEAT-CA57:    FEAT_PMUv3                                             
Enable Armv8.0-A PMUv3 Performance Monitors extension
 
+// RUN: %clang --target=aarch64 -mcpu=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A57 %s
+// RUN: %clang --target=aarch64 -march=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A57 %s
+// CORTEX-A57: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" 
"cortex-a57"
+
 // RUN: export LLVM_CPUINFO=%S/Inputs/cpunative/cortex-a72
 // RUN: %clang --target=aarch64 --print-enabled-extensions -mcpu=native | 
FileCheck --strict-whitespace  --check-prefix=CHECK-FEAT-CA72 
--implicit-check-not=FEAT_ %s
+// RUN: %clang --target=aarch64 --print-enabled-extensions -march=native | 
FileCheck --strict-whitespace  --check-prefix=CHECK-FEAT-CA72 
--implicit-check-not=FEAT_ %s
 
 // CHECK-FEAT-CA72: Extensions enabled for the given AArch64 target
 // CHECK-EMPTY:
@@ -51,8 +61,13 @@
 // CHECK-FEAT-CA72:    FEAT_PMUv3                                             
Enable Armv8.0-A PMUv3 Performance Monitors extension
 // CHECK-FEAT-CA72:    FEAT_SHA1, FEAT_SHA256                                 
Enable SHA1 and SHA256 support
 
+// RUN: %clang --target=aarch64 -mcpu=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A72 %s
+// RUN: %clang --target=aarch64 -march=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A72 %s
+// CORTEX-A72: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" 
"cortex-a72"
+
 // RUN: export LLVM_CPUINFO=%S/Inputs/cpunative/cortex-a76
 // RUN: %clang --target=aarch64 --print-enabled-extensions -mcpu=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-CA76 
--implicit-check-not=FEAT_ %s
+// RUN: %clang --target=aarch64 --print-enabled-extensions -march=native | 
FileCheck --strict-whitespace --check-prefix=CHECK-FEAT-CA76 
--implicit-check-not=FEAT_ %s
 
 // CHECK-FEAT-CA76: Extensions enabled for the given AArch64 target
 // CHECK-FEAT-CA76-EMPTY:
@@ -76,3 +91,7 @@
 // CHECK-FEAT-CA76:    FEAT_SSBS, FEAT_SSBS2                                  
Enable Speculative Store Bypass Safe bit
 // CHECK-FEAT-CA76:    FEAT_UAO                                               
Enable Armv8.2-A UAO PState
 // CHECK-FEAT-CA76:    FEAT_VHE                                               
Enable Armv8.1-A Virtual Host extension
+
+// RUN: %clang --target=aarch64 -mcpu=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A76 %s
+// RUN: %clang --target=aarch64 -march=native -### -c %s 2>&1 | FileCheck 
-check-prefix=CORTEX-A76 %s
+// CORTEX-A76: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" 
"cortex-a76"

diff  --git a/clang/test/Driver/print-enabled-extensions/aarch64-grace.c 
b/clang/test/Driver/print-enabled-extensions/aarch64-grace.c
index acb641e3b2c8d..a8ab66e47fb5d 100644
--- a/clang/test/Driver/print-enabled-extensions/aarch64-grace.c
+++ b/clang/test/Driver/print-enabled-extensions/aarch64-grace.c
@@ -1,6 +1,7 @@
 // REQUIRES: aarch64-registered-target,aarch64-host,system-linux
 // RUN: %clang --target=aarch64 --print-enabled-extensions -mcpu=grace | 
FileCheck --strict-whitespace --implicit-check-not=FEAT_ %s
 // RUN: env LLVM_CPUINFO=%S/../Inputs/cpunative/grace %clang --target=aarch64 
--print-enabled-extensions -mcpu=native | FileCheck --strict-whitespace 
--implicit-check-not=FEAT_ %s
+// RUN: env LLVM_CPUINFO=%S/../Inputs/cpunative/grace %clang --target=aarch64 
--print-enabled-extensions -march=native | FileCheck --strict-whitespace 
--implicit-check-not=FEAT_ %s
 
 // CHECK: Extensions enabled for the given AArch64 target
 // CHECK-EMPTY:
@@ -61,3 +62,7 @@
 // CHECK-NEXT:     FEAT_TRF                                               
Enable Armv8.4-A Trace extension
 // CHECK-NEXT:     FEAT_UAO                                               
Enable Armv8.2-A UAO PState
 // CHECK-NEXT:     FEAT_VHE                                               
Enable Armv8.1-A Virtual Host extension
+
+// RUN: env LLVM_CPUINFO=%S/../Inputs/cpunative/grace %clang --target=aarch64 
-mcpu=native -### -c %s 2>&1 | FileCheck -check-prefix=NEOVERSE-V2 %s
+// RUN: env LLVM_CPUINFO=%S/../Inputs/cpunative/grace %clang --target=aarch64 
-march=native -### -c %s 2>&1 | FileCheck -check-prefix=NEOVERSE-V2 %s
+// NEOVERSE-V2: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" 
"neoverse-v2"


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to