On October 14, 2019 2:32:43 PM GMT+02:00, Richard Sandiford <richard.sandif...@arm.com> wrote: >Richard Biener <richard.guent...@gmail.com> writes: >> On Fri, Oct 11, 2019 at 4:42 PM Richard Sandiford >> <richard.sandif...@arm.com> wrote: >>> >>> The range-tracking code has a pretty hard-coded assumption that >>> is_gimple_min_invariant is equivalent to "INTEGER_CST or invariant >>> ADDR_EXPR". It seems better to add a predicate specifically for >>> that rather than contiually fight cases in which it can't handle >>> other invariants. >>> >>> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? >> >> ICK. Nobody is going to remember this new restriction and >> constant_range_value_p reads like constant_value_range_p ;) >> >> Btw, is_gimple_invariant_address shouldn't have been exported, >> it's only use could have used is_gimple_min_invariant... > >What do you think we should do instead?
Just handle POLY_INT_CST in a few place to quickly enough drop to varying. Richard. >Richard > >> >> Richard. >> >>> Richard >>> >>> >>> 2019-10-11 Richard Sandiford <richard.sandif...@arm.com> >>> >>> gcc/ >>> PR tree-optimization/92033 >>> * tree-vrp.h (constant_range_value_p): Declare. >>> * tree-vrp.c (constant_range_value_p): New function. >>> (value_range_base::symbolic_p, >value_range_base::singleton_p) >>> (get_single_symbol, compare_values_warnv, intersect_ranges) >>> (value_range_base::normalize_symbolics): Use it instead of >>> is_gimple_min_invariant. >>> (simplify_stmt_for_jump_threading): Likewise. >>> * vr-values.c (symbolic_range_based_on_p, valid_value_p): >Likewise. >>> (vr_values::op_with_constant_singleton_value_range): >Likewise. >>> (vr_values::extract_range_from_binary_expr): Likewise. >>> (vr_values::extract_range_from_unary_expr): Likewise. >>> (vr_values::extract_range_from_cond_expr): Likewise. >>> (vr_values::extract_range_from_comparison): Likewise. >>> (vr_values::extract_range_from_assignment): Likewise. >>> (vr_values::adjust_range_with_scev, vrp_valueize): Likewise. >>> (vr_values::vrp_visit_assignment_or_call): Likewise. >>> (vr_values::vrp_evaluate_conditional): Likewise. >>> (vr_values::simplify_bit_ops_using_ranges): Likewise. >>> (test_for_singularity): Likewise. >>> (vr_values::simplify_cond_using_ranges_1): Likewise. >>> >>> Index: gcc/tree-vrp.h >>> =================================================================== >>> --- gcc/tree-vrp.h 2019-10-08 09:23:31.282533990 +0100 >>> +++ gcc/tree-vrp.h 2019-10-11 15:41:20.380576059 +0100 >>> @@ -284,6 +284,7 @@ value_range_base::supports_type_p (tree >>> return false; >>> } >>> >>> +extern bool constant_range_value_p (const_tree); >>> extern void register_edge_assert_for (tree, edge, enum tree_code, >>> tree, tree, vec<assert_info> >&); >>> extern bool stmt_interesting_for_vrp (gimple *); >>> Index: gcc/tree-vrp.c >>> =================================================================== >>> --- gcc/tree-vrp.c 2019-10-08 09:23:31.282533990 +0100 >>> +++ gcc/tree-vrp.c 2019-10-11 15:41:20.380576059 +0100 >>> @@ -78,6 +78,18 @@ ranges_from_anti_range (const value_rang >>> for still active basic-blocks. */ >>> static sbitmap *live; >>> >>> +/* Return true if VALUE is considered constant for range tracking. >>> + This is stricter than is_gimple_min_invariant and should be >>> + used instead of it in range-related code. */ >>> + >>> +bool >>> +constant_range_value_p (const_tree value) >>> +{ >>> + return (TREE_CODE (value) == INTEGER_CST >>> + || (TREE_CODE (value) == ADDR_EXPR >>> + && is_gimple_invariant_address (value))); >>> +} >>> + >>> void >>> value_range::set_equiv (bitmap equiv) >>> { >>> @@ -273,8 +285,8 @@ value_range_base::symbolic_p () const >>> { >>> return (!varying_p () >>> && !undefined_p () >>> - && (!is_gimple_min_invariant (m_min) >>> - || !is_gimple_min_invariant (m_max))); >>> + && (!constant_range_value_p (m_min) >>> + || !constant_range_value_p (m_max))); >>> } >>> >>> /* NOTE: This is not the inverse of symbolic_p because the range >>> @@ -388,7 +400,7 @@ value_range_base::singleton_p (tree *res >>> } >>> if (m_kind == VR_RANGE >>> && vrp_operand_equal_p (min (), max ()) >>> - && is_gimple_min_invariant (min ())) >>> + && constant_range_value_p (min ())) >>> { >>> if (result) >>> *result = min (); >>> @@ -953,13 +965,13 @@ get_single_symbol (tree t, bool *neg, tr >>> || TREE_CODE (t) == POINTER_PLUS_EXPR >>> || TREE_CODE (t) == MINUS_EXPR) >>> { >>> - if (is_gimple_min_invariant (TREE_OPERAND (t, 0))) >>> + if (constant_range_value_p (TREE_OPERAND (t, 0))) >>> { >>> neg_ = (TREE_CODE (t) == MINUS_EXPR); >>> inv_ = TREE_OPERAND (t, 0); >>> t = TREE_OPERAND (t, 1); >>> } >>> - else if (is_gimple_min_invariant (TREE_OPERAND (t, 1))) >>> + else if (constant_range_value_p (TREE_OPERAND (t, 1))) >>> { >>> neg_ = false; >>> inv_ = TREE_OPERAND (t, 1); >>> @@ -1106,8 +1118,8 @@ compare_values_warnv (tree val1, tree va >>> TYPE_SIGN (TREE_TYPE (val1))); >>> } >>> >>> - const bool cst1 = is_gimple_min_invariant (val1); >>> - const bool cst2 = is_gimple_min_invariant (val2); >>> + const bool cst1 = constant_range_value_p (val1); >>> + const bool cst2 = constant_range_value_p (val2); >>> >>> /* If one is of the form '[-]NAME + CST' and the other is >constant, then >>> it might be possible to say something depending on the >constants. */ >>> @@ -5785,7 +5797,7 @@ intersect_ranges (enum value_range_kind >>> correct estimate unless VR1 is a constant singleton range >>> in which case we choose that. */ >>> if (vr1type == VR_RANGE >>> - && is_gimple_min_invariant (vr1min) >>> + && constant_range_value_p (vr1min) >>> && vrp_operand_equal_p (vr1min, vr1max)) >>> { >>> *vr0type = vr1type; >>> @@ -6045,8 +6057,8 @@ value_range_base::normalize_symbolics () >>> if (varying_p () || undefined_p ()) >>> return *this; >>> tree ttype = type (); >>> - bool min_symbolic = !is_gimple_min_invariant (min ()); >>> - bool max_symbolic = !is_gimple_min_invariant (max ()); >>> + bool min_symbolic = !constant_range_value_p (min ()); >>> + bool max_symbolic = !constant_range_value_p (max ()); >>> if (!min_symbolic && !max_symbolic) >>> return normalize_addresses (); >>> >>> @@ -6432,7 +6444,7 @@ simplify_stmt_for_jump_threading (gimple >>> { >>> /* First see if the conditional is in the hash table. */ >>> tree cached_lhs = avail_exprs_stack->lookup_avail_expr (stmt, >false, true); >>> - if (cached_lhs && is_gimple_min_invariant (cached_lhs)) >>> + if (cached_lhs && constant_range_value_p (cached_lhs)) >>> return cached_lhs; >>> >>> vr_values *vr_values = x_vr_values; >>> Index: gcc/vr-values.c >>> =================================================================== >>> --- gcc/vr-values.c 2019-10-03 14:04:54.161520173 +0100 >>> +++ gcc/vr-values.c 2019-10-11 15:41:20.380576059 +0100 >>> @@ -263,14 +263,14 @@ symbolic_range_based_on_p (value_range_b >>> bool neg, min_has_symbol, max_has_symbol; >>> tree inv; >>> >>> - if (is_gimple_min_invariant (vr->min ())) >>> + if (constant_range_value_p (vr->min ())) >>> min_has_symbol = false; >>> else if (get_single_symbol (vr->min (), &neg, &inv) == sym) >>> min_has_symbol = true; >>> else >>> return false; >>> >>> - if (is_gimple_min_invariant (vr->max ())) >>> + if (constant_range_value_p (vr->max ())) >>> max_has_symbol = false; >>> else if (get_single_symbol (vr->max (), &neg, &inv) == sym) >>> max_has_symbol = true; >>> @@ -409,7 +409,7 @@ valid_value_p (tree expr) >>> return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME >>> && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST); >>> >>> - return is_gimple_min_invariant (expr); >>> + return constant_range_value_p (expr); >>> } >>> >>> /* If OP has a value range with a single constant value return >that, >>> @@ -419,7 +419,7 @@ valid_value_p (tree expr) >>> tree >>> vr_values::op_with_constant_singleton_value_range (tree op) >>> { >>> - if (is_gimple_min_invariant (op)) >>> + if (constant_range_value_p (op)) >>> return op; >>> >>> if (TREE_CODE (op) != SSA_NAME) >>> @@ -778,14 +778,14 @@ vr_values::extract_range_from_binary_exp >>> value_range_base vr0, vr1; >>> if (TREE_CODE (op0) == SSA_NAME) >>> vr0 = *(get_value_range (op0)); >>> - else if (is_gimple_min_invariant (op0)) >>> + else if (constant_range_value_p (op0)) >>> vr0.set (op0); >>> else >>> vr0.set_varying (TREE_TYPE (op0)); >>> >>> if (TREE_CODE (op1) == SSA_NAME) >>> vr1 = *(get_value_range (op1)); >>> - else if (is_gimple_min_invariant (op1)) >>> + else if (constant_range_value_p (op1)) >>> vr1.set (op1); >>> else >>> vr1.set_varying (TREE_TYPE (op1)); >>> @@ -855,11 +855,11 @@ vr_values::extract_range_from_binary_exp >>> value_range n_vr1; >>> >>> /* Try with VR0 and [-INF, OP1]. */ >>> - if (is_gimple_min_invariant (minus_p ? vr0.max () : vr0.min >())) >>> + if (constant_range_value_p (minus_p ? vr0.max () : vr0.min >())) >>> n_vr1.set (VR_RANGE, vrp_val_min (expr_type), op1); >>> >>> /* Try with VR0 and [OP1, +INF]. */ >>> - else if (is_gimple_min_invariant (minus_p ? vr0.min () : >vr0.max ())) >>> + else if (constant_range_value_p (minus_p ? vr0.min () : >vr0.max ())) >>> n_vr1.set (VR_RANGE, op1, vrp_val_max (expr_type)); >>> >>> /* Try with VR0 and [OP1, OP1]. */ >>> @@ -879,11 +879,11 @@ vr_values::extract_range_from_binary_exp >>> value_range n_vr0; >>> >>> /* Try with [-INF, OP0] and VR1. */ >>> - if (is_gimple_min_invariant (minus_p ? vr1.max () : vr1.min >())) >>> + if (constant_range_value_p (minus_p ? vr1.max () : vr1.min >())) >>> n_vr0.set (VR_RANGE, vrp_val_min (expr_type), op0); >>> >>> /* Try with [OP0, +INF] and VR1. */ >>> - else if (is_gimple_min_invariant (minus_p ? vr1.min (): >vr1.max ())) >>> + else if (constant_range_value_p (minus_p ? vr1.min (): >vr1.max ())) >>> n_vr0.set (VR_RANGE, op0, vrp_val_max (expr_type)); >>> >>> /* Try with [OP0, OP0] and VR1. */ >>> @@ -926,7 +926,7 @@ vr_values::extract_range_from_unary_expr >>> a new value range with the operand to simplify processing. */ >>> if (TREE_CODE (op0) == SSA_NAME) >>> vr0 = *(get_value_range (op0)); >>> - else if (is_gimple_min_invariant (op0)) >>> + else if (constant_range_value_p (op0)) >>> vr0.set (op0); >>> else >>> vr0.set_varying (type); >>> @@ -948,7 +948,7 @@ vr_values::extract_range_from_cond_expr >>> const value_range *vr0 = &tem0; >>> if (TREE_CODE (op0) == SSA_NAME) >>> vr0 = get_value_range (op0); >>> - else if (is_gimple_min_invariant (op0)) >>> + else if (constant_range_value_p (op0)) >>> tem0.set (op0); >>> else >>> tem0.set_varying (TREE_TYPE (op0)); >>> @@ -958,7 +958,7 @@ vr_values::extract_range_from_cond_expr >>> const value_range *vr1 = &tem1; >>> if (TREE_CODE (op1) == SSA_NAME) >>> vr1 = get_value_range (op1); >>> - else if (is_gimple_min_invariant (op1)) >>> + else if (constant_range_value_p (op1)) >>> tem1.set (op1); >>> else >>> tem1.set_varying (TREE_TYPE (op1)); >>> @@ -987,7 +987,7 @@ vr_values::extract_range_from_comparison >>> its type may be different from _Bool. Convert VAL to >EXPR's >>> type. */ >>> val = fold_convert (type, val); >>> - if (is_gimple_min_invariant (val)) >>> + if (constant_range_value_p (val)) >>> vr->set (val); >>> else >>> vr->update (VR_RANGE, val, val); >>> @@ -1479,7 +1479,7 @@ vr_values::extract_range_from_assignment >>> gimple_assign_rhs1 (stmt), >>> gimple_assign_rhs2 (stmt)); >>> else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS >>> - && is_gimple_min_invariant (gimple_assign_rhs1 (stmt))) >>> + && constant_range_value_p (gimple_assign_rhs1 (stmt))) >>> vr->set (gimple_assign_rhs1 (stmt)); >>> else >>> vr->set_varying (TREE_TYPE (gimple_assign_lhs (stmt))); >>> @@ -1756,7 +1756,7 @@ vr_values::adjust_range_with_scev (value >>> chrec = instantiate_parameters (loop, analyze_scalar_evolution >(loop, var)); >>> >>> /* Like in PR19590, scev can return a constant function. */ >>> - if (is_gimple_min_invariant (chrec)) >>> + if (constant_range_value_p (chrec)) >>> { >>> vr->set (chrec); >>> return; >>> @@ -1779,7 +1779,7 @@ vr_values::adjust_range_with_scev (value >>> a simple expression, compare_values and possibly other >functions >>> in tree-vrp won't be able to handle it. */ >>> if (step == NULL_TREE >>> - || !is_gimple_min_invariant (step) >>> + || !constant_range_value_p (step) >>> || !valid_value_p (init)) >>> return; >>> >>> @@ -1841,7 +1841,7 @@ vr_values::adjust_range_with_scev (value >>> >>> if (TREE_CODE (init) == SSA_NAME) >>> initvr = *(get_value_range (init)); >>> - else if (is_gimple_min_invariant (init)) >>> + else if (constant_range_value_p (init)) >>> initvr.set (init); >>> else >>> return; >>> @@ -1995,7 +1995,7 @@ vrp_valueize (tree name) >>> const value_range *vr = x_vr_values->get_value_range (name); >>> if (vr->kind () == VR_RANGE >>> && (TREE_CODE (vr->min ()) == SSA_NAME >>> - || is_gimple_min_invariant (vr->min ())) >>> + || constant_range_value_p (vr->min ())) >>> && vrp_operand_equal_p (vr->min (), vr->max ())) >>> return vr->min (); >>> } >>> @@ -2077,7 +2077,7 @@ vr_values::vrp_visit_assignment_or_call >>> extract_range_from_ssa_name (vr, tem); >>> return; >>> } >>> - else if (is_gimple_min_invariant (tem)) >>> + else if (constant_range_value_p (tem)) >>> { >>> vr->set (tem); >>> return; >>> @@ -2475,7 +2475,7 @@ vr_values::vrp_evaluate_conditional (tre >>> enum warn_strict_overflow_code wc; >>> const char* warnmsg; >>> >>> - if (is_gimple_min_invariant (ret)) >>> + if (constant_range_value_p (ret)) >>> { >>> wc = WARN_STRICT_OVERFLOW_CONDITIONAL; >>> warnmsg = G_("assuming signed overflow does not occur when >" >>> @@ -2517,7 +2517,7 @@ vr_values::vrp_evaluate_conditional (tre >>> && INTEGRAL_TYPE_P (type) >>> && vrp_val_is_min (vr0->min ()) >>> && vrp_val_is_max (vr0->max ()) >>> - && is_gimple_min_invariant (op1)) >>> + && constant_range_value_p (op1)) >>> { >>> location_t location; >>> >>> @@ -3361,14 +3361,14 @@ vr_values::simplify_bit_ops_using_ranges >>> >>> if (TREE_CODE (op0) == SSA_NAME) >>> vr0 = *(get_value_range (op0)); >>> - else if (is_gimple_min_invariant (op0)) >>> + else if (constant_range_value_p (op0)) >>> vr0.set (op0); >>> else >>> return false; >>> >>> if (TREE_CODE (op1) == SSA_NAME) >>> vr1 = *(get_value_range (op1)); >>> - else if (is_gimple_min_invariant (op1)) >>> + else if (constant_range_value_p (op1)) >>> vr1.set (op1); >>> else >>> return false; >>> @@ -3481,7 +3481,7 @@ test_for_singularity (enum tree_code con >>> /* If the new min/max values have converged to a single >value, >>> then there is only one value which can satisfy the >condition, >>> return that value. */ >>> - if (operand_equal_p (min, max, 0) && is_gimple_min_invariant >(min)) >>> + if (operand_equal_p (min, max, 0) && constant_range_value_p >(min)) >>> return min; >>> } >>> return NULL; >>> @@ -3554,7 +3554,7 @@ vr_values::simplify_cond_using_ranges_1 >>> && cond_code != EQ_EXPR >>> && TREE_CODE (op0) == SSA_NAME >>> && INTEGRAL_TYPE_P (TREE_TYPE (op0)) >>> - && is_gimple_min_invariant (op1)) >>> + && constant_range_value_p (op1)) >>> { >>> const value_range *vr = get_value_range (op0); >>>