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;