diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 131 |
1 files changed, 62 insertions, 69 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 4b32340..f5e0d03 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -237,7 +237,7 @@ value_range::operator!= (const value_range &other) const /* Return TRUE if this is a symbolic range. */ bool -value_range::symbolic_p () const +value_range_base::symbolic_p () const { return (!varying_p () && !undefined_p () @@ -251,7 +251,7 @@ value_range::symbolic_p () const constants would be represented as [-MIN, +MAX]. */ bool -value_range::constant_p () const +value_range_base::constant_p () const { return (!varying_p () && !undefined_p () @@ -336,7 +336,7 @@ value_range::equiv_add (const_tree var, So, [&x, &x] counts as a singleton. */ bool -value_range::singleton_p (tree *result) const +value_range_base::singleton_p (tree *result) const { if (m_kind == VR_RANGE && vrp_operand_equal_p (min (), max ()) @@ -418,6 +418,13 @@ value_range::dump (FILE *file) const } void +value_range_base::dump () const +{ + dump_value_range (stderr, this); + fprintf (stderr, "\n"); +} + +void value_range::dump () const { dump_value_range (stderr, this); @@ -591,22 +598,6 @@ intersect_range_with_nonzero_bits (enum value_range_kind vr_type, return vr_type; } -/* Set value range VR to VR_UNDEFINED. */ - -static inline void -set_value_range_to_undefined (value_range *vr) -{ - vr->set_undefined (); -} - -/* Set value range VR to VR_VARYING. */ - -void -set_value_range_to_varying (value_range *vr) -{ - vr->set_varying (); -} - /* Set value range VR to {T, MIN, MAX, EQUIV}. */ void @@ -823,7 +814,7 @@ range_is_nonnull (const value_range *vr) a singleton. */ bool -range_int_cst_p (const value_range *vr) +range_int_cst_p (const value_range_base *vr) { return (vr->kind () == VR_RANGE && TREE_CODE (vr->min ()) == INTEGER_CST @@ -833,7 +824,7 @@ range_int_cst_p (const value_range *vr) /* Return true if VR is a INTEGER_CST singleton. */ bool -range_int_cst_singleton_p (const value_range *vr) +range_int_cst_singleton_p (const value_range_base *vr) { return (range_int_cst_p (vr) && tree_int_cst_equal (vr->min (), vr->max ())); @@ -1164,7 +1155,7 @@ range_includes_zero_p (const value_range_base *vr) is not the best name. */ tree -value_range_constant_singleton (const value_range *vr) +value_range_constant_singleton (const value_range_base *vr) { tree result = NULL; if (vr->singleton_p (&result)) @@ -1181,7 +1172,7 @@ value_range_constant_singleton (const value_range *vr) bool vrp_set_zero_nonzero_bits (const tree expr_type, - const value_range *vr, + const value_range_base *vr, wide_int *may_be_nonzero, wide_int *must_be_nonzero) { @@ -1301,7 +1292,7 @@ extract_range_from_multiplicative_op (value_range *vr, wide_int_to_tree (type, res_lb), wide_int_to_tree (type, res_ub), NULL); else - set_value_range_to_varying (vr); + vr->set_varying (); } /* If BOUND will include a symbolic bound, adjust it accordingly, @@ -1510,7 +1501,7 @@ extract_range_from_binary_expr_1 (value_range *vr, if (!INTEGRAL_TYPE_P (expr_type) && !POINTER_TYPE_P (expr_type)) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -1534,14 +1525,14 @@ extract_range_from_binary_expr_1 (value_range *vr, && code != BIT_IOR_EXPR && code != BIT_XOR_EXPR) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } /* If both ranges are UNDEFINED, so is the result. */ if (vr0.undefined_p () && vr1.undefined_p ()) { - set_value_range_to_undefined (vr); + vr->set_undefined (); return; } /* If one of the ranges is UNDEFINED drop it to VARYING for the following @@ -1549,9 +1540,9 @@ extract_range_from_binary_expr_1 (value_range *vr, have UNDEFINED result for all or some value-ranges of the not UNDEFINED operand. */ else if (vr0.undefined_p ()) - set_value_range_to_varying (&vr0); + vr0.set_varying (); else if (vr1.undefined_p ()) - set_value_range_to_varying (&vr1); + vr1.set_varying (); /* We get imprecise results from ranges_from_anti_range when code is EXACT_DIV_EXPR. We could mask out bits in the resulting @@ -1622,7 +1613,7 @@ extract_range_from_binary_expr_1 (value_range *vr, || vr0.symbolic_p () || vr1.symbolic_p ())) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -1640,7 +1631,7 @@ extract_range_from_binary_expr_1 (value_range *vr, else if (range_is_null (&vr0) && range_is_null (&vr1)) set_value_range_to_null (vr, expr_type); else - set_value_range_to_varying (vr); + vr->set_varying (); } else if (code == POINTER_PLUS_EXPR) { @@ -1652,7 +1643,7 @@ extract_range_from_binary_expr_1 (value_range *vr, else if (range_is_null (&vr0) && range_is_null (&vr1)) set_value_range_to_null (vr, expr_type); else - set_value_range_to_varying (vr); + vr->set_varying (); } else if (code == BIT_AND_EXPR) { @@ -1663,10 +1654,10 @@ extract_range_from_binary_expr_1 (value_range *vr, else if (range_is_null (&vr0) || range_is_null (&vr1)) set_value_range_to_null (vr, expr_type); else - set_value_range_to_varying (vr); + vr->set_varying (); } else - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -1737,7 +1728,7 @@ extract_range_from_binary_expr_1 (value_range *vr, if (((bool)min_ovf && sym_min_op0 != sym_min_op1) || ((bool)max_ovf && sym_max_op0 != sym_max_op1)) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -1748,7 +1739,7 @@ extract_range_from_binary_expr_1 (value_range *vr, wmin, wmax, min_ovf, max_ovf); if (type == VR_VARYING) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -1774,7 +1765,7 @@ extract_range_from_binary_expr_1 (value_range *vr, a single range or anti-range as the above is [-INF+1, +INF(OVF)] intersected with ~[5, 5] but one could use a scheme similar to equivalences for this. */ - set_value_range_to_varying (vr); + vr->set_varying (); return; } } @@ -1791,7 +1782,7 @@ extract_range_from_binary_expr_1 (value_range *vr, vr->update (VR_RANGE, wide_int_to_tree (expr_type, wmin), wide_int_to_tree (expr_type, wmax)); else - set_value_range_to_varying (vr); + vr->set_varying (); return; } else if (code == MULT_EXPR) @@ -1799,7 +1790,7 @@ extract_range_from_binary_expr_1 (value_range *vr, if (!range_int_cst_p (&vr0) || !range_int_cst_p (&vr1)) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } extract_range_from_multiplicative_op (vr, code, &vr0, &vr1); @@ -1845,7 +1836,7 @@ extract_range_from_binary_expr_1 (value_range *vr, } } } - set_value_range_to_varying (vr); + vr->set_varying (); return; } else if (code == TRUNC_DIV_EXPR @@ -1861,7 +1852,7 @@ extract_range_from_binary_expr_1 (value_range *vr, /* Special case explicit division by zero as undefined. */ if (range_is_null (&vr1)) { - set_value_range_to_undefined (vr); + vr->set_undefined (); return; } @@ -1882,7 +1873,7 @@ extract_range_from_binary_expr_1 (value_range *vr, TYPE_OVERFLOW_UNDEFINED (expr_type), extra_range_p, extra_min, extra_max)) { - set_value_range_to_varying (vr); + vr->set_undefined (); return; } set_value_range (vr, VR_RANGE, @@ -1902,7 +1893,7 @@ extract_range_from_binary_expr_1 (value_range *vr, { if (range_is_null (&vr1)) { - set_value_range_to_undefined (vr); + vr->set_undefined (); return; } wide_int wmin, wmax, tmp; @@ -1943,7 +1934,7 @@ extract_range_from_binary_expr_1 (value_range *vr, set_value_range (vr, VR_RANGE, min, max, NULL); } else - set_value_range_to_varying (vr); + vr->set_varying (); return; } else if (code == BIT_IOR_EXPR) @@ -1961,7 +1952,7 @@ extract_range_from_binary_expr_1 (value_range *vr, set_value_range (vr, VR_RANGE, min, max, NULL); } else - set_value_range_to_varying (vr); + vr->set_varying (); return; } else if (code == BIT_XOR_EXPR) @@ -1977,7 +1968,7 @@ extract_range_from_binary_expr_1 (value_range *vr, set_value_range (vr, VR_RANGE, min, max, NULL); } else - set_value_range_to_varying (vr); + vr->set_varying (); return; } } @@ -1991,7 +1982,7 @@ extract_range_from_binary_expr_1 (value_range *vr, || max == NULL_TREE || TREE_OVERFLOW_P (max)) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -2000,7 +1991,7 @@ extract_range_from_binary_expr_1 (value_range *vr, Note that we do accept [-INF, -INF] and [+INF, +INF]. */ if (vrp_val_is_min (min) && vrp_val_is_max (max)) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -2010,7 +2001,7 @@ extract_range_from_binary_expr_1 (value_range *vr, /* If the new range has its limits swapped around (MIN > MAX), then the operation caused one of them to wrap around, mark the new range VARYING. */ - set_value_range_to_varying (vr); + vr->set_varying (); } else set_value_range (vr, type, min, max, NULL); @@ -2036,14 +2027,14 @@ extract_range_from_unary_expr (value_range *vr, || !(INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))) { - set_value_range_to_varying (vr); + vr->set_varying (); return; } /* If VR0 is UNDEFINED, so is the result. */ if (vr0.undefined_p ()) { - set_value_range_to_undefined (vr); + vr->set_undefined (); return; } @@ -2109,7 +2100,7 @@ extract_range_from_unary_expr (value_range *vr, else if (range_is_null (&vr0)) set_value_range_to_null (vr, type); else - set_value_range_to_varying (vr); + vr->set_varying (); return; } @@ -2144,7 +2135,7 @@ extract_range_from_unary_expr (value_range *vr, vr->set_and_canonicalize (VR_RANGE, min, max, NULL); } else - set_value_range_to_varying (vr); + vr->set_varying (); return; } else if (code == ABS_EXPR) @@ -2158,23 +2149,17 @@ extract_range_from_unary_expr (value_range *vr, wide_int_to_tree (type, wmin), wide_int_to_tree (type, wmax), NULL); else - set_value_range_to_varying (vr); + vr->set_varying (); return; } /* For unhandled operations fall back to varying. */ - set_value_range_to_varying (vr); + vr->set_varying (); return; } /* Debugging dumps. */ -void dump_value_range (FILE *, const value_range *); -void debug_value_range (const value_range *); -void dump_all_value_ranges (FILE *); -void dump_vr_equiv (FILE *, bitmap); -void debug_vr_equiv (bitmap); - void dump_value_range (FILE *file, const value_range *vr) { @@ -2185,7 +2170,7 @@ dump_value_range (FILE *file, const value_range *vr) } void -dump_value_range_base (FILE *file, const value_range_base *vr) +dump_value_range (FILE *file, const value_range_base *vr) { if (!vr) fprintf (file, "[]"); @@ -2196,9 +2181,17 @@ dump_value_range_base (FILE *file, const value_range_base *vr) /* Dump value range VR to stderr. */ DEBUG_FUNCTION void +debug_value_range (const value_range_base *vr) +{ + dump_value_range (stderr, vr); +} + +/* Dump value range VR to stderr. */ + +DEBUG_FUNCTION void debug_value_range (const value_range *vr) { - vr->dump (); + dump_value_range (stderr, vr); } @@ -5161,7 +5154,7 @@ vrp_prop::vrp_initialize () if (!stmt_interesting_for_vrp (phi)) { tree lhs = PHI_RESULT (phi); - set_value_range_to_varying (get_value_range (lhs)); + get_value_range (lhs)->set_varying (); prop_set_simulate_again (phi, false); } else @@ -5356,7 +5349,7 @@ vrp_prop::visit_stmt (gimple *stmt, edge *taken_edge_p, tree *output_p) use_operand_p use_p; enum ssa_prop_result res = SSA_PROP_VARYING; - set_value_range_to_varying (get_value_range (lhs)); + get_value_range (lhs)->set_varying (); FOR_EACH_IMM_USE_FAST (use_p, iter, lhs) { @@ -6027,7 +6020,7 @@ value_range::intersect_helper (value_range *vr0, const value_range *vr1) return; if (vr1->undefined_p ()) { - set_value_range_to_undefined (vr0); + vr0->set_undefined (); return; } @@ -6171,7 +6164,7 @@ value_range::union_helper (value_range *vr0, const value_range *vr1) if (vr1->varying_p ()) { - set_value_range_to_varying (vr0); + vr0->set_varying (); return; } @@ -6199,7 +6192,7 @@ value_range::union_helper (value_range *vr0, const value_range *vr1) return; } - set_value_range_to_varying (vr0); + vr0->set_varying (); return; } vr0->set_and_canonicalize (vr0->kind (), vr0->min (), vr0->max (), @@ -6908,7 +6901,7 @@ determine_value_range_1 (value_range *vr, tree expr) set_value_range (vr, kind, wide_int_to_tree (TREE_TYPE (expr), min), wide_int_to_tree (TREE_TYPE (expr), max), NULL); else - set_value_range_to_varying (vr); + vr->set_varying (); } } |