[AArch64][2/2] Add sve_width -moverride tunable
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Fri, 7 Dec 2018 17:05:21 +0000 (17:05 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Fri, 7 Dec 2018 17:05:21 +0000 (17:05 +0000)
On top of the previous patch that implements TARGET_ESTIMATED_POLY_VALUE
and adds an sve_width tuning field to the CPU structs, this patch implements
an -moverride knob to adjust this sve_width field to allow for experimentation.
Again, reminder that this only has an effect when compiling for VLA-SVE that is,
without msve-vector-bits=<foo>. This just adjusts tuning heuristics in the compiler,,
like profitability thresholds for vectorised versioned loops, and others.

It can be used, for example like -moverride=sve_width=256 to set the sve_width
tuning field to 256. Widths outside of the accepted SVE widths [128 - 2048] are rejected
as you'd expect.

    * config/aarch64/aarch64.c (aarch64_tuning_override_functions): Add
    sve_width entry.
    (aarch64_parse_sve_width_string): Define.

    * gcc.target/aarch64/sve/override_sve_width_1.c: New test.

From-SVN: r266898

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/sve/override_sve_width_1.c [new file with mode: 0644]

index 9ee432d2260489705dfa0a67f766111d5b75637b..41fb2da0fbf5e5a7cd655a4a0d48023bc8cda87d 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_tuning_override_functions): Add
+       sve_width entry.
+       (aarch64_parse_sve_width_string): Define.
+
 2018-12-07  Jeff Law  <law@redhat.com>
 
        PR middle-end/87813
index ba9b5ad4efedf87c4ec247683e0435f14a7ef146..ea7e79f758589e79cdee939fd9046df5ece7c80a 100644 (file)
@@ -1086,12 +1086,14 @@ struct aarch64_tuning_override_function
 
 static void aarch64_parse_fuse_string (const char*, struct tune_params*);
 static void aarch64_parse_tune_string (const char*, struct tune_params*);
+static void aarch64_parse_sve_width_string (const char*, struct tune_params*);
 
 static const struct aarch64_tuning_override_function
 aarch64_tuning_override_functions[] =
 {
   { "fuse", aarch64_parse_fuse_string },
   { "tune", aarch64_parse_tune_string },
+  { "sve_width", aarch64_parse_sve_width_string },
   { NULL, NULL }
 };
 
@@ -10834,6 +10836,37 @@ aarch64_parse_tune_string (const char *tune_string,
                                     "tune=");
 }
 
+/* Parse the sve_width tuning moverride string in TUNE_STRING.
+   Accept the valid SVE vector widths allowed by
+   aarch64_sve_vector_bits_enum and use it to override sve_width
+   in TUNE.  */
+
+static void
+aarch64_parse_sve_width_string (const char *tune_string,
+                               struct tune_params *tune)
+{
+  int width = -1;
+
+  int n = sscanf (tune_string, "%d", &width);
+  if (n == EOF)
+    {
+      error ("invalid format for sve_width");
+      return;
+    }
+  switch (width)
+    {
+    case SVE_128:
+    case SVE_256:
+    case SVE_512:
+    case SVE_1024:
+    case SVE_2048:
+      break;
+    default:
+      error ("invalid sve_width value: %d", width);
+    }
+  tune->sve_width = (enum aarch64_sve_vector_bits_enum) width;
+}
+
 /* Parse TOKEN, which has length LENGTH to see if it is a tuning option
    we understand.  If it is, extract the option string and handoff to
    the appropriate function.  */
index 8f63e819e8bf041e4a80f5f79487b9f5bd0d9285..698a744ca2bac781885230fd50cc3da856afecc4 100644 (file)
@@ -1,3 +1,7 @@
+2018-12-07  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/aarch64/sve/override_sve_width_1.c: New test.
+
 2018-12-07  Jeff Law  <law@redhat.com>
 
        PR middle-end/87813
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/override_sve_width_1.c b/gcc/testsuite/gcc.target/aarch64/sve/override_sve_width_1.c
new file mode 100644 (file)
index 0000000..3752fdc
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -moverride=sve_width=512" } */
+
+void __attribute__((noinline, noclone))
+vadd (int *dst, int *op1, int *op2, int count)
+{
+  for (int i = 0; i < count; ++i)
+    dst[i] = op1[i] + op2[i];
+}