[gcc/devel/ranger] vect: Pattern-matched calls in reduction chains

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 18:23:07 GMT 2020


https://gcc.gnu.org/g:1e26ff7391c54c6d30760aea427b6bc2bdb46124

commit 1e26ff7391c54c6d30760aea427b6bc2bdb46124
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Wed Jan 22 18:21:05 2020 +0000

    vect: Pattern-matched calls in reduction chains
    
    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.

Diff:
---
 gcc/ChangeLog        |  5 +++++
 gcc/tree-vect-loop.c | 14 +++++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8f5ec7086fc..4d6ceb69258 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
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,


More information about the Gcc-cvs mailing list