aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2006-11-13 12:37:29 +0000
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-11-13 12:37:29 +0000
commit5da10ac71f76160cb5f94912e29b449cfd2de04d (patch)
treeecd30a9a95035f0a0d537ed6cda2b05b7de3d352
parent84816907e4bda26eb7a21a5d3d52eb876fcd91dd (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/alias-11.c111
-rw-r--r--gcc/tree-ssa-operands.c7
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))