tree-vn.c (vn_lookup_with_vuses): Do not use the alias oracle.
authorRichard Guenther <rguenther@suse.de>
Tue, 20 May 2008 10:03:27 +0000 (10:03 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 20 May 2008 10:03:27 +0000 (10:03 +0000)
2008-05-20  Richard Guenther  <rguenther@suse.de>

* tree-vn.c (vn_lookup_with_vuses): Do not use the alias oracle.

* gcc.c-torture/execute/20080519-1.c: New testcase.

From-SVN: r135605

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20080519-1.c [new file with mode: 0644]
gcc/tree-vn.c

index 8d52eb24aab65d5d151aecbff1cf58b68fbcf5ed..fc28f21667e71778c4e9d45fcb21b65f7a78f9be 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-20  Richard Guenther  <rguenther@suse.de>
+
+       * tree-vn.c (vn_lookup_with_vuses): Do not use the alias oracle.
+
 2008-05-20  Kai Tietz  <kai.tietz@onevision.com>
 
        * config/i386/i386-protos.h (ix86_return_in_memory): Removed.
index 22843a8329e8da236b9be203a4f774d4efd0d90f..e0ac508059d0938c3ee03602b73e2391a37ba365 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-20  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.c-torture/execute/20080519-1.c: New testcase.
+
 2008-05-19  Xinliang David Li  <davidxl@google.com>
 
        * gcc.dg/cdce1.c: Remove test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20080519-1.c b/gcc/testsuite/gcc.c-torture/execute/20080519-1.c
new file mode 100644 (file)
index 0000000..303c4e6
--- /dev/null
@@ -0,0 +1,58 @@
+extern void abort (void);
+
+typedef unsigned long HARD_REG_SET[2];
+HARD_REG_SET reg_class_contents[2];
+
+struct du_chain
+{
+  struct du_chain *next_use;
+  int cl;
+};
+
+void __attribute__((noinline))
+merge_overlapping_regs (HARD_REG_SET *p)
+{
+  if ((*p)[0] != -1 || (*p)[1] != -1)
+    abort ();
+}
+
+void __attribute__((noinline))
+regrename_optimize (struct du_chain *this)
+{
+  HARD_REG_SET this_unavailable;
+  unsigned long *scan_fp_;
+  int n_uses;
+  struct du_chain *last;
+
+  this_unavailable[0] = 0;
+  this_unavailable[1] = 0;
+
+  n_uses = 0;
+  for (last = this; last->next_use; last = last->next_use)
+    {
+      scan_fp_ = reg_class_contents[last->cl];
+      n_uses++;
+      this_unavailable[0] |= ~ scan_fp_[0];
+      this_unavailable[1] |= ~ scan_fp_[1];
+    }
+  if (n_uses < 1)
+    return;
+
+  scan_fp_ = reg_class_contents[last->cl];
+  this_unavailable[0] |= ~ scan_fp_[0];
+  this_unavailable[1] |= ~ scan_fp_[1];
+
+  merge_overlapping_regs (&this_unavailable);
+}
+
+int main()
+{
+  struct du_chain du1 = { 0, 0 };
+  struct du_chain du0 = { &du1, 1 };
+  reg_class_contents[0][0] = -1;
+  reg_class_contents[0][1] = -1;
+  reg_class_contents[1][0] = 0;
+  reg_class_contents[1][1] = 0;
+  regrename_optimize (&du0);
+  return 0;
+}
index 40efea6f8f7222eb73dd062f05ef8eecd3baa46c..1d2e5a55de009ee05e1a19f66a9891c05537e477 100644 (file)
@@ -306,7 +306,9 @@ vn_lookup_with_vuses (tree expr, VEC (tree, gc) *vuses)
   if (is_gimple_min_invariant (expr) || TREE_CODE (expr) == FIELD_DECL)
     return expr;
 
-  return vn_reference_lookup (expr, vuses, true);
+  /* We may not walk the use-def chains here as the alias oracle cannot
+     properly deal with VALUE_HANDLE tree nodes we feed it here.  */
+  return vn_reference_lookup (expr, vuses, false);
 }
 
 static tree