[AArch64][SVE] Fix IFN_COND_FMLA movprfx alternative
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 20 Dec 2018 16:32:46 +0000 (16:32 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 20 Dec 2018 16:32:46 +0000 (16:32 +0000)
This patch fixes a cut-&-pasto in the (match_dup 4) version of
"cond_<SVE_COND_FP_TERNARY:optab><SVE_F:mode>".  (It's a shame
that there's so much cut-&-paste in these patterns, but it's hard
to avoid without more infrastructure.)

2018-12-20  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64-sve.md (*cond_<optab><mode>_4): Use
sve_fmla_op rather than sve_fmad_op for the movprfx alternative.

gcc/testsuite/
* gcc.target/aarch64/sve/fmla_2.c: New test.
* gcc.target/aarch64/sve/fmla_2_run.c: Likewise

From-SVN: r267303

gcc/ChangeLog
gcc/config/aarch64/aarch64-sve.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/sve/fmla_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/fmla_2_run.c [new file with mode: 0644]

index 4a7fb435d202c285fae86546903d08720bbc1169..7d9c5c603258bc58c82df9e422523c394686ee3d 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/aarch64/aarch64-sve.md (*cond_<optab><mode>_4): Use
+       sve_fmla_op rather than sve_fmad_op for the movprfx alternative.
+
 2018-12-20  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/88214
index 8569a8e1ea7466c67091feb4e6f25603817436fa..e47e3bab71c2432f0321c4e9969fcc3e3994e5ac 100644 (file)
   "TARGET_SVE"
   "@
    <sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>
-   movprfx\t%0, %4\;<sve_fmad_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
+   movprfx\t%0, %4\;<sve_fmla_op>\t%0.<Vetype>, %1/m, %2.<Vetype>, %3.<Vetype>"
   [(set_attr "movprfx" "*,yes")]
 )
 
index 2a78f9722a9e136ddd8d47484b7287f40929f076..da6182cd269a669161e30040dd3dfe04be27f275 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.target/aarch64/sve/fmla_2.c: New test.
+       * gcc.target/aarch64/sve/fmla_2_run.c: Likewise
+
 2018-12-20  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/84053
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fmla_2.c b/gcc/testsuite/gcc.target/aarch64/sve/fmla_2.c
new file mode 100644 (file)
index 0000000..5c04bcd
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-options "-O3" } */
+
+#include <stdint.h>
+
+#define N 55
+
+void __attribute__ ((noipa))
+f (double *restrict a, double *restrict b, double *restrict c,
+   double *restrict d, double *restrict e, int64_t *restrict cond)
+{
+  for (int i = 0; i < N; ++i)
+    {
+      a[i] = cond[i] ? __builtin_fma (c[i], d[i], e[i]) : e[i];
+      b[i] = cond[i] ? __builtin_fma (c[i], e[i], d[i]) : d[i];
+    }
+}
+
+/* { dg-final { scan-assembler-times {\tfmla\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d, z[0-9]+\.d\n} 2 } } */
+/* { dg-final { scan-assembler-not {\tfmad\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/fmla_2_run.c b/gcc/testsuite/gcc.target/aarch64/sve/fmla_2_run.c
new file mode 100644 (file)
index 0000000..6d9a2a3
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do run { target aarch64_sve_hw } } */
+/* { dg-options "-O3" } */
+
+#include "fmla_2.c"
+
+int __attribute__ ((optimize (1)))
+main (void)
+{
+  double a[N], b[N], c[N], d[N], e[N];
+  int64_t cond[N];
+
+  for (int i = 0; i < N; ++i)
+    {
+      c[i] = i + i % 5;
+      d[i] = i + i % 7;
+      e[i] = i + i % 9;
+      cond[i] = i % 3;
+    }
+
+  f (a, b, c, d, e, cond);
+
+  for (int i = 0; i < N; ++i)
+    if (a[i] != (cond[i] ? __builtin_fma (c[i], d[i], e[i]) : e[i])
+       || b[i] != (cond[i] ? __builtin_fma (c[i], e[i], d[i]) : d[i]))
+      __builtin_abort ();
+
+  return 0;
+}