diff options
author | Richard Biener <rguenther@suse.de> | 2024-10-28 09:52:08 +0100 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-10-28 11:31:38 +0100 |
commit | 19722308a286d9a00eead8ac82b948da8c4ca38b (patch) | |
tree | a74ba9d750fb515df5301196bb3975fc9c388098 /gcc | |
parent | 6c45281a208652143c128541d80ce66da6d49868 (diff) | |
download | gcc-19722308a286d9a00eead8ac82b948da8c4ca38b.zip gcc-19722308a286d9a00eead8ac82b948da8c4ca38b.tar.gz gcc-19722308a286d9a00eead8ac82b948da8c4ca38b.tar.bz2 |
tree-optimization/117307 - STMT_VINFO_SLP_VECT_ONLY mis-computation
STMT_VINFO_SLP_VECT_ONLY isn't properly computed as union of all
group members and when the group is later split due to duplicates
not all sub-groups inherit the flag.
PR tree-optimization/117307
* tree-vect-data-refs.cc (vect_analyze_data_ref_accesses):
Properly compute STMT_VINFO_SLP_VECT_ONLY. Set it on all
parts of a split group.
* gcc.dg/vect/pr117307.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr117307.c | 17 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.cc | 19 |
2 files changed, 30 insertions, 6 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr117307.c b/gcc/testsuite/gcc.dg/vect/pr117307.c new file mode 100644 index 0000000..dc853d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr117307.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=x86-64-v4" { target { x86_64-*-* i?86-*-* } } } */ + +int a; +float *b, *c; +float d; +void e() { + for (; a; a++) { + if (d) { + c[0] = b[0]; + c[1] = b[1]; + } else if (b[1]) + c[0] = b[0] * 0; + b += 2; + c += 2; + } +} diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc index 202af7a..54ad5c8 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -3565,12 +3565,15 @@ vect_analyze_data_ref_accesses (vec_info *vinfo, DR_GROUP_NEXT_ELEMENT (lastinfo) = stmtinfo_b; lastinfo = stmtinfo_b; - STMT_VINFO_SLP_VECT_ONLY (stmtinfo_a) - = !can_group_stmts_p (stmtinfo_a, stmtinfo_b, false); + if (! STMT_VINFO_SLP_VECT_ONLY (stmtinfo_a)) + { + STMT_VINFO_SLP_VECT_ONLY (stmtinfo_a) + = !can_group_stmts_p (stmtinfo_a, stmtinfo_b, false); - if (dump_enabled_p () && STMT_VINFO_SLP_VECT_ONLY (stmtinfo_a)) - dump_printf_loc (MSG_NOTE, vect_location, - "Load suitable for SLP vectorization only.\n"); + if (dump_enabled_p () && STMT_VINFO_SLP_VECT_ONLY (stmtinfo_a)) + dump_printf_loc (MSG_NOTE, vect_location, + "Load suitable for SLP vectorization only.\n"); + } if (init_b == init_prev && !to_fixup.add (DR_GROUP_FIRST_ELEMENT (stmtinfo_a)) @@ -3614,7 +3617,11 @@ vect_analyze_data_ref_accesses (vec_info *vinfo, { DR_GROUP_NEXT_ELEMENT (g) = DR_GROUP_NEXT_ELEMENT (next); if (!newgroup) - newgroup = next; + { + newgroup = next; + STMT_VINFO_SLP_VECT_ONLY (newgroup) + = STMT_VINFO_SLP_VECT_ONLY (grp); + } else DR_GROUP_NEXT_ELEMENT (ng) = next; ng = next; |