OSDN Git Service

2005-11-09 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2005 18:00:59 +0000 (18:00 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2005 18:00:59 +0000 (18:00 +0000)
PR tree-optimization/24716
* tree-scalar-evolution.c (analyze_evolution_in_loop): Use
t_bool to track results from follow_ssa_edge.

* gcc.c-torture/execute/pr24716.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106700 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr24716.c [new file with mode: 0644]
gcc/tree-scalar-evolution.c

index 3e3c2d9..10cad44 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/24716
+       * tree-scalar-evolution.c (analyze_evolution_in_loop): Use
+       t_bool to track results from follow_ssa_edge.
+
 2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * final.c (force_source_line): New global variable.
index a25d626..af46bf2 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/24716
+       * gcc.c-torture/execute/pr24716.c: New testcase.
+
 2005-11-09  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * gcc.dg/pr24624.c: Disable for non S/390 targets.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr24716.c b/gcc/testsuite/gcc.c-torture/execute/pr24716.c
new file mode 100644 (file)
index 0000000..c2473f8
--- /dev/null
@@ -0,0 +1,59 @@
+/* PR24716, scalar evolution returning the wrong result
+   for pdest.  */
+
+int Link[] = { -1 };
+int W[] = { 2 };
+
+extern void abort (void);
+
+int f (int k, int p)
+{
+  int pdest, j, D1361;
+  j = 0;
+  pdest = 0;
+  for (;;) {
+    if (pdest > 2)
+      do
+        j--, pdest++;
+      while (j > 2);
+
+    if (j == 1)
+      break;
+
+    while (pdest > p)
+      if (j == p)
+        pdest++;
+
+    do
+      {
+        D1361 = W[k];
+        do
+          if (D1361 != 0)
+            pdest = 1, W[k] = D1361 = 0;
+        while (p < 1);
+    } while (k > 0);
+
+    do
+      {
+        p = 0;
+        k = Link[k];
+        while (p < j)
+          if (k != -1)
+            pdest++, p++;
+      }
+    while (k != -1);
+    j = 1;
+  }
+
+  /* The correct return value should be pdest (1 in the call from main).
+     DOM3 is mistaken and propagates a 0 here.  */
+  return pdest;
+}
+
+int main ()
+{
+  if (!f (0, 2))
+    abort ();
+  return 0;
+}
+
index 104445a..c2fa2ef 100644 (file)
@@ -1503,7 +1503,7 @@ analyze_evolution_in_loop (tree loop_phi_node,
     {
       tree arg = PHI_ARG_DEF (loop_phi_node, i);
       tree ssa_chain, ev_fn;
-      bool res;
+      t_bool res;
 
       /* Select the edges that enter the loop body.  */
       bb = PHI_ARG_EDGE (loop_phi_node, i)->src;
@@ -1519,7 +1519,7 @@ analyze_evolution_in_loop (tree loop_phi_node,
          res = follow_ssa_edge (loop, ssa_chain, loop_phi_node, &ev_fn, 0);
        }
       else
-       res = false;
+       res = t_false;
              
       /* When it is impossible to go back on the same
         loop_phi_node by following the ssa edges, the
@@ -1527,7 +1527,7 @@ analyze_evolution_in_loop (tree loop_phi_node,
         first iteration, EV_FN has the value INIT_COND, then
         all the other iterations it has the value of ARG.  
         For the moment, PEELED_CHREC nodes are not built.  */
-      if (!res)
+      if (res != t_true)
        ev_fn = chrec_dont_know;
       
       /* When there are multiple back edges of the loop (which in fact never