Use array_at_struct_end_p in tree-chkp.c (PR middle-end/68270).

2017-03-07  Martin Liska  <mliska@suse.cz>

	PR middle-end/68270
	* tree-chkp.c (chkp_may_narrow_to_field): Add new argument ref.
	Use array_at_struct_end_p instead of DECL_CHAIN (field).
	(chkp_narrow_bounds_for_field): Likewise.
	(chkp_parse_array_and_component_ref): Pass one more argument to
	call.
2017-03-07  Martin Liska  <mliska@suse.cz>

	PR middle-end/68270
	* g++.dg/pr68270.C: New test.

From-SVN: r245951
This commit is contained in:
Martin Liska 2017-03-07 15:12:52 +01:00 committed by Martin Liska
parent 5281a167ea
commit a5e9e3e458
4 changed files with 41 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2017-03-07 Martin Liska <mliska@suse.cz>
PR middle-end/68270
* tree-chkp.c (chkp_may_narrow_to_field): Add new argument ref.
Use array_at_struct_end_p instead of DECL_CHAIN (field).
(chkp_narrow_bounds_for_field): Likewise.
(chkp_parse_array_and_component_ref): Pass one more argument to
call.
2017-03-07 Richard Biener <rguenther@suse.de>
* tree-vect-loop-manip.c (slpeel_add_loop_guard): Preserve

View File

@ -1,3 +1,8 @@
2017-03-07 Martin Liska <mliska@suse.cz>
PR middle-end/68270
* g++.dg/pr68270.C: New test.
2017-03-07 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/79901

View File

@ -0,0 +1,16 @@
/* PR71633 */
/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && { ! x32 } } } } */
/* { dg-options "-Werror=chkp -mmpx -fcheck-pointer-bounds -O1 -fchkp-flexible-struct-trailing-arrays" } */
struct a
{
struct
{
int e[1];
} f;
};
int g(a *ptr)
{
return ptr->f.e[1];
}

View File

@ -3266,15 +3266,15 @@ chkp_intersect_bounds (tree bounds1, tree bounds2, gimple_stmt_iterator *iter)
}
/* Return 1 if we are allowed to narrow bounds for addressed FIELD
and 0 othersize. */
and 0 othersize. REF is reference to the field. */
static bool
chkp_may_narrow_to_field (tree field)
chkp_may_narrow_to_field (tree ref, tree field)
{
return DECL_SIZE (field) && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST
&& tree_to_uhwi (DECL_SIZE (field)) != 0
&& !(flag_chkp_flexible_struct_trailing_arrays
&& TREE_CODE(TREE_TYPE(field)) == ARRAY_TYPE
&& !DECL_CHAIN (field))
&& array_at_struct_end_p (ref, true))
&& (!DECL_FIELD_OFFSET (field)
|| TREE_CODE (DECL_FIELD_OFFSET (field)) == INTEGER_CST)
&& (!DECL_FIELD_BIT_OFFSET (field)
@ -3284,14 +3284,15 @@ chkp_may_narrow_to_field (tree field)
}
/* Return 1 if bounds for FIELD should be narrowed to
field's own size. */
field's own size. REF is reference to the field. */
static bool
chkp_narrow_bounds_for_field (tree field)
chkp_narrow_bounds_for_field (tree ref, tree field)
{
HOST_WIDE_INT offs;
HOST_WIDE_INT bit_offs;
if (!chkp_may_narrow_to_field (field))
if (!chkp_may_narrow_to_field (ref, field))
return false;
/* Accesse to compiler generated fields should not cause
@ -3428,7 +3429,8 @@ chkp_parse_array_and_component_ref (tree node, tree *ptr,
if (flag_chkp_narrow_bounds
&& !flag_chkp_narrow_to_innermost_arrray
&& (!last_comp
|| chkp_may_narrow_to_field (TREE_OPERAND (last_comp, 1))))
|| chkp_may_narrow_to_field (var,
TREE_OPERAND (last_comp, 1))))
{
comp_to_narrow = last_comp;
break;
@ -3440,7 +3442,7 @@ chkp_parse_array_and_component_ref (tree node, tree *ptr,
if (innermost_bounds
&& !array_ref_found
&& chkp_narrow_bounds_for_field (field))
&& chkp_narrow_bounds_for_field (var, field))
comp_to_narrow = var;
last_comp = var;