tyb0807 updated this revision to Diff 410225. tyb0807 added a comment. Cache architecture feature to avoid scanning the feature list over and over again.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D120111/new/ https://reviews.llvm.org/D120111 Files: clang/lib/Basic/Targets/AArch64.cpp clang/lib/Driver/ToolChains/Arch/AArch64.cpp clang/test/Driver/aarch64-hbc.c clang/test/Driver/aarch64-mops.c clang/test/Preprocessor/aarch64-target-features.c
Index: clang/test/Preprocessor/aarch64-target-features.c =================================================================== --- clang/test/Preprocessor/aarch64-target-features.c +++ clang/test/Preprocessor/aarch64-target-features.c @@ -521,13 +521,17 @@ // CHECK-LSE: __ARM_FEATURE_ATOMICS 1 // ================== Check Armv8.8-A/Armv9.3-A memcpy and memset acceleration instructions (MOPS) -// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.7-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.7-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.2-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.2-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.3-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.3-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.7-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.7-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a+nomops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a+nomops+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv8.8-a+mops+nomops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.2-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.2-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.3-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.3-a+nomops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang -target aarch64-arm-none-eabi -march=armv9.3-a+mops -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-MOPS %s // CHECK-MOPS: __ARM_FEATURE_MOPS 1 // CHECK-NOMOPS-NOT: __ARM_FEATURE_MOPS 1 Index: clang/test/Driver/aarch64-mops.c =================================================================== --- clang/test/Driver/aarch64-mops.c +++ clang/test/Driver/aarch64-mops.c @@ -1,6 +1,12 @@ // Test that target feature mops is implemented and available correctly -// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+mops %s 2>&1 | FileCheck %s -// CHECK: "-target-feature" "+mops" - +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.7-a+mops %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+mops %s 2>&1 | FileCheck %s // RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+nomops %s 2>&1 | FileCheck %s --check-prefix=NO_MOPS +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.2-a+mops %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a+mops %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a+nomops %s 2>&1 | FileCheck %s --check-prefix=NO_MOPS + +// CHECK: "-target-feature" "+mops" // NO_MOPS: "-target-feature" "-mops" Index: clang/test/Driver/aarch64-hbc.c =================================================================== --- clang/test/Driver/aarch64-hbc.c +++ clang/test/Driver/aarch64-hbc.c @@ -1,6 +1,12 @@ // Test that target feature hbc is implemented and available correctly -// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+hbc %s 2>&1 | FileCheck %s -// CHECK: "-target-feature" "+hbc" - +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.7-a+hbc %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+hbc %s 2>&1 | FileCheck %s // RUN: %clang -### -target aarch64-none-none-eabi -march=armv8.8-a+nohbc %s 2>&1 | FileCheck %s --check-prefix=NO_HBC +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.2-a+hbc %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a+hbc %s 2>&1 | FileCheck %s +// RUN: %clang -### -target aarch64-none-none-eabi -march=armv9.3-a+nohbc %s 2>&1 | FileCheck %s --check-prefix=NO_HBC + +// CHECK: "-target-feature" "+hbc" // NO_HBC: "-target-feature" "-hbc" Index: clang/lib/Driver/ToolChains/Arch/AArch64.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -116,7 +116,8 @@ // Check if the CPU name and feature modifiers in -mcpu are legal. If yes, // decode CPU and feature. static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + StringRef &ArchFeature) { std::pair<StringRef, StringRef> Split = Mcpu.split("+"); CPU = Split.first; llvm::AArch64::ArchKind ArchKind = llvm::AArch64::ArchKind::ARMV8A; @@ -131,6 +132,7 @@ if (!llvm::AArch64::getArchFeatures(ArchKind, Features)) return false; + ArchFeature = Features.back(); uint64_t Extension = llvm::AArch64::getDefaultExtensions(CPU, ArchKind); if (!llvm::AArch64::getExtensionFeatures(Extension, Features)) return false; @@ -146,15 +148,18 @@ static bool getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, const ArgList &Args, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + StringRef &ArchFeature) { std::string MarchLowerCase = March.lower(); std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+"); llvm::AArch64::ArchKind ArchKind = llvm::AArch64::parseArch(Split.first); - if (ArchKind == llvm::AArch64::ArchKind::INVALID || - !llvm::AArch64::getArchFeatures(ArchKind, Features)) + // getArchFeatures() returns false only if + // ArchKind == llvm::AArch64::ArchKind::INVALID + if (!llvm::AArch64::getArchFeatures(ArchKind, Features)) return false; + ArchFeature = Features.back(); // Enable SVE2 by default on Armv9-A. // It can still be disabled if +nosve2 is present. // We must do this early so that DecodeAArch64Features has the correct state @@ -175,24 +180,23 @@ static bool getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, const ArgList &Args, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + StringRef &ArchFeature) { StringRef CPU; std::string McpuLowerCase = Mcpu.lower(); - if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features)) - return false; - - return true; + return DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features, ArchFeature); } static bool getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune, const ArgList &Args, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + StringRef &ArchFeature) { std::string MtuneLowerCase = Mtune.lower(); // Check CPU name is valid std::vector<StringRef> MtuneFeatures; StringRef Tune; - if (!DecodeAArch64Mcpu(D, MtuneLowerCase, Tune, MtuneFeatures)) + if (!DecodeAArch64Mcpu(D, MtuneLowerCase, Tune, MtuneFeatures, ArchFeature)) return false; // Handle CPU name is 'native'. @@ -209,14 +213,15 @@ static bool getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, const ArgList &Args, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + StringRef &ArchFeature) { StringRef CPU; std::vector<StringRef> DecodedFeature; std::string McpuLowerCase = Mcpu.lower(); - if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature)) + if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature, ArchFeature)) return false; - return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features); + return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features, ArchFeature); } void aarch64::getAArch64TargetFeatures(const Driver &D, @@ -226,9 +231,10 @@ bool ForAS) { Arg *A; bool success = true; + StringRef AF; // Enable NEON by default. Features.push_back("+neon"); - llvm::StringRef WaMArch; + StringRef WaMArch; if (ForAS) for (const auto *A : Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) @@ -239,28 +245,28 @@ // "-Xassembler -march" is detected. Otherwise it may return false // and causes Clang to error out. if (!WaMArch.empty()) - success = getAArch64ArchFeaturesFromMarch(D, WaMArch, Args, Features); + success = getAArch64ArchFeaturesFromMarch(D, WaMArch, Args, Features, AF); else if ((A = Args.getLastArg(options::OPT_march_EQ))) - success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features); + success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features, AF); else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) - success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features); + success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features, AF); else if (Args.hasArg(options::OPT_arch) || isCPUDeterminedByTriple(Triple)) success = getAArch64ArchFeaturesFromMcpu( - D, getAArch64TargetCPU(Args, Triple, A), Args, Features); + D, getAArch64TargetCPU(Args, Triple, A), Args, Features, AF); else // Default to 'A' profile if the architecture is not specified. - success = getAArch64ArchFeaturesFromMarch(D, "armv8-a", Args, Features); + success = getAArch64ArchFeaturesFromMarch(D, "armv8-a", Args, Features, AF); if (success && (A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ))) success = - getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features); + getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features, AF); else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ))) success = - getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features); + getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features, AF); else if (success && (Args.hasArg(options::OPT_arch) || isCPUDeterminedByTriple(Triple))) success = getAArch64MicroArchFeaturesFromMcpu( - D, getAArch64TargetCPU(Args, Triple, A), Args, Features); + D, getAArch64TargetCPU(Args, Triple, A), Args, Features, AF); if (!success) { auto Diag = D.Diag(diag::err_drv_clang_unsupported); @@ -350,7 +356,7 @@ // TargetParser rewrite. const auto ItRNoFullFP16 = std::find(Features.rbegin(), Features.rend(), "-fullfp16"); const auto ItRFP16FML = std::find(Features.rbegin(), Features.rend(), "+fp16fml"); - if (llvm::is_contained(Features, "+v8.4a")) { + if (AF == "+v8.4a") { const auto ItRFullFP16 = std::find(Features.rbegin(), Features.rend(), "+fullfp16"); if (ItRFullFP16 < ItRNoFullFP16 && ItRFullFP16 < ItRFP16FML) { // Only entangled feature that can be to the right of this +fullfp16 is -fp16fml. @@ -392,15 +398,9 @@ NoCrypto = true; } - if (std::find(ItBegin, ItEnd, "+v8.4a") != ItEnd || - std::find(ItBegin, ItEnd, "+v8.5a") != ItEnd || - std::find(ItBegin, ItEnd, "+v8.6a") != ItEnd || - std::find(ItBegin, ItEnd, "+v8.7a") != ItEnd || - std::find(ItBegin, ItEnd, "+v8.8a") != ItEnd || - std::find(ItBegin, ItEnd, "+v9a") != ItEnd || - std::find(ItBegin, ItEnd, "+v9.1a") != ItEnd || - std::find(ItBegin, ItEnd, "+v9.2a") != ItEnd || - std::find(ItBegin, ItEnd, "+v9.3a") != ItEnd) { + if (AF == "+v8.4a" || AF == "+v8.5a" || AF == "+v8.6a" || AF == "+v8.7a" || + AF == "+v8.8a" || AF == "+v9a" || AF == "+v9.1a" || AF == "+v9.2a" || + AF == "+v9.3a") { if (HasCrypto && !NoCrypto) { // Check if we have NOT disabled an algorithm with something like: // +crypto, -algorithm @@ -445,26 +445,31 @@ } else if (HasNoCrypto) { const bool HasSHA2 = (std::find(ItBegin, ItEnd, "+sha2") != ItEnd); const bool HasAES = (std::find(ItBegin, ItEnd, "+aes") != ItEnd); - const bool HasV82a = (std::find(ItBegin, ItEnd, "+v8.2a") != ItEnd); - const bool HasV83a = (std::find(ItBegin, ItEnd, "+v8.3a") != ItEnd); - const bool HasV84a = (std::find(ItBegin, ItEnd, "+v8.4a") != ItEnd); if (!HasSHA2) Features.push_back("-sha2"); if (!HasAES) Features.push_back("-aes"); - if (HasV82a || HasV83a || HasV84a) { + if (AF == "+v8.2a" || AF == "+v8.3a" || AF == "+v8.4a") { Features.push_back("-sm4"); Features.push_back("-sha3"); } } } - const char *Archs[] = {"+v8.6a", "+v8.7a", "+v8.8a", - "+v9.1a", "+v9.2a", "+v9.3a"}; - auto Pos = std::find_first_of(Features.begin(), Features.end(), - std::begin(Archs), std::end(Archs)); - if (Pos != std::end(Features)) + // FIXME: these insertions should ideally be automated using default + // extensions support from the target parser. + if (AF == "+v8.6a" || AF == "+v8.7a" || AF == "+v8.8a" || AF == "+v9.1a" || + AF == "+v9.2a" || AF == "+v9.3a") { + auto Pos = std::find(Features.begin(), Features.end(), AF); Pos = Features.insert(std::next(Pos), {"+i8mm", "+bf16"}); + } + + // For Armv8.8-a/Armv9.3-a or later, FEAT_HBC and FEAT_MOPS are enabled by + // default. + if (AF == "+v8.8a" || AF == "+v9.3a") { + auto Pos = std::find(Features.begin(), Features.end(), AF); + Pos = Features.insert(std::next(Pos), {"+hbc", "+mops"}); + } if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) { Index: clang/lib/Basic/Targets/AArch64.cpp =================================================================== --- clang/lib/Basic/Targets/AArch64.cpp +++ clang/lib/Basic/Targets/AArch64.cpp @@ -226,8 +226,6 @@ void AArch64TargetInfo::getTargetDefinesARMV88A(const LangOptions &Opts, MacroBuilder &Builder) const { - // FIXME: this does not handle the case where MOPS is disabled using +nomops - Builder.defineMacro("__ARM_FEATURE_MOPS", "1"); // Also include the Armv8.7 defines getTargetDefinesARMV87A(Opts, Builder); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits