diff mbox series

tree-optimization/102421 - copy alignment info when splitting groups

Message ID 6spop47q-s111-s44-17s3-snq0qr767417@fhfr.qr
State New
Headers show
Series tree-optimization/102421 - copy alignment info when splitting groups | expand

Commit Message

Richard Biener Sept. 21, 2021, 8:39 a.m. UTC
This makes sure to copy and adjust alignment info when we are splitting
DR groups after alignment analysis.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

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.
---
 gcc/testsuite/g++.dg/vect/pr102421.cc | 34 +++++++++++++++++++++++++++
 gcc/tree-vect-loop.c                  | 19 +++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/vect/pr102421.cc
diff mbox series

Patch

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 <vector>
+
+template<typename ValueType>
+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<double> RVec1;
+void foo (
+   std::vector<RVec1> &x_,
+   std::vector<RVec1> &xp_,
+   int homenr,
+   unsigned short* cFREEZE,
+   const ivec1* nFreeze)
+{
+    std::vector<RVec1> xp = xp_;
+    std::vector<RVec1> 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;
 		}
 	    }