diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1cab5ef1cba73c36b5919ce42f40bde7de3763ad..78798b24fa201e4806d4f0363f94343232a6c852 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-11-13 H.J. Lu <hongjiu.lu@intel.com> + Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/29680 + * tree-ssa-operands.c (access_can_touch_variable): Revert fix for + PR 14784. + 2006-11-12 Jason Merrill <jason@redhat.com> Andrew Pinski <pinskia@physics.uc.edu> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4566f8855b437c729afe405e568d52b70735e874..6077396aa68fc2cee171a607ea200f193db38bcf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-11-12 H.J. Lu <hongjiu.lu@intel.com> + Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/29680 + * gcc.dg/alias-11.c: New test. + 2006-11-12 Roger Sayle <roger@eyesopen.com> PR rtl-optimization/29797 diff --git a/gcc/testsuite/gcc.dg/alias-11.c b/gcc/testsuite/gcc.dg/alias-11.c new file mode 100644 index 0000000000000000000000000000000000000000..36175d7c25a80256b68c8b07eae3707fe17f742e --- /dev/null +++ b/gcc/testsuite/gcc.dg/alias-11.c @@ -0,0 +1,111 @@ +/* { dg-do run } */ +/* { dg-require-alias "" } */ +/* { dg-options "-O2" } */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +typedef struct dw_cfi_struct +{ + struct dw_cfi_struct *dw_cfi_next; + const char *dw_cfi_addr; +} +dw_cfi_node; + +typedef struct dw_fde_struct +{ + const char *dw_fde_current_label; + dw_cfi_node *dw_fde_cfi; +} +dw_fde_node; + +dw_cfi_node *cie_cfi_head; +unsigned fde_table_in_use; +dw_fde_node *fde_table; + +__inline__ void +add_cfi (dw_cfi_node **list_head, dw_cfi_node *cfi) +{ + dw_cfi_node **p; + + for (p = list_head; (*p) != ((void *)0); p = &(*p)->dw_cfi_next) + ; + + *p = cfi; +} + +__inline__ struct dw_cfi_struct * +new_cfi (void) +{ + dw_cfi_node *cfi = (dw_cfi_node *) malloc (sizeof (dw_cfi_node)); + + memset (cfi, 0, sizeof (dw_cfi_node)); + return cfi; +} + +char * +dwarf2out_cfi_label (void) +{ + static char label[20]; + static unsigned long label_num = 0; + + sprintf (label, "*.%s%u", "LCFI", (unsigned) (label_num++)); + return label; +} + +void +add_fde_cfi (const char *label, dw_cfi_node *cfi) +{ + if (label) + { + dw_fde_node *fde = fde_table + fde_table_in_use - 1; + + if (*label == 0) + label = dwarf2out_cfi_label (); + + if (fde->dw_fde_current_label == ((void *)0) + || strcmp (label, fde->dw_fde_current_label)) + { + dw_cfi_node *xcfi; + + fde->dw_fde_current_label = label = strdup (label); + + xcfi = new_cfi (); + xcfi->dw_cfi_addr = label; + add_cfi (&fde->dw_fde_cfi, xcfi); + } + + add_cfi (&fde->dw_fde_cfi, cfi); + } + else + add_cfi (&cie_cfi_head, cfi); +} + +int +main () +{ + dw_cfi_node *cfi; + dw_fde_node *fde; + + fde_table_in_use = 1; + fde_table = (dw_fde_node *) realloc (fde_table, + sizeof (dw_fde_node)); + memset (fde_table, 0, sizeof (dw_fde_node)); + cfi = new_cfi (); + add_fde_cfi ("", cfi); + + fde = &fde_table[0]; + cfi = fde->dw_fde_cfi; + + if (cfi == NULL) + abort (); + + if (cfi->dw_cfi_addr == NULL) + abort (); + + if (strcmp ("*.LCFI0", cfi->dw_cfi_addr)) + abort (); + + return 0; +} diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 234eace9b4c2e1c4c2be729c8535ef25697b2609..2c776836ce6ab98b22551bd2a8abbadbcc279763 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1151,11 +1151,16 @@ 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 +#if 0 + /* FIXME: PR tree-optimization/29680. */ + && !var_ann (alias)->is_heapvar +#else + && !POINTER_TYPE_P (TREE_TYPE (alias)) +#endif /* When the struct has may_alias attached to it, we need not to return true. */ && get_alias_set (base))