diff options
author | Martin Sebor <msebor@redhat.com> | 2019-03-18 23:48:50 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-03-18 17:48:50 -0600 |
commit | c46c9745aaa1a6e7df1d2421ad906d2a6a30d465 (patch) | |
tree | 1e375010fc08fedcfa5a5fce2bf640b561071291 /gcc | |
parent | eea4e2ff0a3f5e7f37df204c070cc5d9ef339e6e (diff) | |
download | gcc-c46c9745aaa1a6e7df1d2421ad906d2a6a30d465.zip gcc-c46c9745aaa1a6e7df1d2421ad906d2a6a30d465.tar.gz gcc-c46c9745aaa1a6e7df1d2421ad906d2a6a30d465.tar.bz2 |
PR tree-optimization/89720 - Spurious -Warray-bounds warning on a range with max < min
gcc/ChangeLog:
PR tree-optimization/89720
* tree-vrp.c (vrp_prop::check_mem_ref): Treat range with max < min
more conservatively, the same as anti-range.
gcc/testsuite/ChangeLog:
PR tree-optimization/89720
* gcc.dg/Warray-bounds-42.c: New test.
From-SVN: r269785
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Warray-bounds-42.c | 26 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 33 |
4 files changed, 51 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8d41e4..e0df9e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-03-18 Martin Sebor <msebor@redhat.com> + + PR tree-optimization/89720 + * tree-vrp.c (vrp_prop::check_mem_ref): Treat range with max < min + more conservatively, the same as anti-range. + 2019-03-18 Richard Biener <rguenther@suse.de> PR middle-end/88945 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 267b2cd..97bfd50 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-03-18 Martin Sebor <msebor@redhat.com> + + PR tree-optimization/89720 + * gcc.dg/Warray-bounds-42.c: New test. + 2019-03-19 H.J. Lu <hongjiu.lu@intel.com> PR c++/89630 diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-42.c b/gcc/testsuite/gcc.dg/Warray-bounds-42.c new file mode 100644 index 0000000..005e145 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-42.c @@ -0,0 +1,26 @@ +/* PR tree-optimization/89720 - Spurious -Warray-bounds warning on a range + with max < min + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +void f (char*, int); + +#if __SIZEOF_POINTER__ == 8 + +void g (__INT64_TYPE__ i) +{ + char a[65536] = ""; + char *p = a + (i & (__INT64_TYPE__)0xffffffff3fffffffLL); + f (p, *(p - 6)); /* { dg-bogus "\\\[-Warray-bounds" } */ +} + +#elif __SIZEOF_POINTER__ == 4 + +void h (__INT32_TYPE__ i) +{ + char a[65536] = ""; + char *p = a + (i & (__INT32_TYPE__)0x8fffffffLL); + f (p, *(p - 6)); /* { dg-bogus "\\\[-Warray-bounds" } */ +} + +#endif diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 1092fe0..0a17271 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4546,9 +4546,9 @@ vrp_prop::check_mem_ref (location_t location, tree ref, const value_range *vr = NULL; /* Determine the offsets and increment OFFRANGE for the bounds of each. - The loop computes the the range of the final offset for expressions - such as (A + i0 + ... + iN)[CSTOFF] where i0 through iN are SSA_NAMEs - in some range. */ + The loop computes the range of the final offset for expressions such + as (A + i0 + ... + iN)[CSTOFF] where i0 through iN are SSA_NAMEs in + some range. */ while (TREE_CODE (arg) == SSA_NAME) { gimple *def = SSA_NAME_DEF_STMT (arg); @@ -4583,26 +4583,21 @@ vrp_prop::check_mem_ref (location_t location, tree ref, if (vr->kind () == VR_RANGE) { - if (tree_int_cst_lt (vr->min (), vr->max ())) + offset_int min + = wi::to_offset (fold_convert (ptrdiff_type_node, vr->min ())); + offset_int max + = wi::to_offset (fold_convert (ptrdiff_type_node, vr->max ())); + if (min < max) { - offset_int min - = wi::to_offset (fold_convert (ptrdiff_type_node, vr->min ())); - offset_int max - = wi::to_offset (fold_convert (ptrdiff_type_node, vr->max ())); - if (min < max) - { - offrange[0] += min; - offrange[1] += max; - } - else - { - offrange[0] += max; - offrange[1] += min; - } + offrange[0] += min; + offrange[1] += max; } else { - /* Conservatively add [-MAXOBJSIZE -1, MAXOBJSIZE] + /* When MIN >= MAX, the offset is effectively in a union + of two ranges: [-MAXOBJSIZE -1, MAX] and [MIN, MAXOBJSIZE]. + Since there is no way to represent such a range across + additions, conservatively add [-MAXOBJSIZE -1, MAXOBJSIZE] to OFFRANGE. */ offrange[0] += arrbounds[0]; offrange[1] += arrbounds[1]; |