diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a7dcd1abd0..cbe76f8090c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-05-17 Ian Lance Taylor + + 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 * toplev.c (print_version): Output GMP/MPFR version info. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 905f2699636..96b7c39d447 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-17 Ian Lance Taylor + + PR tree-optimization/31953 + * gcc.c-torture/compile/pr31953.c: New test. + 2007-05-17 Kaveh R. Ghazi * 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 index 00000000000..667c9ae8851 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr31953.c @@ -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; + } +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 5f42ff6d1a5..efb4f6890d8 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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);