OSDN Git Service

2013-03-01 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Mar 2013 13:55:11 +0000 (13:55 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Mar 2013 13:55:11 +0000 (13:55 +0000)
Backport from mainline
2012-12-12  Zdenek Dvorak  <ook@ucw.cz>

PR tree-optimization/55481
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Fall
back to general rewriting if we cannot leave an original biv
definition alone.

* gcc.dg/torture/pr55481.c: New testcase.
* gcc.dg/torture/pr56488.c: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@196379 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr55481.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr56488.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivopts.c

index 87026f0..90604c2 100644 (file)
@@ -1,6 +1,16 @@
 2013-03-01  Richard Biener  <rguenther@suse.de>
 
        Backport from mainline
+       2012-12-12  Zdenek Dvorak  <ook@ucw.cz>
+
+       PR tree-optimization/55481
+       * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Fall
+       back to general rewriting if we cannot leave an original biv
+       definition alone.
+
+2013-03-01  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
        2012-04-10  Richard Guenther  <rguenther@suse.de>
  
        PR middle-end/52888
index e25253a..52bd7f9 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-01  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2012-12-12  Zdenek Dvorak  <ook@ucw.cz>
+
+       PR tree-optimization/55481
+       * gcc.dg/torture/pr55481.c: New testcase.
+       * gcc.dg/torture/pr56488.c: Likewise.
+
 2013-02-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/56443
diff --git a/gcc/testsuite/gcc.dg/torture/pr55481.c b/gcc/testsuite/gcc.dg/torture/pr55481.c
new file mode 100644 (file)
index 0000000..26ba9ff
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+
+int main()
+{
+  signed char result = 0;
+  int n;
+  for (n = 0; n < 13; ++n)
+    {
+      int tem = result;
+      tem = tem + 31;
+      result = tem;
+    }
+  if (result != -109)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr56488.c b/gcc/testsuite/gcc.dg/torture/pr56488.c
new file mode 100644 (file)
index 0000000..78bac7b
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+
+int a, c, d = 1;
+struct S { int s; } b, f;
+short e;
+
+static void
+foo (int x)
+{
+  int g[] = { };
+  for (e = 0; e != 1; e = e + 5)
+    {
+      int *h[1] = { &g[0] };
+      if (!x)
+       return;
+      f = b;
+    }
+}
+
+int
+main ()
+{
+  int i, j;
+  for (i = 0; i < 6; i++)
+    for (j = 8; j; j--)
+      a = 0;
+  foo (d);
+  while (c)
+    ;
+  return 0;
+}
index 10c9352..7556f53 100644 (file)
@@ -6170,35 +6170,24 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
   if (cand->pos == IP_ORIGINAL
       && cand->incremented_at == use->stmt)
     {
-      tree step, ctype, utype;
-      enum tree_code incr_code = PLUS_EXPR, old_code;
+      enum tree_code stmt_code;
 
       gcc_assert (is_gimple_assign (use->stmt));
       gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
 
-      step = cand->iv->step;
-      ctype = TREE_TYPE (step);
-      utype = TREE_TYPE (cand->var_after);
-      if (TREE_CODE (step) == NEGATE_EXPR)
-       {
-         incr_code = MINUS_EXPR;
-         step = TREE_OPERAND (step, 0);
-       }
-
       /* Check whether we may leave the computation unchanged.
         This is the case only if it does not rely on other
         computations in the loop -- otherwise, the computation
         we rely upon may be removed in remove_unused_ivs,
         thus leading to ICE.  */
-      old_code = gimple_assign_rhs_code (use->stmt);
-      if (old_code == PLUS_EXPR
-         || old_code == MINUS_EXPR
-         || old_code == POINTER_PLUS_EXPR)
+      stmt_code = gimple_assign_rhs_code (use->stmt);
+      if (stmt_code == PLUS_EXPR
+         || stmt_code == MINUS_EXPR
+         || stmt_code == POINTER_PLUS_EXPR)
        {
          if (gimple_assign_rhs1 (use->stmt) == cand->var_before)
            op = gimple_assign_rhs2 (use->stmt);
-         else if (old_code != MINUS_EXPR
-                  && gimple_assign_rhs2 (use->stmt) == cand->var_before)
+         else if (gimple_assign_rhs2 (use->stmt) == cand->var_before)
            op = gimple_assign_rhs1 (use->stmt);
          else
            op = NULL_TREE;
@@ -6206,24 +6195,13 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
       else
        op = NULL_TREE;
 
-      if (op
-         && (TREE_CODE (op) == INTEGER_CST
-             || operand_equal_p (op, step, 0)))
+      if (op && expr_invariant_in_loop_p (data->current_loop, op))
        return;
-
-      /* Otherwise, add the necessary computations to express
-        the iv.  */
-      op = fold_convert (ctype, cand->var_before);
-      comp = fold_convert (utype,
-                          build2 (incr_code, ctype, op,
-                                  unshare_expr (step)));
-    }
-  else
-    {
-      comp = get_computation (data->current_loop, use, cand);
-      gcc_assert (comp != NULL_TREE);
     }
 
+  comp = get_computation (data->current_loop, use, cand);
+  gcc_assert (comp != NULL_TREE);
+
   switch (gimple_code (use->stmt))
     {
     case GIMPLE_PHI: