fpetrogalli created this revision. fpetrogalli added reviewers: sdesmalen, efriedma, SjoerdMeijer. Herald added subscribers: cfe-commits, danielkiss, kristof.beyls. Herald added a project: clang.
This patch is trying to align the interpretation of `-march` on AArch64 to what GCC has, in terms of the target features associated to a value of the architecture version, whether armv8a, armv8.1a, ..., up to armv8.6. Ideally we would like to fully implement the recursive function features(8.X) = {new features of 8.X} U features(8.(X-1)) as GCC describes it in https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#AArch64-Options, under the option `-march=name`. However, in this initial patch we had to stop at version 8.5 of the architecture because there seem to be some disagreement on what is the right set of features for armv8.4a. Once the disagreement is sorted, we will extent the behavior of `AddAArch64DefaultFeatures` to cascade across all the architecture versions. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D83079 Files: clang/lib/Driver/ToolChains/Arch/AArch64.cpp clang/test/Driver/aarch64-cpus.c clang/test/Driver/aarch64-march-default-features.c
Index: clang/test/Driver/aarch64-march-default-features.c =================================================================== --- /dev/null +++ clang/test/Driver/aarch64-march-default-features.c @@ -0,0 +1,27 @@ +// RUN: %clang -target aarch64-linux-gnu -march=armv8.6a -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-8_6,CHECK-8_5 +// RUN: %clang -target aarch64-linux-gnu -march=armv8.6a+nobf16 -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-8_6-NOBF16 +// RUN: %clang -target aarch64-linux-gnu -march=armv8.6a+noi8mm -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-8_6-NOI8MM + +// CHECK-8_6: "-target-feature" "+i8mm" "-target-feature" "+bf16" +// CHECK-8_6-NOBF16-NOT: "-target-feature" "+bf16" +// CHECK-8_6-NOBF16: "-target-feature" "+i8mm" +// CHECK-8_6-NOBF16-SAME: "-target-feature" "-bf16" +// CHECK-8_6-NOI8MM-NOT: "-target-feature" "+i8mm" +// CHECK-8_6-NOI8MM: "-target-feature" "+bf16" +// CHECK-8_6-NOI8MM-SAME: "-target-feature" "-i8mm" + +// RUN: %clang -target aarch64-linux-gnu -march=armv8.5a -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK-8_5 +// RUN: %clang -target aarch64-linux-gnu -march=armv8.5a+nosb -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-8_5-NOSB +// RUN: %clang -target aarch64-linux-gnu -march=armv8.5a+nossbs -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-8_5-NOSSBS +// RUN: %clang -target aarch64-linux-gnu -march=armv8.5a+nopredres -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-8_5-NOPREDRES + +// CHECK-8_5: "-target-feature" "+sb" "-target-feature" "+ssbs" "-target-feature" "+predres" +// CHECK-8_5-NOSB-NOT: "-target-feature" "+sb" +// CHECK-8_5-NOSB: "-target-feature" "+ssbs" "-target-feature" "+predres" +// CHECK-8_5-NOSB-SAME: "-target-feature" "-sb" +// CHECK-8_5-NOSSBS-NOT: "-target-feature" "+ssbs" +// CHECK-8_5-NOSSBS: "-target-feature" "+sb" "-target-feature" "+predres" +// CHECK-8_5-NOSSBS-SAME: "-target-feature" "-ssbs" +// CHECK-8_5-NOPREDRES-NOT: "-target-feature" "+predres" +// CHECK-8_5-NOPREDRES: "-target-feature" "+sb" "-target-feature" "+ssbs" +// CHECK-8_5-NOPREDRES-SAME: "-target-feature" "-predres" Index: clang/test/Driver/aarch64-cpus.c =================================================================== --- clang/test/Driver/aarch64-cpus.c +++ clang/test/Driver/aarch64-cpus.c @@ -643,7 +643,7 @@ // GENERICV85A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+neon" "-target-feature" "+v8.5a" // RUN: %clang -target aarch64 -march=armv8.5-a+fp16 -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV85A-FP16 %s -// GENERICV85A-FP16: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+neon" "-target-feature" "+v8.5a" "-target-feature" "+fullfp16" +// GENERICV85A-FP16: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+neon" "-target-feature" "+v8.5a" "-target-feature" "+sb" "-target-feature" "+ssbs" "-target-feature" "+predres" "-target-feature" "+fullfp16" // RUN: %clang -target aarch64 -march=armv8.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A %s // RUN: %clang -target aarch64 -march=armv8.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV86A %s Index: clang/lib/Driver/ToolChains/Arch/AArch64.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -106,6 +106,31 @@ return true; } +// Add the default target features implied by the architecture +// version. We should agree with GCC on these. A summary of the +// features can be found at +// https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#AArch64-Options, +// under the description of the option `-march=name`. +static void AddAArch64DefaultFeatures(std::vector<StringRef> &Features, + llvm::AArch64::ArchKind ArchKind) { + switch (ArchKind) { + case llvm::AArch64::ArchKind::ARMV8_6A: + Features.push_back("+i8mm"); + Features.push_back("+bf16"); + LLVM_FALLTHROUGH; + case llvm::AArch64::ArchKind::ARMV8_5A: + Features.push_back("+sb"); + Features.push_back("+ssbs"); + Features.push_back("+predres"); + LLVM_FALLTHROUGH; + // TODO: sort out the remaining cases from 8.4a to 8a. Update test + // cases in clang/test/Driver/aarch64-march-default-features.c + // accordingly. + default: + break; + } +} + static bool getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, const ArgList &Args, @@ -114,10 +139,15 @@ 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) || - (Split.second.size() && - !DecodeAArch64Features(D, Split.second, Features, ArchKind))) + + if (!llvm::AArch64::getArchFeatures(ArchKind, Features)) + return false; + + assert(ArchKind != llvm::AArch64::ArchKind::INVALID && + "Invalid architecture."); + AddAArch64DefaultFeatures(Features, ArchKind); + + if (!DecodeAArch64Features(D, Split.second, Features, ArchKind)) return false; return true;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits