Commit c46c9745 by Martin Sebor Committed by Martin Sebor

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
parent eea4e2ff
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> 2019-03-18 Richard Biener <rguenther@suse.de>
PR middle-end/88945 PR middle-end/88945
......
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> 2019-03-19 H.J. Lu <hongjiu.lu@intel.com>
PR c++/89630 PR c++/89630
......
/* 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
...@@ -4546,9 +4546,9 @@ vrp_prop::check_mem_ref (location_t location, tree ref, ...@@ -4546,9 +4546,9 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
const value_range *vr = NULL; const value_range *vr = NULL;
/* Determine the offsets and increment OFFRANGE for the bounds of each. /* Determine the offsets and increment OFFRANGE for the bounds of each.
The loop computes the the range of the final offset for expressions The loop computes the range of the final offset for expressions such
such as (A + i0 + ... + iN)[CSTOFF] where i0 through iN are SSA_NAMEs as (A + i0 + ... + iN)[CSTOFF] where i0 through iN are SSA_NAMEs in
in some range. */ some range. */
while (TREE_CODE (arg) == SSA_NAME) while (TREE_CODE (arg) == SSA_NAME)
{ {
gimple *def = SSA_NAME_DEF_STMT (arg); gimple *def = SSA_NAME_DEF_STMT (arg);
...@@ -4583,26 +4583,21 @@ vrp_prop::check_mem_ref (location_t location, tree ref, ...@@ -4583,26 +4583,21 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
if (vr->kind () == VR_RANGE) 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 offrange[0] += min;
= wi::to_offset (fold_convert (ptrdiff_type_node, vr->min ())); offrange[1] += max;
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;
}
} }
else 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. */ to OFFRANGE. */
offrange[0] += arrbounds[0]; offrange[0] += arrbounds[0];
offrange[1] += arrbounds[1]; offrange[1] += arrbounds[1];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment