aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-01-04 10:12:47 +0100
committerRichard Biener <rguenther@suse.de>2022-01-04 10:16:28 +0100
commit1a15451da14410bf2bd6ec8f5baba1014638c67a (patch)
tree0724eed0f643230c2bfae5abad60a2564abe7d15
parent801b2c880c8079934ac186ea1c31f3bf4af5aef3 (diff)
downloadgcc-1a15451da14410bf2bd6ec8f5baba1014638c67a.zip
gcc-1a15451da14410bf2bd6ec8f5baba1014638c67a.tar.gz
gcc-1a15451da14410bf2bd6ec8f5baba1014638c67a.tar.bz2
tree-optimization/103864 - SLP reduction of reductions with conversions
This generalizes the fix for PR103544 to also cover reductions that are not reduction chains and does not consider reductions wrapped in sign conversions for SLP reduction handling. 2022-01-04 Richard Biener <rguenther@suse.de> PR tree-optimization/103864 PR tree-optimization/103544 * tree-vect-slp.c (vect_analyze_slp_instance): Exclude reductions wrapped in conversions from SLP handling. (vect_analyze_slp): Revert PR103544 change. * gcc.dg/vect/pr103864.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr103864.c16
-rw-r--r--gcc/tree-vect-slp.c18
2 files changed, 25 insertions, 9 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr103864.c b/gcc/testsuite/gcc.dg/vect/pr103864.c
new file mode 100644
index 0000000..464d573
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr103864.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3 -fno-tree-reassoc" } */
+
+void
+crash_me (short int *crash_me_result, int i, char crash_me_ptr_0)
+{
+ while (i < 1)
+ {
+ int j;
+
+ for (j = 0; j < 2; ++j)
+ crash_me_result[j] += crash_me_ptr_0 + 1;
+
+ i += 3;
+ }
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 3566752..c3a1681 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -3325,8 +3325,13 @@ vect_analyze_slp_instance (vec_info *vinfo,
= as_a <loop_vec_info> (vinfo)->reductions;
scalar_stmts.create (reductions.length ());
for (i = 0; reductions.iterate (i, &next_info); i++)
- if (STMT_VINFO_RELEVANT_P (next_info)
- || STMT_VINFO_LIVE_P (next_info))
+ if ((STMT_VINFO_RELEVANT_P (next_info)
+ || STMT_VINFO_LIVE_P (next_info))
+ /* ??? Make sure we didn't skip a conversion around a reduction
+ path. In that case we'd have to reverse engineer that conversion
+ stmt following the chain using reduc_idx and from the PHI
+ using reduc_def. */
+ && STMT_VINFO_DEF_TYPE (next_info) == vect_reduction_def)
scalar_stmts.quick_push (next_info);
/* If less than two were relevant/live there's nothing to SLP. */
if (scalar_stmts.length () < 2)
@@ -3419,13 +3424,8 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
vinfo = next;
}
STMT_VINFO_DEF_TYPE (first_element) = vect_internal_def;
- /* It can be still vectorized as part of an SLP reduction.
- ??? But only if we didn't skip a conversion around the group.
- In that case we'd have to reverse engineer that conversion
- stmt following the chain using reduc_idx and from the PHI
- using reduc_def. */
- if (STMT_VINFO_DEF_TYPE (last) == vect_reduction_def)
- loop_vinfo->reductions.safe_push (last);
+ /* It can be still vectorized as part of an SLP reduction. */
+ loop_vinfo->reductions.safe_push (last);
}
/* Find SLP sequences starting from groups of reductions. */