Commit 832a0c1d by Daniel Berlin Committed by Daniel Berlin

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
parent cc328145
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> 2006-05-02 Jakub Jelinek <jakub@redhat.com>
PR c++/26943 PR c++/26943
......
typedef union {
int d;
} U;
int rv;
void breakme()
{
U *rv0;
U *pretmp = (U*)&rv;
rv0 = pretmp;
rv0->d = 42;
}
...@@ -1118,11 +1118,32 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, ...@@ -1118,11 +1118,32 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
{ return (struct foos *)&foo; } { return (struct foos *)&foo; }
(taken from 20000623-1.c) (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 else if (ref
&& flag_strict_aliasing && flag_strict_aliasing
&& TREE_CODE (ref) != INDIRECT_REF && TREE_CODE (ref) != INDIRECT_REF
&& !MTAG_P (alias) && !MTAG_P (alias)
&& (TREE_CODE (base) != INDIRECT_REF
|| TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
&& !AGGREGATE_TYPE_P (TREE_TYPE (alias)) && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
&& TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
&& !POINTER_TYPE_P (TREE_TYPE (alias))) && !POINTER_TYPE_P (TREE_TYPE (alias)))
......
...@@ -4485,7 +4485,7 @@ compute_points_to_sets (struct alias_info *ai) ...@@ -4485,7 +4485,7 @@ compute_points_to_sets (struct alias_info *ai)
dump_constraints (dump_file); dump_constraints (dump_file);
} }
if (need_to_solve ()) if (1 || need_to_solve ())
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
......
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