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.
This commit is contained in:
Richard Biener 2022-01-05 10:14:52 +01:00
parent a4c2e62d60
commit 1021b72bf6
2 changed files with 24 additions and 1 deletions

View File

@ -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; }

View 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. */