aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-09-21 09:39:12 +0200
committerRichard Biener <rguenther@suse.de>2021-09-21 10:39:33 +0200
commit55b989de7679a486ad674fb154408de26ac96467 (patch)
tree11571254f03b1d6de6da84ae99d8eafc4526d255 /gcc/tree-vect-loop.c
parent6e6bf4cd21af39a7923bae007517ab43a4c3b36a (diff)
downloadgcc-55b989de7679a486ad674fb154408de26ac96467.zip
gcc-55b989de7679a486ad674fb154408de26ac96467.tar.gz
gcc-55b989de7679a486ad674fb154408de26ac96467.tar.bz2
tree-optimization/102421 - copy alignment info when splitting groups
This makes sure to copy and adjust alignment info when we are splitting DR groups after alignment analysis. 2021-09-21 Richard Biener <rguenther@suse.de> PR tree-optimization/102421 * tree-vect-loop.c (vect_dissolve_slp_only_groups): Copy and adjust alignment info. * g++.dg/vect/pr102421.cc: New testcase.
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 5a5b8da..e94356d 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -2047,6 +2047,7 @@ vect_dissolve_slp_only_groups (loop_vec_info loop_vinfo)
if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
{
stmt_vec_info first_element = DR_GROUP_FIRST_ELEMENT (stmt_info);
+ dr_vec_info *dr_info = STMT_VINFO_DR_INFO (first_element);
unsigned int group_size = DR_GROUP_SIZE (first_element);
/* Check if SLP-only groups. */
@@ -2067,6 +2068,24 @@ vect_dissolve_slp_only_groups (loop_vec_info loop_vinfo)
DR_GROUP_GAP (vinfo) = 0;
else
DR_GROUP_GAP (vinfo) = group_size - 1;
+ /* Duplicate and adjust alignment info, it needs to
+ be present on each group leader, see dr_misalignment. */
+ if (vinfo != first_element)
+ {
+ dr_vec_info *dr_info2 = STMT_VINFO_DR_INFO (vinfo);
+ dr_info2->target_alignment = dr_info->target_alignment;
+ int misalignment = dr_info->misalignment;
+ if (misalignment != DR_MISALIGNMENT_UNKNOWN)
+ {
+ HOST_WIDE_INT diff
+ = (TREE_INT_CST_LOW (DR_INIT (dr_info2->dr))
+ - TREE_INT_CST_LOW (DR_INIT (dr_info->dr)));
+ unsigned HOST_WIDE_INT align_c
+ = dr_info->target_alignment.to_constant ();
+ misalignment = (misalignment + diff) % align_c;
+ }
+ dr_info2->misalignment = misalignment;
+ }
vinfo = next;
}
}