aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXi Ruoyao <xry111@xry111.site>2024-08-22 21:18:29 +0800
committerXi Ruoyao <xry111@xry111.site>2024-08-26 20:08:20 +0800
commitd3e71b99194bff878d3bf3b35f9528a350d10df9 (patch)
treeea6d536f80d1ec107e0f075862182c51e991d0b8
parent3b78aa3e316a22b4ae477c91866d47f654f129b1 (diff)
downloadgcc-d3e71b99194bff878d3bf3b35f9528a350d10df9.zip
gcc-d3e71b99194bff878d3bf3b35f9528a350d10df9.tar.gz
gcc-d3e71b99194bff878d3bf3b35f9528a350d10df9.tar.bz2
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 <rguenther@suse.de>
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr116438.c14
-rw-r--r--gcc/tree-vect-stmts.cc3
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 0000000..97ab018
--- /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 385e631..9eb73a5 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;