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

Reply via email to