From 694c956b6b877e48323cf86c90c09237b7b0e8c8 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Sat, 17 Apr 2021 14:26:33 +0200 Subject: [PATCH] Remove irange::varying_p checks from symbolic_p and constant_p. As of a few releases ago, varying_p() ranges are also constant_p. Consequently, there is no need to check varying_p from either symbolic_p or constant_p. I have adjusted a few users of constant_p that were depending on constant_p returning false for varying_p. In these cases, I have placed the varying_p check before the constant_p check to avoid the more expensive constant_p check when possible. gcc/ChangeLog: * gimple-ssa-evrp-analyze.c (evrp_range_analyzer::set_ssa_range_info): Adjust for constant_p including varying_p. * tree-vrp.c (vrp_prop::finalize): Same. (determine_value_range): Same. * vr-values.c (vr_values::range_of_expr): Same. * value-range.cc (irange::symbolic_p): Do not check varying_p. (irange::constant_p): Same. --- gcc/gimple-ssa-evrp-analyze.c | 2 +- gcc/tree-vrp.c | 4 ++-- gcc/value-range.cc | 11 +++-------- gcc/vr-values.c | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c index 4c474cdfb4d..d78b6f8423c 100644 --- a/gcc/gimple-ssa-evrp-analyze.c +++ b/gcc/gimple-ssa-evrp-analyze.c @@ -109,7 +109,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range_equiv *vr) /* Set the SSA with the value range. */ if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))) { - if (vr->constant_p ()) + if (!vr->varying_p () && vr->constant_p ()) set_range_info (lhs, vr->kind (), wi::to_wide (vr->min ()), wi::to_wide (vr->max ())); diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 62b90079a03..d968ef288ff 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4059,7 +4059,7 @@ vrp_prop::finalize () continue; const value_range_equiv *vr = m_vr_values->get_value_range (name); - if (!name || !vr->constant_p ()) + if (!name || vr->varying_p () || !vr->constant_p ()) continue; if (POINTER_TYPE_P (TREE_TYPE (name)) @@ -4679,7 +4679,7 @@ determine_value_range (tree expr, wide_int *min, wide_int *max) { value_range vr; determine_value_range_1 (&vr, expr); - if (vr.constant_p ()) + if (!vr.varying_p () && vr.constant_p ()) { *min = wi::to_wide (vr.min ()); *max = wi::to_wide (vr.max ()); diff --git a/gcc/value-range.cc b/gcc/value-range.cc index d46662397e7..f5ef4808530 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -534,22 +534,17 @@ irange::equal_p (const irange &other) const bool irange::symbolic_p () const { - return (!varying_p () - && !undefined_p () + return (m_num_ranges > 0 && (!is_gimple_min_invariant (min ()) || !is_gimple_min_invariant (max ()))); } -/* NOTE: This is not the inverse of symbolic_p because the range - could also be varying or undefined. Ideally they should be inverse - of each other, with varying only applying to symbolics. Varying of - constants would be represented as [-MIN, +MAX]. */ +/* Return TRUE if this is a constant range. */ bool irange::constant_p () const { - return (!varying_p () - && !undefined_p () + return (m_num_ranges > 0 && TREE_CODE (min ()) == INTEGER_CST && TREE_CODE (max ()) == INTEGER_CST); } diff --git a/gcc/vr-values.c b/gcc/vr-values.c index e117f66d1bd..08b237b2632 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -182,7 +182,7 @@ vr_values::range_of_expr (irange &r, tree expr, gimple *stmt) if (const value_range *vr = get_value_range (expr, stmt)) { - if (vr->undefined_p () || vr->varying_p () || vr->constant_p ()) + if (vr->undefined_p () || vr->constant_p ()) r = *vr; else {