re PR tree-optimization/69776 (Wrong optimization with aliasing)

2016-02-15  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/69776
	* tree-ssa-sccvn.h (vn_reference_lookup): Adjust prototype.
	* tree-ssa-sccvn.c (vn_reference_lookup): Add parameter to
	indicate whether we can use TBAA to disambiguate against stores.
	Use alias-set zero if not.
	(visit_reference_op_store): Do not use TBAA when looking up
	redundant stores.
	* tree-ssa-pre.c (compute_avail): Use TBAA here.
	(eliminate_dom_walker::before_dom_children): But not when looking
	up redundant stores.

	* gcc.dg/torture/pr69776.c: New testcase.

From-SVN: r233418
This commit is contained in:
Richard Biener 2016-02-15 08:42:38 +00:00 committed by Richard Biener
parent 9e074c0d6d
commit 1c48bff185
6 changed files with 57 additions and 8 deletions

View File

@ -1,3 +1,16 @@
2016-02-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/69776
* tree-ssa-sccvn.h (vn_reference_lookup): Adjust prototype.
* tree-ssa-sccvn.c (vn_reference_lookup): Add parameter to
indicate whether we can use TBAA to disambiguate against stores.
Use alias-set zero if not.
(visit_reference_op_store): Do not use TBAA when looking up
redundant stores.
* tree-ssa-pre.c (compute_avail): Use TBAA here.
(eliminate_dom_walker::before_dom_children): But not when looking
up redundant stores.
2016-02-14 John David Anglin <danglin@gcc.gnu.org> 2016-02-14 John David Anglin <danglin@gcc.gnu.org>
* config/pa/pa.md (absqi2, absghi2, bswaphi2, bswapsi2, bswapdi2): New. * config/pa/pa.md (absqi2, absghi2, bswaphi2, bswapsi2, bswapdi2): New.

View File

@ -1,3 +1,8 @@
2016-02-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/69776
* gcc.dg/torture/pr69776.c: New testcase.
2016-02-14 Thomas Koenig <tkoenig@gcc.gnu.org> 2016-02-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/60526 PR fortran/60526

View File

@ -0,0 +1,28 @@
/* { dg-do run } */
/* { dg-additional-options "-fstrict-aliasing" } */
extern void *malloc (__SIZE_TYPE__);
extern void abort (void);
void __attribute__((noinline,noclone))
foo (int *pi)
{
if (*pi != 1)
abort ();
}
int
main()
{
void *p = malloc(sizeof (double));
int *pi = p;
double *pd = p;
*pi = 1;
int a = *pi;
*pd = 0;
*pi = a;
foo (pi);
return 0;
}

View File

@ -3745,7 +3745,7 @@ compute_avail (void)
vn_reference_t ref; vn_reference_t ref;
vn_reference_lookup (gimple_assign_rhs1 (stmt), vn_reference_lookup (gimple_assign_rhs1 (stmt),
gimple_vuse (stmt), gimple_vuse (stmt),
VN_WALK, &ref); VN_WALK, &ref, true);
if (!ref) if (!ref)
continue; continue;
@ -4208,7 +4208,7 @@ eliminate_dom_walker::before_dom_children (basic_block b)
tree val; tree val;
tree rhs = gimple_assign_rhs1 (stmt); tree rhs = gimple_assign_rhs1 (stmt);
val = vn_reference_lookup (gimple_assign_lhs (stmt), val = vn_reference_lookup (gimple_assign_lhs (stmt),
gimple_vuse (stmt), VN_WALK, NULL); gimple_vuse (stmt), VN_WALK, NULL, false);
if (TREE_CODE (rhs) == SSA_NAME) if (TREE_CODE (rhs) == SSA_NAME)
rhs = VN_INFO (rhs)->valnum; rhs = VN_INFO (rhs)->valnum;
if (val if (val

View File

@ -2230,11 +2230,12 @@ vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type,
number if it exists in the hash table. Return NULL_TREE if it does number if it exists in the hash table. Return NULL_TREE if it does
not exist in the hash table or if the result field of the structure not exist in the hash table or if the result field of the structure
was NULL.. VNRESULT will be filled in with the vn_reference_t was NULL.. VNRESULT will be filled in with the vn_reference_t
stored in the hashtable if one exists. */ stored in the hashtable if one exists. When TBAA_P is false assume
we are looking up a store and treat it as having alias-set zero. */
tree tree
vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind, vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
vn_reference_t *vnresult) vn_reference_t *vnresult, bool tbaa_p)
{ {
vec<vn_reference_op_s> operands; vec<vn_reference_op_s> operands;
struct vn_reference_s vr1; struct vn_reference_s vr1;
@ -2264,6 +2265,8 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
|| !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type, || !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type,
vr1.operands)) vr1.operands))
ao_ref_init (&r, op); ao_ref_init (&r, op);
if (! tbaa_p)
r.ref_alias_set = r.base_alias_set = 0;
vn_walk_kind = kind; vn_walk_kind = kind;
wvnresult = wvnresult =
(vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse, (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
@ -3350,7 +3353,7 @@ visit_reference_op_load (tree lhs, tree op, gimple *stmt)
last_vuse = gimple_vuse (stmt); last_vuse = gimple_vuse (stmt);
last_vuse_ptr = &last_vuse; last_vuse_ptr = &last_vuse;
result = vn_reference_lookup (op, gimple_vuse (stmt), result = vn_reference_lookup (op, gimple_vuse (stmt),
default_vn_walk_kind, NULL); default_vn_walk_kind, NULL, true);
last_vuse_ptr = NULL; last_vuse_ptr = NULL;
/* We handle type-punning through unions by value-numbering based /* We handle type-punning through unions by value-numbering based
@ -3472,7 +3475,7 @@ visit_reference_op_store (tree lhs, tree op, gimple *stmt)
Otherwise, the vdefs for the store are used when inserting into Otherwise, the vdefs for the store are used when inserting into
the table, since the store generates a new memory state. */ the table, since the store generates a new memory state. */
result = vn_reference_lookup (lhs, vuse, VN_NOWALK, NULL); result = vn_reference_lookup (lhs, vuse, VN_NOWALK, NULL, false);
if (result) if (result)
{ {
@ -3487,7 +3490,7 @@ visit_reference_op_store (tree lhs, tree op, gimple *stmt)
&& default_vn_walk_kind == VN_WALK) && default_vn_walk_kind == VN_WALK)
{ {
assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op); assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op);
vn_reference_lookup (assign, vuse, VN_NOWALK, &vnresult); vn_reference_lookup (assign, vuse, VN_NOWALK, &vnresult, false);
if (vnresult) if (vnresult)
{ {
VN_INFO (vdef)->use_processed = true; VN_INFO (vdef)->use_processed = true;

View File

@ -216,7 +216,7 @@ bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
tree vn_reference_lookup_pieces (tree, alias_set_type, tree, tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
vec<vn_reference_op_s> , vec<vn_reference_op_s> ,
vn_reference_t *, vn_lookup_kind); vn_reference_t *, vn_lookup_kind);
tree vn_reference_lookup (tree, tree, vn_lookup_kind, vn_reference_t *); tree vn_reference_lookup (tree, tree, vn_lookup_kind, vn_reference_t *, bool);
void vn_reference_lookup_call (gcall *, vn_reference_t *, vn_reference_t); void vn_reference_lookup_call (gcall *, vn_reference_t *, vn_reference_t);
vn_reference_t vn_reference_insert_pieces (tree, alias_set_type, tree, vn_reference_t vn_reference_insert_pieces (tree, alias_set_type, tree,
vec<vn_reference_op_s> , vec<vn_reference_op_s> ,