[clang] [clang][AArch64] Don't #define __ARM_FEATURE_CRC32 when -crc is specified in -target-feature (PR #132167)

via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 28 04:39:32 PDT 2025


https://github.com/XiaShark updated https://github.com/llvm/llvm-project/pull/132167

>From 3be462100386014b3f78c1db5369487235a2bcf0 Mon Sep 17 00:00:00 2001
From: XiaShark <xiajingze1 at huawei.com>
Date: Thu, 20 Mar 2025 14:32:30 +0800
Subject: [PATCH] [clang][AArch64] Don't define features macros when explicitly
 disabled

Currently, clang has a general issue where it may incorrectly define
feature-specific macros(e.g., __ARM_FEATURE_CRC32) even when the
corresponding features are explicitly disabled via -target-feature. This
can lead to unexpected behavior in code that relies on these macros.

This commit fixed the issue by adding a secondary check to confirm if
the features are explicitly disabled in `-target-feature`.
---
 clang/lib/Basic/Targets/AArch64.cpp           | 171 +++++++++++-------
 .../Preprocessor/aarch64-target-features.c    |  36 ++++
 2 files changed, 144 insertions(+), 63 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index 3633bab6e0df9..98b91ebe77aab 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -914,6 +914,66 @@ void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
 
 bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
                                              DiagnosticsEngine &Diags) {
+  // The first round, address the ARM version initially.
+  for (const auto &Feature : Features) {
+    // All predecessor archs are added but select the latest one for ArchKind.
+    if (Feature == "+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8A;
+    if (Feature == "+v8.1a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_1A;
+    if (Feature == "+v8.2a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_2A;
+    if (Feature == "+v8.3a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_3A;
+    if (Feature == "+v8.4a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_4A;
+    if (Feature == "+v8.5a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_5A;
+    if (Feature == "+v8.6a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_6A;
+    if (Feature == "+v8.7a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_7A;
+    if (Feature == "+v8.8a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_8A;
+    if (Feature == "+v8.9a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
+      ArchInfo = &llvm::AArch64::ARMV8_9A;
+    if (Feature == "+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9A;
+    if (Feature == "+v9.1a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_1A;
+    if (Feature == "+v9.2a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_2A;
+    if (Feature == "+v9.3a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_3A;
+    if (Feature == "+v9.4a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_4A;
+    if (Feature == "+v9.5a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_5A;
+    if (Feature == "+v9.6a" &&
+        ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
+      ArchInfo = &llvm::AArch64::ARMV9_6A;
+    if (Feature == "+v8r")
+      ArchInfo = &llvm::AArch64::ARMV8R;
+  }
+
+  setDataLayout();
+  setArchFeatures();
+
+  // The second round, address each feature.
   for (const auto &Feature : Features) {
     if (Feature == "-fp-armv8")
       HasNoFP = true;
@@ -944,6 +1004,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       HasFullFP16 = true;
       HasSVE2 = true;
     }
+    if (Feature == "-sve2")
+      HasSVE2 = false;
     if (Feature == "+sve2p1") {
       FPU |= NeonMode;
       FPU |= SveMode;
@@ -951,6 +1013,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       HasSVE2 = true;
       HasSVE2p1 = true;
     }
+    if (Feature == "-sve2p1")
+      HasSVE2p1 = false;
     if (Feature == "+sve-aes") {
       FPU |= NeonMode;
       HasFullFP16 = true;
@@ -994,12 +1058,16 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       HasBFloat16 = true;
       HasFullFP16 = true;
     }
+    if (Feature == "-sme")
+      HasSME = false;
     if (Feature == "+sme2") {
       HasSME = true;
       HasSME2 = true;
       HasBFloat16 = true;
       HasFullFP16 = true;
     }
+    if (Feature == "-sme2")
+      HasSME2 = false;
     if (Feature == "+sme2p1") {
       HasSME = true;
       HasSME2 = true;
@@ -1007,6 +1075,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       HasBFloat16 = true;
       HasFullFP16 = true;
     }
+    if (Feature == "-sme2p1")
+      HasSME2p1 = false;
     if (Feature == "+sme-f64f64") {
       HasSME = true;
       HasSMEF64F64 = true;
@@ -1043,20 +1113,34 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
     }
     if (Feature == "+sb")
       HasSB = true;
+    if (Feature == "-sb")
+      HasSB = false;
     if (Feature == "+predres")
       HasPredRes = true;
+    if (Feature == "-predres")
+      HasPredRes = false;
     if (Feature == "+ssbs")
       HasSSBS = true;
+    if (Feature == "-ssbs")
+      HasSSBS = false;
     if (Feature == "+bti")
       HasBTI = true;
+    if (Feature == "-bti")
+      HasBTI = false;
     if (Feature == "+wfxt")
       HasWFxT = true;
+    if (Feature == "-wfxt")
+      HasWFxT = false;
     if (Feature == "-fmv")
       HasFMV = false;
     if (Feature == "+crc")
       HasCRC = true;
+    if (Feature == "-crc")
+      HasCRC = false;
     if (Feature == "+rcpc")
       HasRCPC = true;
+    if (Feature == "-rcpc")
+      HasRCPC = false;
     if (Feature == "+aes") {
       FPU |= NeonMode;
       HasAES = true;
@@ -1074,16 +1158,26 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       FPU |= NeonMode;
       HasRDM = true;
     }
+    if (Feature == "-rdm")
+      HasRDM = false;
     if (Feature == "+dit")
       HasDIT = true;
+    if (Feature == "-dit")
+      HasDIT = false;
     if (Feature == "+cccp")
       HasCCPP = true;
+    if (Feature == "-cccp")
+      HasCCPP = false;
     if (Feature == "+ccdp") {
       HasCCPP = true;
       HasCCDP = true;
     }
+    if (Feature == "-ccdp")
+      HasCCDP = false;
     if (Feature == "+fptoint")
       HasFRInt3264 = true;
+    if (Feature == "-fptoint")
+      HasFRInt3264 = false;
     if (Feature == "+sm4") {
       FPU |= NeonMode;
       HasSM4 = true;
@@ -1091,66 +1185,18 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
     if (Feature == "+strict-align")
       HasUnalignedAccess = false;
 
-    // All predecessor archs are added but select the latest one for ArchKind.
-    if (Feature == "+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8A;
-    if (Feature == "+v8.1a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_1A;
-    if (Feature == "+v8.2a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_2A;
-    if (Feature == "+v8.3a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_3A;
-    if (Feature == "+v8.4a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_4A;
-    if (Feature == "+v8.5a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_5A;
-    if (Feature == "+v8.6a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_6A;
-    if (Feature == "+v8.7a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_7A;
-    if (Feature == "+v8.8a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_8A;
-    if (Feature == "+v8.9a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
-      ArchInfo = &llvm::AArch64::ARMV8_9A;
-    if (Feature == "+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9A;
-    if (Feature == "+v9.1a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_1A;
-    if (Feature == "+v9.2a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_2A;
-    if (Feature == "+v9.3a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_3A;
-    if (Feature == "+v9.4a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_4A;
-    if (Feature == "+v9.5a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_5A;
-    if (Feature == "+v9.6a" &&
-        ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
-      ArchInfo = &llvm::AArch64::ARMV9_6A;
-    if (Feature == "+v8r")
-      ArchInfo = &llvm::AArch64::ARMV8R;
     if (Feature == "+fullfp16") {
       FPU |= NeonMode;
       HasFullFP16 = true;
     }
+    if (Feature == "-fullfp16")
+      HasFullFP16 = false;
     if (Feature == "+dotprod") {
       FPU |= NeonMode;
       HasDotProd = true;
     }
+    if (Feature == "-dotprod")
+      HasDotProd = false;
     if (Feature == "+fp16fml") {
       FPU |= NeonMode;
       HasFullFP16 = true;
@@ -1164,20 +1210,30 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
       HasPAuth = true;
     if (Feature == "+i8mm")
       HasMatMul = true;
+    if (Feature == "-i8mm")
+      HasMatMul = false;
     if (Feature == "+bf16")
       HasBFloat16 = true;
+    if (Feature == "-bf16")
+      HasBFloat16 = false;
     if (Feature == "+lse")
       HasLSE = true;
+    if (Feature == "-lse")
+      HasLSE = false;
     if (Feature == "+ls64")
       HasLS64 = true;
     if (Feature == "+rand")
       HasRandGen = true;
     if (Feature == "+flagm")
       HasFlagM = true;
+    if (Feature == "-flagm")
+      HasFlagM = false;
     if (Feature == "+altnzcv") {
       HasFlagM = true;
       HasAlternativeNZCV = true;
     }
+    if (Feature == "-altnzcv")
+      HasAlternativeNZCV = false;
     if (Feature == "+mops")
       HasMOPS = true;
     if (Feature == "+d128")
@@ -1192,17 +1248,6 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
     }
   }
 
-  // Check features that are manually disabled by command line options.
-  // This needs to be checked after architecture-related features are handled,
-  // making sure they are properly disabled when required.
-  for (const auto &Feature : Features) {
-    if (Feature == "-d128")
-      HasD128 = false;
-  }
-
-  setDataLayout();
-  setArchFeatures();
-
   if (HasNoFP) {
     FPU &= ~FPUMode;
     FPU &= ~NeonMode;
diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c
index b10c55447d9af..3b97a7c000796 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -94,19 +94,28 @@
 // CHECK-FEAT-CRYPTO-8_4: __ARM_FEATURE_SM4 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+aes -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-AES %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+aes+noaes -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-NOAES %s
 // CHECK-FEAT-AES: __ARM_FEATURE_AES 1
+// CHECK-FEAT-NOAES-NOT: __ARM_FEATURE_AES 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sha2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-SHA2 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sha2+nosha2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-NOSHA2 %s
 // CHECK-FEAT-SHA2: __ARM_FEATURE_SHA2 1
+// CHECK-FEAT-NOSHA2-NOT: __ARM_FEATURE_SHA2 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sha3 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-SHA3 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sha3+nosha3 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-NOSHA3 %s
 // CHECK-FEAT-SHA3: __ARM_FEATURE_SHA2 1
 // CHECK-FEAT-SHA3: __ARM_FEATURE_SHA3 1
 // CHECK-FEAT-SHA3: __ARM_FEATURE_SHA512 1
+// CHECK-FEAT-NOSHA3-NOT: __ARM_FEATURE_SHA3 1
+// CHECK-FEAT-NOSHA3-NOT: __ARM_FEATURE_SHA512 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sm4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-SM4 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sm4+nosm4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FEAT-NOSM4 %s
 // CHECK-FEAT-SM4: __ARM_FEATURE_SM3 1
 // CHECK-FEAT-SM4: __ARM_FEATURE_SM4 1
+// CHECK-FEAT-NOSM4-NOT: __ARM_FEATURE_SM4 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8.5-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-8_5 %s
 // CHECK-8_5: __ARM_FEATURE_FRINT 1
@@ -120,7 +129,9 @@
 // RUN: %clang -target arm64-none-linux-gnu -march=armv8-a+crc -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRC32 %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRC32 %s
 // RUN: %clang -target arm64-none-linux-gnu -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRC32 %s
+// RUN: %clang -target arm64-none-linux-gnu -march=armv8.1-a+nocrc -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOCRC %s
 // CHECK-CRC32: __ARM_FEATURE_CRC32 1
+// CHECK-NOCRC-NOT: __ARM_FEATURE_CRC32 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -fno-math-errno -fno-signed-zeros\
 // RUN:        -fno-trapping-math -fassociative-math -freciprocal-math -fapprox-func\
@@ -216,6 +227,8 @@
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9.5-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9.6-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+nosve -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVE %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+nosve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVE2 %s
 // CHECK-SVE2: __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
 // CHECK-SVE2: __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1
 // CHECK-SVE2: __ARM_FEATURE_SVE 1
@@ -223,6 +236,9 @@
 // CHECK-SVE2: __ARM_NEON 1
 // CHECK-SVE2: __ARM_NEON_FP 0xE
 // CHECK-SVE2: __ARM_NEON_SVE_BRIDGE 1
+// CHECK-NOSVE-NOT: __ARM_FEATURE_SVE 1
+// CHECK-NOSVE-NOT: __ARM_FEATURE_SVE2 1
+// CHECK-NOSVE2-NOT: __ARM_FEATURE_SVE2 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+nosimd -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NONEON %s
 // CHECK-NONEON-NOT: __ARM_FEATURE_SVE 1
@@ -239,15 +255,22 @@
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve2-aes+nosve2-aes -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2AES-REV %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve2+sve-aes+nosve2-aes -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2AES-REV %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve2+sve-aes+nosve-aes -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2AES-REV %s
 // CHECK-SVE2AES-REV: __ARM_FEATURE_SVE2 1
 // CHECK-SVE2AES-REV-NOT: __ARM_FEATURE_SVE2_AES 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2-sha3 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2SHA3 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2-sha3+nosve2-sha3 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVE2SHA3 %s
 // CHECK-SVE2SHA3: __ARM_FEATURE_SVE2_SHA3 1
+// CHECK-NOSVE2SHA3-NOT: __ARM_FEATURE_SVE2_SHA3 1
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2-sm4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2SM4 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2-sm4+nosve2-sm4 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVE2SM4 %s
 // CHECK-SVE2SM4: __ARM_FEATURE_SVE2_SM4 1
+// CHECK-NOSVE2SM4-NOT: __ARM_FEATURE_SVE2_SM4 1
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve-bitperm -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVEBITPERM %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve-bitperm+nosve-bitperm -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVEBITPERM %s
 // CHECK-SVEBITPERM: __ARM_FEATURE_SVE2_BITPERM 1
+// CHECK-NOSVEBITPERM-NOT: __ARM_FEATURE_SVE2_BITPERM 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve2-bitperm -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2BITPERM %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+sve-bitperm+sve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2BITPERM %s
@@ -255,6 +278,7 @@
 // CHECK-SVE2BITPERM: __ARM_FEATURE_SVE2_BITPERM 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2p1 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2p1 %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2p1+nosve2p1 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOSVE2p1 %s
 // CHECK-SVE2p1: __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
 // CHECK-SVE2p1: __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1
 // CHECK-SVE2p1: __ARM_FEATURE_SVE2 1
@@ -262,12 +286,15 @@
 // CHECK-SVE2p1: __ARM_NEON 1
 // CHECK-SVE2p1: __ARM_NEON_FP 0xE
 // CHECK-SVE2p1: __ARM_NEON_SVE_BRIDGE 1
+// CHECK-NOSVE2p1-NOT: __ARM_FEATURE_SVE2p1 1
 
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8.2a+dotprod -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DOTPROD %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8.4a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DOTPROD %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8.4a+nodotprod -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NODOTPROD %s
 // CHECK-DOTPROD: __ARM_FEATURE_DOTPROD 1
 // CHECK-DOTPROD: __ARM_NEON 1
 // CHECK-DOTPROD: __ARM_NEON_FP 0xE
+// CHECK-NODOTPROD-NOT: __ARM_FEATURE_DOTPROD 1
 
 // On ARMv8.2-A and above, +fp16fml implies +fp16.
 // On ARMv8.4-A and above, +fp16 implies +fp16fml.
@@ -569,18 +596,24 @@
 // ================== Check Armv8.5-A random number generation extension.
 // RUN: %clang -target aarch64-none-elf -march=armv8.5-a+rng -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-RNG %s
 // RUN: %clang -target aarch64-none-elf -march=armv8.5-a -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NO-RNG %s
+// RUN: %clang -target aarch64-none-elf -march=armv8.5-a+rng+norng -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NO-RNG %s
 // CHECK-RNG: __ARM_FEATURE_RNG 1
 // CHECK-NO-RNG-NOT: __ARM_FEATURE_RNG 1
 
 // ================== Check BFloat16 Extensions.
 // RUN: %clang -target aarch64-none-elf -march=armv8.6-a+bf16 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-BFLOAT %s
+// RUN: %clang -target aarch64-none-elf -march=armv8.6-a+nobf16 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NOBFLOAT %s
 // CHECK-BFLOAT: __ARM_BF16_FORMAT_ALTERNATIVE 1
 // CHECK-BFLOAT: __ARM_FEATURE_BF16 1
 // CHECK-BFLOAT: __ARM_FEATURE_BF16_VECTOR_ARITHMETIC 1
+// CHECK-NOBFLOAT-NOT: __ARM_BF16_FORMAT_ALTERNATIVE 1
+// CHECK-NOBFLOAT-NOT: __ARM_FEATURE_BF16 1
+// CHECK-NOBFLOAT-NOT: __ARM_FEATURE_BF16_VECTOR_ARITHMETIC 1
 
 // ================== Check Armv8.7-A LS64 extension.
 // RUN: %clang -target aarch64-none-elf -march=armv8.7-a+ls64 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-LS64 %s
 // RUN: %clang -target aarch64-none-elf -march=armv8.7-a      -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NO-LS64 %s
+// RUN: %clang -target aarch64-none-elf -march=armv8.7-a+ls64+nols64 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-NO-LS64 %s
 // CHECK-LS64: __ARM_FEATURE_LS64 1
 // CHECK-NO-LS64-NOT: __ARM_FEATURE_LS64 1
 
@@ -599,7 +632,10 @@
 // RUN: %clang -target arm64-none-linux-gnu -march=armv8-a+lse -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-LSE %s
 // RUN: %clang -target aarch64-none-linux-gnu -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-LSE %s
 // RUN: %clang -target arm64-none-linux-gnu -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-LSE %s
+// RUN: %clang -target aarch64-none-linux-gnu -march=armv8.1-a+nolse -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOLSE %s
+// RUN: %clang -target arm64-none-linux-gnu -march=armv8.1-a+nolse -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOLSE %s
 // CHECK-LSE: __ARM_FEATURE_ATOMICS 1
+// CHECK-NOLSE-NOT: __ARM_FEATURE_ATOMICS 1
 
 // ================== Check Armv8.8-A/Armv9.3-A memcpy and memset acceleration instructions (MOPS)
 // RUN: %clang -target aarch64-none-elf -march=armv8.7-a             -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s



More information about the cfe-commits mailing list