mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 03:50:26 +08:00
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:
parent
cc3281454e
commit
832a0c1d09
@ -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
|
||||
|
13
gcc/testsuite/gcc.c-torture/compile/pr26626.c
Normal file
13
gcc/testsuite/gcc.c-torture/compile/pr26626.c
Normal 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;
|
||||
}
|
||||
|
@ -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)))
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user