re PR tree-optimization/59287 (points-to analysis confused by union accesses)

2013-11-26  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/59287
	* tree-ssa-structalias.c (get_constraint_for_component_ref):
	Remove no longer necessary special-casing of union accesses.

	* gcc.dg/tree-ssa/alias-29.c: New testcase.

From-SVN: r205380
This commit is contained in:
Richard Biener 2013-11-26 09:04:44 +00:00 committed by Richard Biener
parent 65f5c720ad
commit e8e9e1cda4
4 changed files with 38 additions and 23 deletions

View File

@ -1,3 +1,9 @@
2013-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/59287
* tree-ssa-structalias.c (get_constraint_for_component_ref):
Remove no longer necessary special-casing of union accesses.
2013-11-26 Richard Biener <rguenther@suse.de>
* pretty-print.c (output_buffer::~output_buffer): Really

View File

@ -1,3 +1,8 @@
2013-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/59287
* gcc.dg/tree-ssa/alias-29.c: New testcase.
2013-11-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54485

View File

@ -0,0 +1,27 @@
/* { dg-do compile } */
/* { dg-options "-O -fdump-tree-optimized" } */
union X {
int i;
void *p;
};
void bar (int);
int * __attribute__((noinline,noclone))
baz (int *p) { return p; }
void foo (union X *x)
{
struct Y { int i; } ystruct = {};
ystruct.i = * baz (&ystruct.i);
bar (x->i);
}
/* DSE and then DCE should be able to remove all uses of ystruct.
Formerly the union access for the parameter to bar let 'anything'
escape which made the call to bar possibly use ystruct and thus
prevent the store to ystruct.i from being eliminated. The call to
baz makes sure that ystruct has its address taken. */
/* { dg-final { scan-tree-dump-not "ystruct" "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */

View File

@ -3163,29 +3163,6 @@ get_constraint_for_component_ref (tree t, vec<ce_s> *results,
return;
}
/* Handle type-punning through unions. If we are extracting a pointer
from a union via a possibly type-punning access that pointer
points to anything, similar to a conversion of an integer to
a pointer. */
if (!lhs_p)
{
tree u;
for (u = t;
TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
u = TREE_OPERAND (u, 0))
if (TREE_CODE (u) == COMPONENT_REF
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
{
struct constraint_expr temp;
temp.offset = 0;
temp.var = anything_id;
temp.type = ADDRESSOF;
results->safe_push (temp);
return;
}
}
t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize);
/* Pretend to take the address of the base, we'll take care of