re PR tree-optimization/31953 (ICE in set_value_range, at tree-vrp.c:305)
authorIan Lance Taylor <iant@google.com>
Fri, 18 May 2007 05:37:27 +0000 (05:37 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 18 May 2007 05:37:27 +0000 (05:37 +0000)
./: PR tree-optimization/31953
* tree-vrp.c (set_value_range_to_value): Add equiv parameter.
Change all callers.
(set_value_range_to_null): Call set_value_range_to_value.
(extract_range_from_comparison): Likewise.
testsuite/:
PR tree-optimization/31953
* gcc.c-torture/compile/pr31953.c: New test.

From-SVN: r124823

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

index 7a7dcd1abd0c28316462d5e5b46330df937a6f78..cbe76f8090cc8f7150db1d6955ae640156e319e9 100644 (file)
@@ -1,3 +1,11 @@
+2007-05-17  Ian Lance Taylor  <iant@google.com>
+
+       PR tree-optimization/31953
+       * tree-vrp.c (set_value_range_to_value): Add equiv parameter.
+       Change all callers.
+       (set_value_range_to_null): Call set_value_range_to_value.
+       (extract_range_from_comparison): Likewise.
+
 2007-05-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * toplev.c (print_version): Output GMP/MPFR version info.
index 905f2699636693d56ab0221ab78d5c4a312f8655..96b7c39d447f9082b21481a614c9c7d96ec37589 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-17  Ian Lance Taylor  <iant@google.com>
+
+       PR tree-optimization/31953
+       * gcc.c-torture/compile/pr31953.c: New test.
+
 2007-05-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * gcc.dg/builtins-1.c: Test reentrant gamma functions.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr31953.c b/gcc/testsuite/gcc.c-torture/compile/pr31953.c
new file mode 100644 (file)
index 0000000..667c9ae
--- /dev/null
@@ -0,0 +1,14 @@
+struct WView
+{
+  int hexedit_mode:1;
+};
+toggle_hexedit_mode (struct WView *view)
+{
+  if (view->hexedit_mode)
+    {
+    }
+  else
+    {
+      view->hexedit_mode = !view->hexedit_mode;
+    }
+}
index 5f42ff6d1a5d523ad6554dacfd3be74964450a65..efb4f6890d81b568699ba0c77df9302812590fbb 100644 (file)
@@ -358,7 +358,7 @@ set_value_range_to_varying (value_range_t *vr)
    infinity when we shouldn't.  */
 
 static inline void
-set_value_range_to_value (value_range_t *vr, tree val)
+set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
 {
   gcc_assert (is_gimple_min_invariant (val));
   if (is_overflow_infinity (val))
@@ -374,7 +374,7 @@ set_value_range_to_value (value_range_t *vr, tree val)
          val = TYPE_MIN_VALUE (TREE_TYPE (val));
        }
     }
-  set_value_range (vr, VR_RANGE, val, val, NULL);
+  set_value_range (vr, VR_RANGE, val, val, equiv);
 }
 
 /* Set value range VR to a non-negative range of type TYPE.
@@ -418,8 +418,7 @@ set_value_range_to_nonnull (value_range_t *vr, tree type)
 static inline void
 set_value_range_to_null (value_range_t *vr, tree type)
 {
-  tree zero = build_int_cst (type, 0);
-  set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
+  set_value_range_to_value (vr, build_int_cst (type, 0), vr->equiv);
 }
 
 
@@ -1702,7 +1701,7 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
   if (TREE_CODE (op0) == SSA_NAME)
     vr0 = *(get_value_range (op0));
   else if (is_gimple_min_invariant (op0))
-    set_value_range_to_value (&vr0, op0);
+    set_value_range_to_value (&vr0, op0, NULL);
   else
     set_value_range_to_varying (&vr0);
 
@@ -1710,7 +1709,7 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
   if (TREE_CODE (op1) == SSA_NAME)
     vr1 = *(get_value_range (op1));
   else if (is_gimple_min_invariant (op1))
-    set_value_range_to_value (&vr1, op1);
+    set_value_range_to_value (&vr1, op1, NULL);
   else
     set_value_range_to_varying (&vr1);
 
@@ -2107,7 +2106,7 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr)
   if (TREE_CODE (op0) == SSA_NAME)
     vr0 = *(get_value_range (op0));
   else if (is_gimple_min_invariant (op0))
-    set_value_range_to_value (&vr0, op0);
+    set_value_range_to_value (&vr0, op0, NULL);
   else
     set_value_range_to_varying (&vr0);
 
@@ -2490,7 +2489,7 @@ extract_range_from_cond_expr (value_range_t *vr, tree expr)
   if (TREE_CODE (op0) == SSA_NAME)
     vr0 = *(get_value_range (op0));
   else if (is_gimple_min_invariant (op0))
-    set_value_range_to_value (&vr0, op0);
+    set_value_range_to_value (&vr0, op0, NULL);
   else
     set_value_range_to_varying (&vr0);
 
@@ -2498,7 +2497,7 @@ extract_range_from_cond_expr (value_range_t *vr, tree expr)
   if (TREE_CODE (op1) == SSA_NAME)
     vr1 = *(get_value_range (op1));
   else if (is_gimple_min_invariant (op1))
-    set_value_range_to_value (&vr1, op1);
+    set_value_range_to_value (&vr1, op1, NULL);
   else
     set_value_range_to_varying (&vr1);
 
@@ -2528,7 +2527,10 @@ extract_range_from_comparison (value_range_t *vr, tree expr)
         its type may be different from _Bool.  Convert VAL to EXPR's
         type.  */
       val = fold_convert (TREE_TYPE (expr), val);
-      set_value_range (vr, VR_RANGE, val, val, vr->equiv);
+      if (is_gimple_min_invariant (val))
+       set_value_range_to_value (vr, val, vr->equiv);
+      else
+       set_value_range (vr, VR_RANGE, val, val, vr->equiv);
     }
   else
     /* The result of a comparison is always true or false.  */
@@ -2562,7 +2564,7 @@ extract_range_from_expr (value_range_t *vr, tree expr)
   else if (TREE_CODE_CLASS (code) == tcc_comparison)
     extract_range_from_comparison (vr, expr);
   else if (is_gimple_min_invariant (expr))
-    set_value_range_to_value (vr, expr);
+    set_value_range_to_value (vr, expr, NULL);
   else
     set_value_range_to_varying (vr);