https://gcc.gnu.org/g:d3e71b99194bff878d3bf3b35f9528a350d10df9

commit r15-3189-gd3e71b99194bff878d3bf3b35f9528a350d10df9
Author: Xi Ruoyao <xry...@xry111.site>
Date:   Thu Aug 22 21:18:29 2024 +0800

    vect: Fix STMT_VINFO_DEF_TYPE check for odd/even widen mult [PR116348]
    
    After fixing PR116142 some code started to trigger an ICE with -O3
    -march=znver4.  Per Richard Biener who actually made this fix:
    
    "supportable_widening_operation fails at transform time - that's likely
    because vectorizable_reduction "puns" defs to internal_def"
    
    so the check should use STMT_VINFO_REDUC_DEF instead of checking if
    STMT_VINFO_DEF_TYPE is vect_reduction_def.
    
    gcc/ChangeLog:
    
            PR tree-optimization/116348
            * tree-vect-stmts.cc (supportable_widening_operation): Use
            STMT_VINFO_REDUC_DEF (x) instead of
            STMT_VINFO_DEF_TYPE (x) == vect_reduction_def.
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/116348
            * gcc.c-torture/compile/pr116438.c: New test.
    
    Co-authored-by: Richard Biener <rguent...@suse.de>

Diff:
---
 gcc/testsuite/gcc.c-torture/compile/pr116438.c | 14 ++++++++++++++
 gcc/tree-vect-stmts.cc                         |  3 +--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.c-torture/compile/pr116438.c 
b/gcc/testsuite/gcc.c-torture/compile/pr116438.c
new file mode 100644
index 000000000000..97ab0181ab8b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr116438.c
@@ -0,0 +1,14 @@
+/* { dg-additional-options "-march=znver4" { target x86_64-*-* i?86-*-* } } */
+
+int *a;
+int b;
+long long c, d;
+void
+e (int f)
+{
+  for (; f; f++)
+    {
+      d += (long long)a[f] * b;
+      c += (long long)a[f] * 3;
+    }
+}
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 385e63163c24..9eb73a599339 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -14193,8 +14193,7 @@ supportable_widening_operation (vec_info *vinfo,
              by STMT is only directly used in the reduction statement.  */
          tree lhs = gimple_assign_lhs (vect_orig_stmt (stmt_info)->stmt);
          stmt_vec_info use_stmt_info = loop_info->lookup_single_use (lhs);
-         if (use_stmt_info
-             && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
+         if (use_stmt_info && STMT_VINFO_REDUC_DEF (use_stmt_info))
            return true;
         }
       c1 = VEC_WIDEN_MULT_LO_EXPR;

Reply via email to