]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/103816 - detect offset overflow in SLP group analysis
authorRichard Biener <rguenther@suse.de>
Wed, 5 Jan 2022 09:14:52 +0000 (10:14 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 5 Jan 2022 10:56:36 +0000 (11:56 +0100)
This makes sure to detect overflow when computing DR_GROUP_GAP
and DR_GROUP_SIZE more thoroughly so artificial testcases like the
added one are not fooling the existing check.

2022-01-05  Richard Biener  <rguenther@suse.de>

PR tree-optimization/103816
* tree-vect-data-refs.c (vect_analyze_group_access_1): Also
check DR_GROUP_GAP compute for overflow and representability.

* gcc.dg/torture/pr103816.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr103816.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr103816.c b/gcc/testsuite/gcc.dg/torture/pr103816.c
new file mode 100644 (file)
index 0000000..769036a
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-w" } */
+
+extern struct {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+  unsigned char d;
+} g[];
+void main() { g[0].b = (g[0].b & g[4].b) * g[2305843009213693952ULL].c; }
index 2b3ec6289de4216b9d3ff64d0d7f038606f0cf42..dd20ed974af3cee00ca215a15945620ddb8881a7 100644 (file)
@@ -2721,7 +2721,20 @@ vect_analyze_group_access_1 (vec_info *vinfo, dr_vec_info *dr_info)
           /* Check that the distance between two accesses is equal to the type
              size. Otherwise, we have gaps.  */
           diff = (TREE_INT_CST_LOW (DR_INIT (data_ref))
-                  - TREE_INT_CST_LOW (prev_init)) / type_size;
+                 - TREE_INT_CST_LOW (prev_init)) / type_size;
+         if (diff < 1 || diff > UINT_MAX)
+           {
+             /* For artificial testcases with array accesses with large
+                constant indices we can run into overflow issues which
+                can end up fooling the groupsize constraint below so
+                check the individual gaps (which are represented as
+                unsigned int) as well.  */
+             if (dump_enabled_p ())
+               dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                "interleaved access with gap larger "
+                                "than representable\n");
+             return false;
+           }
          if (diff != 1)
            {
              /* FORNOW: SLP of accesses with gaps is not supported.  */