diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2006-11-13 12:37:29 +0000 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-11-13 12:37:29 +0000 |
commit | 5da10ac71f76160cb5f94912e29b449cfd2de04d (patch) | |
tree | ecd30a9a95035f0a0d537ed6cda2b05b7de3d352 | |
parent | 84816907e4bda26eb7a21a5d3d52eb876fcd91dd (diff) | |
download | gcc-5da10ac71f76160cb5f94912e29b449cfd2de04d.zip gcc-5da10ac71f76160cb5f94912e29b449cfd2de04d.tar.gz gcc-5da10ac71f76160cb5f94912e29b449cfd2de04d.tar.bz2 |
re PR tree-optimization/29680 (Misscompilation of spec2006 gcc)
PR tree-optimization/29680
* tree-ssa-operands.c (access_can_touch_variable): Revert fix for
PR 14784.
* gcc.dg/alias-11.c: New test.
Co-Authored-By: Zdenek Dvorak <dvorakz@suse.cz>
From-SVN: r118754
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/alias-11.c | 111 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 7 |
4 files changed, 130 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1cab5ef..78798b2 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 4566f88..6077396 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 0000000..36175d7 --- /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 234eace..2c77683 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)) |