]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/59245 (ICE on valid code at -O3 on x86_64-linux-gnu in set_va...
authorRichard Biener <rguenther@suse.de>
Tue, 26 Nov 2013 15:14:52 +0000 (15:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 26 Nov 2013 15:14:52 +0000 (15:14 +0000)
2013-11-26  Richard Biener  <rguenther@suse.de>

PR tree-optimization/59245
* tree-vrp.c (set_value_range): Assert that we don't have
overflowed constants (but our infinities).
(set_value_range_to_value): Drop all overflow flags.
(vrp_visit_phi_node): Likewise.
(vrp_visit_assignment_or_call): Use set_value_range_to_value
to set a constant range.

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

From-SVN: r205395

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr59245.c [new file with mode: 0644]
gcc/tree-vrp.c

index 61cbbc4def0dc87cf14146f524a290c6fde82004..75ad19c9e34aa312685fe310d91f3f45743c3534 100644 (file)
@@ -1,3 +1,13 @@
+2013-11-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/59245
+       * tree-vrp.c (set_value_range): Assert that we don't have
+       overflowed constants (but our infinities).
+       (set_value_range_to_value): Drop all overflow flags.
+       (vrp_visit_phi_node): Likewise.
+       (vrp_visit_assignment_or_call): Use set_value_range_to_value
+       to set a constant range.
+
 2013-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR target/59290
index 84abf1d2f645cfe508cfa2d7e395ccd91b90707f..23113f3009de0e28557e1734f2d6ae2967553eb8 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/59245
+       * gcc.dg/torture/pr59245.c: New testcase.
+
 2013-11-26  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR target/59290
diff --git a/gcc/testsuite/gcc.dg/torture/pr59245.c b/gcc/testsuite/gcc.dg/torture/pr59245.c
new file mode 100644 (file)
index 0000000..e5b9a0f
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+int a, b, c, e, g;
+char d[5], f;
+
+int
+fn1 ()
+{
+  if (b)
+    {
+      g = 0;
+      return 0;
+    }
+  for (f = 0; f != 1; f--)
+    ;
+  return 0;
+}
+
+void
+fn2 ()
+{
+  d[4] = -1;
+  for (a = 4; a; a--)
+    {
+      fn1 ();
+      e = c < -2147483647 - 1 - d[a] ? c : 0;
+    }
+}
index c47b8e6e313ba5093037f3d01f591723f3775eb9..171a0f56255e698454bca1247f1eece6e11dab09 100644 (file)
@@ -441,6 +441,9 @@ set_value_range (value_range_t *vr, enum value_range_type t, tree min,
 
       gcc_assert (min && max);
 
+      gcc_assert ((!TREE_OVERFLOW_P (min) || is_overflow_infinity (min))
+                 && (!TREE_OVERFLOW_P (max) || is_overflow_infinity (max)));
+
       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
        gcc_assert (!vrp_val_is_min (min) || !vrp_val_is_max (max));
 
@@ -616,7 +619,8 @@ static inline void
 set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
 {
   gcc_assert (is_gimple_min_invariant (val));
-  val = avoid_overflow_infinity (val);
+  if (TREE_OVERFLOW_P (val))
+    val = drop_tree_overflow (val);
   set_value_range (vr, VR_RANGE, val, val, equiv);
 }
 
@@ -6738,8 +6742,8 @@ vrp_visit_assignment_or_call (gimple stmt, tree *output_p)
 
       /* Try folding the statement to a constant first.  */
       tree tem = gimple_fold_stmt_to_constant (stmt, vrp_valueize);
-      if (tem && !is_overflow_infinity (tem))
-       set_value_range (&new_vr, VR_RANGE, tem, tem, NULL);
+      if (tem)
+       set_value_range_to_value (&new_vr, tem, NULL);
       /* Then dispatch to value-range extracting functions.  */
       else if (code == GIMPLE_CALL)
        extract_range_basic (&new_vr, stmt);
@@ -8336,7 +8340,7 @@ vrp_visit_phi_node (gimple phi)
            }
          else
            {
-             if (is_overflow_infinity (arg))
+             if (TREE_OVERFLOW_P (arg))
                arg = drop_tree_overflow (arg);
 
              vr_arg.type = VR_RANGE;