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>
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>
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,
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,8 +4583,6 @@ 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
......@@ -4596,13 +4594,10 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
}
else
{
offrange[0] += max;
offrange[1] += min;
}
}
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];
......
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