re PR tree-optimization/48822 (G++ gets stucks and never finishes compilation when...
authorRichard Guenther <rguenther@suse.de>
Mon, 2 May 2011 13:11:27 +0000 (13:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 2 May 2011 13:11:27 +0000 (13:11 +0000)
2011-05-02  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48822
* tree-ssa-sccvn.c (set_ssa_val_to): Never go up the lattice.
(process_scc): Indicate which iteration we start.

* gcc.dg/torture/pr48822.c: New testcase.

From-SVN: r173250

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr48822.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 6a8d393396930d3d7d1d1ed87ec1725d1658fc05..8d20385cf6e1a0ad09f99f230929b377691c497b 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-02  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48822
+       * tree-ssa-sccvn.c (set_ssa_val_to): Never go up the lattice.
+       (process_scc): Indicate which iteration we start.
+
 2011-05-02  Jan Hubicka  <jh@suse.cz>
 
        * lto-section-in.c (lto_input_1_unsigned): Move to lto-streamer.h
index 769d8658bbff5b217aa5d2768b2f6a3d0031f466..02722cf34022392da90b75d59a6e8c4e7d2c530f 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-02  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48822
+       * gcc.dg/torture/pr48822.c: New testcase.
+
 2011-05-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/47969
diff --git a/gcc/testsuite/gcc.dg/torture/pr48822.c b/gcc/testsuite/gcc.dg/torture/pr48822.c
new file mode 100644 (file)
index 0000000..b619f36
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+void foo (int *, int *);
+int bar ()
+{
+  int a = 0;
+  int b = 0;
+  if (b != 0)
+    {
+      int ax = a;
+      int bx = b;
+      while (bx != 0)
+       {
+         int tem = ax % bx;
+         ax = bx;
+         bx = tem;
+       }
+    }
+  foo (&a, &b);
+}
index ab56e3d534a0c9954b315b0ab527cbd3b1fce4cf..8f96d6c0356da08b2fcfd556929b4dbaf3b16b6c 100644 (file)
@@ -2241,12 +2241,26 @@ print_scc (FILE *out, VEC (tree, heap) *scc)
 static inline bool
 set_ssa_val_to (tree from, tree to)
 {
-  tree currval;
+  tree currval = SSA_VAL (from);
 
-  if (from != to
-      && TREE_CODE (to) == SSA_NAME
-      && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
-    to = from;
+  if (from != to)
+    {
+      if (currval == from)
+       {
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           {
+             fprintf (dump_file, "Not changing value number of ");
+             print_generic_expr (dump_file, from, 0);
+             fprintf (dump_file, " from VARYING to ");
+             print_generic_expr (dump_file, to, 0);
+             fprintf (dump_file, "\n");
+           }
+         return false;
+       }
+      else if (TREE_CODE (to) == SSA_NAME
+              && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
+       to = from;
+    }
 
   /* The only thing we allow as value numbers are VN_TOP, ssa_names
      and invariants.  So assert that here.  */
@@ -2263,8 +2277,6 @@ set_ssa_val_to (tree from, tree to)
       print_generic_expr (dump_file, to, 0);
     }
 
-  currval = SSA_VAL (from);
-
   if (currval != to  && !operand_equal_p (currval, to, OEP_PURE_SAME))
     {
       VN_INFO (from)->valnum = to;
@@ -3280,6 +3292,8 @@ process_scc (VEC (tree, heap) *scc)
     {
       changed = false;
       iterations++;
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, "Starting iteration %d\n", iterations);
       /* As we are value-numbering optimistically we have to
         clear the expression tables and the simplified expressions
         in each iteration until we converge.  */