vect: Pattern-matched calls in reduction chains
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 22 Jan 2020 18:21:05 +0000 (18:21 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 28 Jan 2020 11:06:43 +0000 (11:06 +0000)
gcc.dg/pr56350.c started ICEing for SVE in GCC 10 because we
pattern-matched a division reduction:

      a /= 8;

into a signed shift with division semantics:

      ... = IFN_SDIV_POW2 (..., 3);

whereas the reduction code expected it still to be a gassign.

One fix would be to check for a reduction in the pattern matcher
(but current patterns don't generally do that).  Another would be
to fail gracefully for reductions involving calls.  Since we can't
vectorise the reduction either way, and probably have a better shot
with the shift form, this patch goes for the "fail gracefully" approach.

2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-loop.c (vectorizable_reduction): Fail gracefully
for reduction chains that (now) include a call.

gcc/ChangeLog
gcc/tree-vect-loop.c

index 8f5ec7086fc33cecfa958f6e296727b1e379d049..4d6ceb69258fd03175dc2cc5bb9024d9efb780ae 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-loop.c (vectorizable_reduction): Fail gracefully
+       for reduction chains that (now) include a call.
+
 2020-01-28  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR tree-optimization/92822
index b4cfad875ab1dad18a325401b0648bef155056ec..53fccb715efef2521e499e5f764025dc80355f3d 100644 (file)
@@ -6026,10 +6026,18 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
         info_for_reduction to work.  */
       if (STMT_VINFO_LIVE_P (vdef))
        STMT_VINFO_REDUC_DEF (def) = phi_info;
-      if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (vdef->stmt)))
+      gassign *assign = dyn_cast <gassign *> (vdef->stmt);
+      if (!assign)
        {
-         if (!tree_nop_conversion_p (TREE_TYPE (gimple_assign_lhs (vdef->stmt)),
-                                     TREE_TYPE (gimple_assign_rhs1 (vdef->stmt))))
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                            "reduction chain includes calls.\n");
+         return false;
+       }
+      if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (assign)))
+       {
+         if (!tree_nop_conversion_p (TREE_TYPE (gimple_assign_lhs (assign)),
+                                     TREE_TYPE (gimple_assign_rhs1 (assign))))
            {
              if (dump_enabled_p ())
                dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,