Commit 1c48bff1 by Richard Biener Committed by Richard Biener

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
parent 9e074c0d
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.
......
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
......
/* { 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;
}
...@@ -3745,7 +3745,7 @@ compute_avail (void) ...@@ -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) ...@@ -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
......
...@@ -2230,11 +2230,12 @@ vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
...@@ -216,7 +216,7 @@ bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree, ...@@ -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> ,
......
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