diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2006-05-03 03:19:22 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2006-05-03 03:19:22 +0000 |
commit | 832a0c1d090950cef0735c66b16955944b063579 (patch) | |
tree | 80491566ebebc60f4e8ca1eed95ccd44aa7ee361 /gcc | |
parent | cc3281454ebde12095f02b55902a6aa44efee100 (diff) | |
download | gcc-832a0c1d090950cef0735c66b16955944b063579.zip gcc-832a0c1d090950cef0735c66b16955944b063579.tar.gz gcc-832a0c1d090950cef0735c66b16955944b063579.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr26626.c | 13 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 2 |
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 162af2f..6e73c30 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr26626.c b/gcc/testsuite/gcc.c-torture/compile/pr26626.c new file mode 100644 index 0000000..a4e0301 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr26626.c @@ -0,0 +1,13 @@ +typedef union { + int d; +} U; + +int rv; +void breakme() +{ + U *rv0; + U *pretmp = (U*)&rv; + rv0 = pretmp; + rv0->d = 42; +} + diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index e979b4c..68613fe 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -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))) diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 7a00de4..c5b6cab 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -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, |