Check for a supported comparison when using EXTRACT_LAST_REDUCTION
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 29 Dec 2019 09:27:43 +0000 (09:27 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 29 Dec 2019 09:27:43 +0000 (09:27 +0000)
The EXTRACT_LAST_REDUCTION handling needs to generate a separate
comparison instruction that feeds the vector mask argument of the
IFN_EXTRACT_LAST call.  We weren't checking whether that comparison
was supported, leading to an ICE on the testcase.

2019-12-29  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-stmts.c (vectorizable_condition): For extract-last
reductions, check that the target supports the required comparison
operation.

gcc/testsuite/
* gcc.dg/vect/vect-cond-12.c: New test.

From-SVN: r279752

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-cond-12.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 922e4048a78591d1654713a95d52cbe55d33711a..fc7af987cdf54873644f28d663471f3977b1db1f 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-29  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-stmts.c (vectorizable_condition): For extract-last
+       reductions, check that the target supports the required comparison
+       operation.
+
 2019-12-27  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/aarch64/iterators.md (V_INT_CONTAINER): Fix VNx2SF entry.
index eec8b0b91dcbbacec76f64044958638e4b84fb44..2e0f36410df9733fd4cf276d57ddd7fcbd12b0f9 100644 (file)
@@ -1,3 +1,7 @@
+2019-12-29  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.dg/vect/vect-cond-12.c: New test.
+
 2019-12-27  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/mixed_size_11.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-12.c b/gcc/testsuite/gcc.dg/vect/vect-cond-12.c
new file mode 100644 (file)
index 0000000..1add96a
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+int
+f (int *x, short *y)
+{
+  int res = 100;
+  for (int i = 0; i < 40; ++i)
+    {
+      if (y[i] > 1)
+       res = x[i];
+      x[i] += y[i];
+    }
+  return res;
+}
index 706da5b4e92008fc8566b5aa3a551dd5a3cbdcfe..feb0b7eb7b3c2526a5ca5794129a87195ed3a92e 100644 (file)
@@ -10081,6 +10081,16 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
       cond_code = SSA_NAME;
     }
 
+  if (TREE_CODE_CLASS (cond_code) == tcc_comparison
+      && reduction_type == EXTRACT_LAST_REDUCTION
+      && !expand_vec_cmp_expr_p (comp_vectype, vec_cmp_type, cond_code))
+    {
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                        "reduction comparison operation not supported.\n");
+      return false;
+    }
+
   if (!vec_stmt)
     {
       if (bitop1 != NOP_EXPR)