PR tree-optimization/59417
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Dec 2013 09:19:41 +0000 (09:19 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Dec 2013 09:19:41 +0000 (09:19 +0000)
* tree-ssa-copy.c (fini_copy_prop): If copy_of[i].value is defined
in a different bb rhan var, only duplicate points-to info and
not alignment info and don't duplicate range info.
* tree-ssa-loop-niter.c (determine_value_range): Instead of
assertion failure handle inconsistencies in range info by only
using var's range info and not PHI result range infos.

* gcc.c-torture/compile/pr59417.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr59417.c [new file with mode: 0644]
gcc/tree-ssa-copy.c
gcc/tree-ssa-loop-niter.c

index 22caa76..10fae5a 100644 (file)
@@ -1,5 +1,13 @@
 2013-12-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/59417
+       * tree-ssa-copy.c (fini_copy_prop): If copy_of[i].value is defined
+       in a different bb rhan var, only duplicate points-to info and
+       not alignment info and don't duplicate range info.
+       * tree-ssa-loop-niter.c (determine_value_range): Instead of
+       assertion failure handle inconsistencies in range info by only
+       using var's range info and not PHI result range infos.
+
        PR tree-optimization/59386
        * tree-inline.c (remap_gimple_stmt): If not id->do_not_unshare,
        unshare_expr (id->retval) before passing it to gimple_build_assign.
index ebd9996..b7e72de 100644 (file)
@@ -1,5 +1,8 @@
 2013-12-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/59417
+       * gcc.c-torture/compile/pr59417.c: New test.
+
        PR tree-optimization/59386
        * gcc.c-torture/compile/pr59386.c: New test.
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr59417.c b/gcc/testsuite/gcc.c-torture/compile/pr59417.c
new file mode 100644 (file)
index 0000000..227c5d8
--- /dev/null
@@ -0,0 +1,39 @@
+/* PR tree-optimization/59417 */
+
+int a, b, d;
+short c;
+
+void
+f (void)
+{
+  if (b)
+    {
+      int *e;
+
+      if (d)
+       {
+         for (; b; a++)
+         lbl1:
+           d = 0;
+
+         for (; d <= 1; d++)
+           {
+             int **q = &e;
+             for (**q = 0; **q <= 0; **q++)
+               d = 0;
+           }
+       }
+    }
+
+  else
+    {
+      int t;
+      for (c = 0; c < 77; c++)
+       for (c = 0; c < 46; c++);
+      for (; t <= 0; t++)
+      lbl2:
+       ;
+      goto lbl1;
+    }
+  goto lbl2;
+}
index 3da262b..11daa5f 100644 (file)
@@ -567,14 +567,28 @@ fini_copy_prop (void)
       if (copy_of[i].value != var
          && TREE_CODE (copy_of[i].value) == SSA_NAME)
        {
+         basic_block copy_of_bb
+           = gimple_bb (SSA_NAME_DEF_STMT (copy_of[i].value));
+         basic_block var_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
          if (POINTER_TYPE_P (TREE_TYPE (var))
              && SSA_NAME_PTR_INFO (var)
              && !SSA_NAME_PTR_INFO (copy_of[i].value))
-           duplicate_ssa_name_ptr_info (copy_of[i].value,
-                                        SSA_NAME_PTR_INFO (var));
+           {
+             duplicate_ssa_name_ptr_info (copy_of[i].value,
+                                          SSA_NAME_PTR_INFO (var));
+             /* Points-to information is cfg insensitive,
+                but alignment info might be cfg sensitive, if it
+                e.g. is derived from VRP derived non-zero bits.
+                So, do not copy alignment info if the two SSA_NAMEs
+                aren't defined in the same basic block.  */
+             if (var_bb != copy_of_bb)
+               mark_ptr_info_alignment_unknown
+                               (SSA_NAME_PTR_INFO (copy_of[i].value));
+           }
          else if (!POINTER_TYPE_P (TREE_TYPE (var))
                   && SSA_NAME_RANGE_INFO (var)
-                  && !SSA_NAME_RANGE_INFO (copy_of[i].value))
+                  && !SSA_NAME_RANGE_INFO (copy_of[i].value)
+                  && var_bb == copy_of_bb)
            duplicate_ssa_name_range_info (copy_of[i].value,
                                           SSA_NAME_RANGE_TYPE (var),
                                           SSA_NAME_RANGE_INFO (var));
index 08c8541..a5a76a4 100644 (file)
@@ -173,7 +173,15 @@ determine_value_range (struct loop *loop, tree type, tree var, mpz_t off,
                {
                  minv = minv.max (minc, TYPE_UNSIGNED (type));
                  maxv = maxv.min (maxc, TYPE_UNSIGNED (type));
-                 gcc_assert (minv.cmp (maxv, TYPE_UNSIGNED (type)) <= 0);
+                 /* If the PHI result range are inconsistent with
+                    the VAR range, give up on looking at the PHI
+                    results.  This can happen if VR_UNDEFINED is
+                    involved.  */
+                 if (minv.cmp (maxv, TYPE_UNSIGNED (type)) > 0)
+                   {
+                     rtype = get_range_info (var, &minv, &maxv);
+                     break;
+                   }
                }
            }
        }