aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-01-05 10:14:52 +0100
committerRichard Biener <rguenther@suse.de>2022-01-05 11:56:36 +0100
commit1021b72bf6542f3c08e5404b65063216ee1b06f7 (patch)
tree95640fc940dbfa2256cedfcb893632052a2619c6 /gcc
parenta4c2e62d60f47d47cdd94951e16b0de50495cdab (diff)
downloadgcc-1021b72bf6542f3c08e5404b65063216ee1b06f7.zip
gcc-1021b72bf6542f3c08e5404b65063216ee1b06f7.tar.gz
gcc-1021b72bf6542f3c08e5404b65063216ee1b06f7.tar.bz2
tree-optimization/103816 - detect offset overflow in SLP group analysis
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr103816.c10
-rw-r--r--gcc/tree-vect-data-refs.c15
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr103816.c b/gcc/testsuite/gcc.dg/torture/pr103816.c
new file mode 100644
index 0000000..769036a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr103816.c
@@ -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; }
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 2b3ec62..dd20ed9 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -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. */