re PR tree-optimization/26626 (ICE in in add_virtual_operand)

2006-05-02  Daniel Berlin  <dberlin@dberlin.org>

	Fix PR tree-optimization/26626
	* tree-ssa-structalias.c (compute_points_to_sets): For now, solve
	always.
	* tree-ssa-operands.c (access_can_touch_variable): Allow
	typecasting through union pointers.

From-SVN: r113493
This commit is contained in:
Daniel Berlin 2006-05-03 03:19:22 +00:00 committed by Daniel Berlin
parent cc3281454e
commit 832a0c1d09
4 changed files with 43 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2006-05-02 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/26626
* tree-ssa-structalias.c (compute_points_to_sets): For now, solve
always.
* tree-ssa-operands.c (access_can_touch_variable): Allow
typecasting through union pointers.
2006-05-02 Jakub Jelinek <jakub@redhat.com>
PR c++/26943

View File

@ -0,0 +1,13 @@
typedef union {
int d;
} U;
int rv;
void breakme()
{
U *rv0;
U *pretmp = (U*)&rv;
rv0 = pretmp;
rv0->d = 42;
}

View File

@ -1118,11 +1118,32 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
{ return (struct foos *)&foo; }
(taken from 20000623-1.c)
The docs also say/imply that access through union pointers
is legal (but *not* if you take the address of the union member,
i.e. the inverse), such that you can do
typedef union {
int d;
} U;
int rv;
void breakme()
{
U *rv0;
U *pretmp = (U*)&rv;
rv0 = pretmp;
rv0->d = 42;
}
To implement this, we just punt on accesses through union
pointers entirely.
*/
else if (ref
&& flag_strict_aliasing
&& TREE_CODE (ref) != INDIRECT_REF
&& !MTAG_P (alias)
&& (TREE_CODE (base) != INDIRECT_REF
|| TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
&& !AGGREGATE_TYPE_P (TREE_TYPE (alias))
&& TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
&& !POINTER_TYPE_P (TREE_TYPE (alias)))

View File

@ -4485,7 +4485,7 @@ compute_points_to_sets (struct alias_info *ai)
dump_constraints (dump_file);
}
if (need_to_solve ())
if (1 || need_to_solve ())
{
if (dump_file)
fprintf (dump_file,