From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id E4EE1385840E; Tue, 21 Sep 2021 08:39:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E4EE1385840E MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-3724] tree-optimization/102421 - copy alignment info when splitting groups X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: 6e6bf4cd21af39a7923bae007517ab43a4c3b36a X-Git-Newrev: 55b989de7679a486ad674fb154408de26ac96467 Message-Id: <20210921083946.E4EE1385840E@sourceware.org> Date: Tue, 21 Sep 2021 08:39:46 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Sep 2021 08:39:47 -0000 https://gcc.gnu.org/g:55b989de7679a486ad674fb154408de26ac96467 commit r12-3724-g55b989de7679a486ad674fb154408de26ac96467 Author: Richard Biener Date: Tue Sep 21 09:39:12 2021 +0200 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 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. Diff: --- gcc/testsuite/g++.dg/vect/pr102421.cc | 34 ++++++++++++++++++++++++++++++++++ gcc/tree-vect-loop.c | 19 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/gcc/testsuite/g++.dg/vect/pr102421.cc b/gcc/testsuite/g++.dg/vect/pr102421.cc new file mode 100644 index 00000000000..ccab6955c67 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr102421.cc @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-O3" } */ +/* { dg-additional-options "-march=armv8.2-a+sve" { target aarch64-*-* } } */ + +#include + +template +struct BasicVector +{ + ValueType& operator[](int i) { return x_[i]; } + ValueType operator[](int i) const { return x_[i]; } + ValueType x_[3]; +}; +typedef int ivec1[3]; +typedef BasicVector RVec1; +void foo ( + std::vector &x_, + std::vector &xp_, + int homenr, + unsigned short* cFREEZE, + const ivec1* nFreeze) +{ + std::vector xp = xp_; + std::vector x = x_; + for (int i = 0; i < homenr; i++) + { + const int g = cFREEZE[i]; + for (int d = 0; d < 3; d++) + { + if (nFreeze[g][d] == 0) + x[i][d] = xp[i][d]; + } + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 5a5b8da2e77..e94356d76e9 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; } }