diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2006-10-24 02:12:16 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-10-24 00:12:16 +0000 |
commit | ae5360407bc31e22ac1c79c7a20ef1e225377203 (patch) | |
tree | 0f094604ce261f01a2cff72be5821a4342da1e37 | |
parent | 4d5fc916770f9cb56c3b4b8c81fcc09191e71a52 (diff) | |
download | gcc-ae5360407bc31e22ac1c79c7a20ef1e225377203.zip gcc-ae5360407bc31e22ac1c79c7a20ef1e225377203.tar.gz gcc-ae5360407bc31e22ac1c79c7a20ef1e225377203.tar.bz2 |
re PR tree-optimization/14784 ([Tree-ssa] alias analysis deficiency)
PR tree-optimization/14784
* tree-flow.h (struct var_ann_d): Add is_heapvar bit.
* tree-ssa-structalias.c (get_constraint_for,
intra_create_variable_infos): Set is_heapvar.
* tree-ssa-operands.c (access_can_touch_variable): Do not handle
non-heapvar pointer variables specially.
* gcc.dg/alias-10.c: New test.
From-SVN: r117986
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/alias-10.c | 32 | ||||
-rw-r--r-- | gcc/tree-flow.h | 3 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 2 |
6 files changed, 52 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e31f4b..22f7d0c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2006-10-23 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/14784 + * tree-flow.h (struct var_ann_d): Add is_heapvar bit. + * tree-ssa-structalias.c (get_constraint_for, + intra_create_variable_infos): Set is_heapvar. + * tree-ssa-operands.c (access_can_touch_variable): Do not handle + non-heapvar pointer variables specially. + 2006-10-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> PR middle-end/29335 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0e48cd7..1af046d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-23 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/14784 + * gcc.dg/alias-10.c: New test. + 2006-10-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * gcc.dg/torture/builtin-sin-mpfr-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/alias-10.c b/gcc/testsuite/gcc.dg/alias-10.c new file mode 100644 index 0000000..6e9cb3f --- /dev/null +++ b/gcc/testsuite/gcc.dg/alias-10.c @@ -0,0 +1,32 @@ +/* For PR tree-optimization/14784 */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-details" } */ + +typedef struct bitmap_element_def +{ + unsigned int indx; +} bitmap_element; + +typedef struct bitmap_head_def { + bitmap_element *first; + int using_obstack; +} bitmap_head; +typedef struct bitmap_head_def *bitmap; + +bitmap_element *bitmap_free; + +void foo (bitmap head, bitmap_element *elt) +{ + while (1) + { + /* Alias analysis problems used to prevent us from recognizing + that this condition is invariant. */ + if (head->using_obstack) + bitmap_free = elt; + } +} + + +/* { dg-final { scan-tree-dump-times "Unswitching" 1 "unswitch"} } */ +/* { dg-final { cleanup-tree-dump "unswitch" } } */ diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 447b732..ff1006f 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -184,6 +184,9 @@ struct var_ann_d GTY(()) in the v_may_def list. */ unsigned in_v_may_def_list : 1; + /* True for HEAP and PARM_NOALIAS artificial variables. */ + unsigned is_heapvar : 1; + /* An artificial variable representing the memory location pointed-to by all the pointer symbols that flow-insensitive alias analysis (mostly type-based) considers to be aliased. If the variable is diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 4fa876d..234eace 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1151,11 +1151,11 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, && flag_strict_aliasing && TREE_CODE (ref) != INDIRECT_REF && !MTAG_P (alias) + && !var_ann (alias)->is_heapvar && (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)) /* When the struct has may_alias attached to it, we need not to return true. */ && get_alias_set (base)) diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 1c4a46e..98ab99b 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -2640,6 +2640,7 @@ get_constraint_for (tree t, VEC (ce_s, heap) **results) { heapvar = create_tmp_var_raw (ptr_type_node, "HEAP"); DECL_EXTERNAL (heapvar) = 1; + get_var_ann (heapvar)->is_heapvar = 1; if (referenced_vars) add_referenced_var (heapvar); heapvar_insert (t, heapvar); @@ -4281,6 +4282,7 @@ intra_create_variable_infos (void) { heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)), "PARM_NOALIAS"); + get_var_ann (heapvar)->is_heapvar = 1; DECL_EXTERNAL (heapvar) = 1; if (referenced_vars) add_referenced_var (heapvar); |