https://github.com/labrinea created https://github.com/llvm/llvm-project/pull/80540
This patch allows using the name "rdma" as an alias for "rdm". The name makes its way to target attributes as well as the command line via the -march and -mcpu options. The motivation was originally to support this in Function Multi Versioning but it also makes sense to align with GCC on the command line. >From 0804c8c74d940a49c6a21722b136d0b090458242 Mon Sep 17 00:00:00 2001 From: Alexandros Lamprineas <alexandros.lamprin...@arm.com> Date: Tue, 30 Jan 2024 11:17:55 +0000 Subject: [PATCH] [TargetParser][AArch64] Add alias for FEAT_RDM. This patch allows using the name "rdma" as an alias for "rdm". The name makes its way to target attributes as well as the command line via the -march and -mcpu options. The motivation was originally to support this in Function Multi Versioning but it also makes sense to align with GCC on the command line. --- clang/docs/ReleaseNotes.rst | 6 ++++++ clang/test/CodeGen/attr-target-version.c | 6 +++--- clang/test/Driver/aarch64-rdm.c | 3 +++ clang/test/Sema/attr-target-clones-aarch64.c | 2 +- clang/test/SemaCXX/attr-target-version.cpp | 1 + .../llvm/TargetParser/AArch64TargetParser.h | 13 ++++++++----- llvm/lib/TargetParser/AArch64TargetParser.cpp | 15 +++++++++++++-- 7 files changed, 35 insertions(+), 11 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e634db3c718c9..5d525b74c056d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -222,6 +222,12 @@ X86 Support Arm and AArch64 Support ^^^^^^^^^^^^^^^^^^^^^^^ +- An alias identifier (rdma) has been added for targeting the AArch64 + Architecture Extension which uses Rounding Doubling Multiply Accumulate + instructions (rdm). The identifier is available on the command line as + a feature modifier for -march and -mcpu as well as via target attributes + like ``target_version`` or ``target_clones``. + Android Support ^^^^^^^^^^^^^^^ diff --git a/clang/test/CodeGen/attr-target-version.c b/clang/test/CodeGen/attr-target-version.c index 2a96697e4291b..2ad6f3a5b0c44 100644 --- a/clang/test/CodeGen/attr-target-version.c +++ b/clang/test/CodeGen/attr-target-version.c @@ -39,7 +39,7 @@ inline int __attribute__((target_version("memtag3+rcpc3+mops"))) fmv_inline(void inline int __attribute__((target_version("aes+dotprod"))) fmv_inline(void) { return 13; } inline int __attribute__((target_version("simd+fp16fml"))) fmv_inline(void) { return 14; } inline int __attribute__((target_version("fp+sm4"))) fmv_inline(void) { return 15; } -inline int __attribute__((target_version("lse+rdm"))) fmv_inline(void) { return 16; } +inline int __attribute__((target_version("lse+rdma"))) fmv_inline(void) { return 16; } inline int __attribute__((target_version("default"))) fmv_inline(void) { return 3; } __attribute__((target_version("ls64"))) int fmv_e(void); @@ -385,7 +385,7 @@ int hoo(void) { // CHECK-NEXT: [[TMP59:%.*]] = and i1 true, [[TMP58]] // CHECK-NEXT: br i1 [[TMP59]], label [[RESOLVER_RETURN27:%.*]], label [[RESOLVER_ELSE28:%.*]] // CHECK: resolver_return27: -// CHECK-NEXT: ret ptr @fmv_inline._MlseMrdm +// CHECK-NEXT: ret ptr @fmv_inline._MlseMrdma // CHECK: resolver_else28: // CHECK-NEXT: [[TMP60:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 // CHECK-NEXT: [[TMP61:%.*]] = and i64 [[TMP60]], 32 @@ -673,7 +673,7 @@ int hoo(void) { // // // CHECK: Function Attrs: noinline nounwind optnone -// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MlseMrdm +// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MlseMrdma // CHECK-SAME: () #[[ATTR25:[0-9]+]] { // CHECK-NEXT: entry: // CHECK-NEXT: ret i32 16 diff --git a/clang/test/Driver/aarch64-rdm.c b/clang/test/Driver/aarch64-rdm.c index f2542b381e7c2..62e1a4def4ce1 100644 --- a/clang/test/Driver/aarch64-rdm.c +++ b/clang/test/Driver/aarch64-rdm.c @@ -1,13 +1,16 @@ // RUN: %clang --target=aarch64-none-elf -march=armv8a+rdm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s +// RUN: %clang --target=aarch64-none-elf -march=armv8a+rdma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s // RUN: %clang --target=aarch64-none-elf -mcpu=generic+rdm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s // RUN: %clang --target=aarch64-none-elf -mcpu=falkor -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s // RUN: %clang --target=aarch64-none-elf -mcpu=thunderx2t99 -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s // CHECK-RDM: "-target-feature" "+rdm" // RUN: %clang --target=aarch64-none-elf -march=armv8a+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s +// RUN: %clang --target=aarch64-none-elf -march=armv8a+nordma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s // RUN: %clang --target=aarch64-none-elf -mcpu=generic+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s // CHECK-NORDM-NOT: "-target-feature" "+rdm" // // RUN: %clang --target=aarch64-none-elf -march=armv8.1a -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s // RUN: %clang --target=aarch64-none-elf -march=armv8.1a+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM-DEFAULT %s +// RUN: %clang --target=aarch64-none-elf -march=armv8.1a+nordma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM-DEFAULT %s // CHECK-NORDM-DEFAULT: "-target-feature" "-rdm" diff --git a/clang/test/Sema/attr-target-clones-aarch64.c b/clang/test/Sema/attr-target-clones-aarch64.c index 4054b7c837ec9..0ce277f41884c 100644 --- a/clang/test/Sema/attr-target-clones-aarch64.c +++ b/clang/test/Sema/attr-target-clones-aarch64.c @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -triple aarch64-linux-gnu -fsyntax-only -verify %s -void __attribute__((target_clones("fp16+sve2-aes", "sb+sve2-sha3+rcpc3+mops"))) no_def(void); +void __attribute__((target_clones("fp16+sve2-aes", "sb+sve2-sha3+rcpc3+mops", "rdma"))) no_def(void); // expected-warning@+1 {{unsupported 'default' in the 'target_clones' attribute string; 'target_clones' attribute ignored}} void __attribute__((target_clones("default+sha3"))) warn1(void); diff --git a/clang/test/SemaCXX/attr-target-version.cpp b/clang/test/SemaCXX/attr-target-version.cpp index 5c542ad2e2dca..0bd710c4e282a 100644 --- a/clang/test/SemaCXX/attr-target-version.cpp +++ b/clang/test/SemaCXX/attr-target-version.cpp @@ -7,6 +7,7 @@ void __attribute__((target_version("dotprod"))) no_def(void); void __attribute__((target_version("rdm+fp"))) no_def(void); void __attribute__((target_version("rcpc3"))) no_def(void); void __attribute__((target_version("mops"))) no_def(void); +void __attribute__((target_version("rdma"))) no_def(void); // expected-error@+1 {{no matching function for call to 'no_def'}} void foo(void) { no_def(); } diff --git a/llvm/include/llvm/TargetParser/AArch64TargetParser.h b/llvm/include/llvm/TargetParser/AArch64TargetParser.h index cce9d6db260d7..7c3acfdb82716 100644 --- a/llvm/include/llvm/TargetParser/AArch64TargetParser.h +++ b/llvm/include/llvm/TargetParser/AArch64TargetParser.h @@ -807,14 +807,16 @@ inline constexpr CpuInfo CpuInfos[] = { AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS}))}, }; -// An alias for a CPU. -struct CpuAlias { - StringRef Alias; +// Name alias. +struct Alias { + StringRef AltName; StringRef Name; }; -inline constexpr CpuAlias CpuAliases[] = {{"cobalt-100", "neoverse-n2"}, - {"grace", "neoverse-v2"}}; +inline constexpr Alias CpuAliases[] = {{"cobalt-100", "neoverse-n2"}, + {"grace", "neoverse-v2"}}; + +inline constexpr Alias ExtAliases[] = {{"rdma", "rdm"}}; bool getExtensionFeatures( const AArch64::ExtensionBitset &Extensions, @@ -822,6 +824,7 @@ bool getExtensionFeatures( StringRef getArchExtFeature(StringRef ArchExt); StringRef resolveCPUAlias(StringRef CPU); +StringRef resolveExtAlias(StringRef ArchExt); // Information by Name const ArchInfo *getArchForCpu(StringRef CPU); diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp index 6f7b421f4e080..e36832f563eed 100644 --- a/llvm/lib/TargetParser/AArch64TargetParser.cpp +++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp @@ -69,7 +69,14 @@ bool AArch64::getExtensionFeatures( StringRef AArch64::resolveCPUAlias(StringRef Name) { for (const auto &A : CpuAliases) - if (A.Alias == Name) + if (A.AltName == Name) + return A.Name; + return Name; +} + +StringRef AArch64::resolveExtAlias(StringRef Name) { + for (const auto &A : ExtAliases) + if (A.AltName == Name) return A.Name; return Name; } @@ -91,7 +98,7 @@ void AArch64::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) { Values.push_back(C.Name); for (const auto &Alias : CpuAliases) - Values.push_back(Alias.Alias); + Values.push_back(Alias.AltName); } bool AArch64::isX18ReservedByDefault(const Triple &TT) { @@ -114,6 +121,10 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) { } std::optional<AArch64::ExtensionInfo> AArch64::parseArchExtension(StringRef ArchExt) { + // Resolve aliases first. + ArchExt = resolveExtAlias(ArchExt); + + // Then find the Extension name. for (const auto &A : Extensions) { if (ArchExt == A.Name) return A; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits