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.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

Richard


2020-01-27  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        * tree-vect-loop.c (vectorizable_reduction): Fail gracefully
        for reduction chains that (now) include a call.
---
 gcc/tree-vect-loop.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index b4cfad875ab..53fccb715ef 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -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,

Reply via email to