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:
parent
a4c2e62d60
commit
1021b72bf6
10
gcc/testsuite/gcc.dg/torture/pr103816.c
Normal file
10
gcc/testsuite/gcc.dg/torture/pr103816.c
Normal 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; }
|
@ -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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user