From patchwork Fri Apr 29 09:02:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aldy Hernandez X-Patchwork-Id: 53342 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2BE6D385736F for ; Fri, 29 Apr 2022 09:08:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2BE6D385736F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1651223290; bh=3THMBHitYeyvj9NQxyYSWkgro3AvX4miPi1RrOVLNGM=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=oKshLY+2fhky6Hby7GXncSYbx1l79us8p2SaL73Mw3r70DS5IuBs9iKs/oewCt75K tDRPTxQNHAfi+sis7r6Cl6Ge0Feuu8r90npI+GywktZ1JHi3/dqxP+85nCZ9y+HdDQ g9+royStc594CgC78wpEIA7G2/+7TxTIwcmar4PY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 511BF385737F for ; Fri, 29 Apr 2022 09:05:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 511BF385737F Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-219-gZYnqJtEMyW7xw_AbE2Uug-1; Fri, 29 Apr 2022 05:05:54 -0400 X-MC-Unique: gZYnqJtEMyW7xw_AbE2Uug-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2910C281183C for ; Fri, 29 Apr 2022 09:05:54 +0000 (UTC) Received: from abulafia (unknown [10.39.192.47]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A70F31468947; Fri, 29 Apr 2022 09:05:53 +0000 (UTC) Received: from abulafia (localhost [127.0.0.1]) by abulafia (8.17.1/8.17.1) with ESMTPS id 23T95prl731602 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 29 Apr 2022 11:05:51 +0200 Received: (from aldyh@localhost) by abulafia (8.17.1/8.17.1/Submit) id 23T95p9E731315; Fri, 29 Apr 2022 11:05:51 +0200 To: GCC patches Subject: [COMMITTED] Prefer global range info setters that take a range. Date: Fri, 29 Apr 2022 11:02:34 +0200 Message-Id: <20220429090236.718140-3-aldyh@redhat.com> In-Reply-To: <20220429090236.718140-1-aldyh@redhat.com> References: <20220429090236.718140-1-aldyh@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Aldy Hernandez via Gcc-patches From: Aldy Hernandez Reply-To: Aldy Hernandez Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This patch consolidates the multiple ways we have of storing global ranges into one accepting a range. In an upcoming patch series later this cycle we will be providing a way to store iranges globally, as opposed to the mechanism we have now which squishes wider ranges into value_range's. This is preparation for such work. Tested and benchmarked on x86-64 Linux. gcc/ChangeLog: * gimple-ssa-evrp-analyze.cc (evrp_range_analyzer::set_ssa_range_info): Use *range_info methods that take a range. * gimple-ssa-sprintf.cc (try_substitute_return_value): Same. * ipa-prop.cc (ipcp_update_vr): Same. * tree-inline.cc (remap_ssa_name): Same. * tree-ssa-copy.cc (fini_copy_prop): Same. * tree-ssa-math-opts.cc (optimize_spaceship): Same. * tree-ssa-phiopt.cc (replace_phi_edge_with_variable): Same. * tree-ssa-pre.cc (insert_into_preds_of_block): Same. * tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Same. * tree-ssa-strlen.cc (set_strlen_range): Same. (strlen_pass::handle_builtin_string_cmp): Same. * tree-ssanames.cc (set_range_info): Make static. (duplicate_ssa_name_range_info): Make static and add a new variant calling the static. * tree-ssanames.h (set_range_info): Remove version taking wide ints. (duplicate_ssa_name_range_info): Remove version taking a range_info_def and replace with a version taking SSA names. * tree-vect-loop-manip.cc (vect_gen_vector_loop_niters): Use *range_info methods that take a range. (vect_do_peeling): Same. * tree-vrp.cc (vrp_asserts::remove_range_assertions): Same. * vr-values.cc (simplify_truth_ops_using_ranges): Same. --- gcc/gimple-ssa-evrp-analyze.cc | 4 +--- gcc/gimple-ssa-sprintf.cc | 3 ++- gcc/ipa-prop.cc | 12 +++++----- gcc/tree-inline.cc | 6 ++--- gcc/tree-ssa-copy.cc | 4 +--- gcc/tree-ssa-math-opts.cc | 3 ++- gcc/tree-ssa-phiopt.cc | 4 +--- gcc/tree-ssa-pre.cc | 13 +++++------ gcc/tree-ssa-sccvn.cc | 4 +--- gcc/tree-ssa-strlen.cc | 8 ++++--- gcc/tree-ssanames.cc | 12 ++++++++-- gcc/tree-ssanames.h | 5 +---- gcc/tree-vect-loop-manip.cc | 41 +++++++++++++++++++++------------- gcc/tree-vrp.cc | 13 ++++++++--- gcc/vr-values.cc | 9 +++++--- 15 files changed, 79 insertions(+), 62 deletions(-) diff --git a/gcc/gimple-ssa-evrp-analyze.cc b/gcc/gimple-ssa-evrp-analyze.cc index bed6dc2a70e..5b6c9f8fe1b 100644 --- a/gcc/gimple-ssa-evrp-analyze.cc +++ b/gcc/gimple-ssa-evrp-analyze.cc @@ -110,9 +110,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range_equiv *vr) if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))) { if (!vr->varying_p () && vr->constant_p ()) - set_range_info (lhs, vr->kind (), - wi::to_wide (vr->min ()), - wi::to_wide (vr->max ())); + set_range_info (lhs, *vr); } else if (POINTER_TYPE_P (TREE_TYPE (lhs)) && range_includes_zero_p (vr) == 0) diff --git a/gcc/gimple-ssa-sprintf.cc b/gcc/gimple-ssa-sprintf.cc index c93f12f90b5..9a84fffed1a 100644 --- a/gcc/gimple-ssa-sprintf.cc +++ b/gcc/gimple-ssa-sprintf.cc @@ -4231,7 +4231,8 @@ try_substitute_return_value (gimple_stmt_iterator *gsi, wide_int min = wi::shwi (retval[0], prec); wide_int max = wi::shwi (retval[1], prec); - set_range_info (lhs, VR_RANGE, min, max); + value_range r (TREE_TYPE (lhs), min, max); + set_range_info (lhs, r); setrange = true; } diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index 0e5966332eb..80e67e93e12 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -5987,11 +5987,13 @@ ipcp_update_vr (struct cgraph_node *node) print_decs (vr[i].max, dump_file); fprintf (dump_file, "]\n"); } - set_range_info (ddef, vr[i].type, - wide_int_storage::from (vr[i].min, prec, - TYPE_SIGN (type)), - wide_int_storage::from (vr[i].max, prec, - TYPE_SIGN (type))); + value_range v (type, + wide_int_storage::from (vr[i].min, prec, + TYPE_SIGN (type)), + wide_int_storage::from (vr[i].max, prec, + TYPE_SIGN (type)), + vr[i].type); + set_range_info (ddef, v); } else if (POINTER_TYPE_P (TREE_TYPE (ddef)) && vr[i].nonzero_p (TREE_TYPE (ddef))) diff --git a/gcc/tree-inline.cc b/gcc/tree-inline.cc index ca66a8266b1..29bb758b7bc 100644 --- a/gcc/tree-inline.cc +++ b/gcc/tree-inline.cc @@ -253,8 +253,7 @@ remap_ssa_name (tree name, copy_body_data *id) /* So can range-info. */ if (!POINTER_TYPE_P (TREE_TYPE (name)) && SSA_NAME_RANGE_INFO (name)) - duplicate_ssa_name_range_info (new_tree, SSA_NAME_RANGE_TYPE (name), - SSA_NAME_RANGE_INFO (name)); + duplicate_ssa_name_range_info (new_tree, name); return new_tree; } @@ -291,8 +290,7 @@ remap_ssa_name (tree name, copy_body_data *id) /* So can range-info. */ if (!POINTER_TYPE_P (TREE_TYPE (name)) && SSA_NAME_RANGE_INFO (name)) - duplicate_ssa_name_range_info (new_tree, SSA_NAME_RANGE_TYPE (name), - SSA_NAME_RANGE_INFO (name)); + duplicate_ssa_name_range_info (new_tree, name); if (SSA_NAME_IS_DEFAULT_DEF (name)) { /* By inlining function having uninitialized variable, we might diff --git a/gcc/tree-ssa-copy.cc b/gcc/tree-ssa-copy.cc index 76513527a11..7d636ecd438 100644 --- a/gcc/tree-ssa-copy.cc +++ b/gcc/tree-ssa-copy.cc @@ -556,9 +556,7 @@ fini_copy_prop (void) && SSA_NAME_RANGE_INFO (var) && !SSA_NAME_RANGE_INFO (copy_of[i].value) && var_bb == copy_of_bb) - duplicate_ssa_name_range_info (copy_of[i].value, - SSA_NAME_RANGE_TYPE (var), - SSA_NAME_RANGE_INFO (var)); + duplicate_ssa_name_range_info (copy_of[i].value, var); } } diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index 7555793948e..b528b0523ff 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -4862,7 +4862,8 @@ optimize_spaceship (gimple *stmt) wide_int wm1 = wi::minus_one (TYPE_PRECISION (integer_type_node)); wide_int w2 = wi::two (TYPE_PRECISION (integer_type_node)); - set_range_info (lhs, VR_RANGE, wm1, w2); + value_range vr (TREE_TYPE (lhs), wm1, w2); + set_range_info (lhs, vr); } diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc index 3eda825672c..8c9c46d41f1 100644 --- a/gcc/tree-ssa-phiopt.cc +++ b/gcc/tree-ssa-phiopt.cc @@ -416,9 +416,7 @@ replace_phi_edge_with_variable (basic_block cond_block, && SSA_NAME_RANGE_INFO (phi_result) && gimple_bb (SSA_NAME_DEF_STMT (new_tree)) == cond_block && dbg_cnt (phiopt_edge_range)) - duplicate_ssa_name_range_info (new_tree, - SSA_NAME_RANGE_TYPE (phi_result), - SSA_NAME_RANGE_INFO (phi_result)); + duplicate_ssa_name_range_info (new_tree, phi_result); /* Change the PHI argument to new. */ SET_USE (PHI_ARG_DEF_PTR (phi, e->dest_idx), new_tree); diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc index 47d70c85c3c..a578ce6dfa4 100644 --- a/gcc/tree-ssa-pre.cc +++ b/gcc/tree-ssa-pre.cc @@ -3246,14 +3246,11 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum, && r.kind () == VR_RANGE && !wi::neg_p (r.lower_bound (), SIGNED) && !wi::neg_p (r.upper_bound (), SIGNED)) - /* Just handle extension and sign-changes of all-positive ranges. */ - set_range_info (temp, VR_RANGE, - wide_int_storage::from (r.lower_bound (), - TYPE_PRECISION (type), - TYPE_SIGN (type)), - wide_int_storage::from (r.upper_bound (), - TYPE_PRECISION (type), - TYPE_SIGN (type))); + { + /* Just handle extension and sign-changes of all-positive ranges. */ + range_cast (r, type); + set_range_info (temp, r); + } } if (dump_file && (dump_flags & TDF_DETAILS)) diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index d4d0aba880c..3c90c1e23e6 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -6304,9 +6304,7 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi) && SSA_NAME_RANGE_INFO (lhs) && ! SSA_NAME_RANGE_INFO (sprime) && b == sprime_b) - duplicate_ssa_name_range_info (sprime, - SSA_NAME_RANGE_TYPE (lhs), - SSA_NAME_RANGE_INFO (lhs)); + duplicate_ssa_name_range_info (sprime, lhs); } /* Inhibit the use of an inserted PHI on a loop header when diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index 9ae25d1dde2..1e5f911fedb 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -1951,7 +1951,8 @@ set_strlen_range (tree lhs, wide_int min, wide_int max, if (min == max) return wide_int_to_tree (size_type_node, min); - set_range_info (lhs, VR_RANGE, min, max); + value_range vr (TREE_TYPE (lhs), min, max); + set_range_info (lhs, vr); return lhs; } @@ -4343,8 +4344,9 @@ strlen_pass::handle_builtin_string_cmp () known to be unequal set the range of the result to non-zero. This allows the call to be eliminated if its result is only used in tests for equality to zero. */ - wide_int zero = wi::zero (TYPE_PRECISION (TREE_TYPE (lhs))); - set_range_info (lhs, VR_ANTI_RANGE, zero, zero); + value_range nz; + nz.set_nonzero (TREE_TYPE (lhs)); + set_range_info (lhs, nz); return false; } /* When the two strings are definitely equal (such as when they diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc index e0a6884f295..c957597af4f 100644 --- a/gcc/tree-ssanames.cc +++ b/gcc/tree-ssanames.cc @@ -389,7 +389,7 @@ set_range_info_raw (tree name, enum value_range_kind range_type, /* Store range information RANGE_TYPE, MIN, and MAX to tree ssa_name NAME while making sure we don't store useless range info. */ -void +static void set_range_info (tree name, enum value_range_kind range_type, const wide_int_ref &min, const wide_int_ref &max) { @@ -720,7 +720,7 @@ duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info) /* Creates a duplicate of the range_info_def at RANGE_INFO of type RANGE_TYPE for use by the SSA name NAME. */ -void +static void duplicate_ssa_name_range_info (tree name, enum value_range_kind range_type, struct range_info_def *range_info) { @@ -743,6 +743,14 @@ duplicate_ssa_name_range_info (tree name, enum value_range_kind range_type, SSA_NAME_RANGE_INFO (name) = new_range_info; } +void +duplicate_ssa_name_range_info (tree name, tree src) +{ + gcc_checking_assert (!POINTER_TYPE_P (TREE_TYPE (src))); + duplicate_ssa_name_range_info (name, + SSA_NAME_RANGE_TYPE (src), + SSA_NAME_RANGE_INFO (src)); +} /* Creates a duplicate of a ssa name NAME tobe defined by statement STMT diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h index 7538ba9b706..8c419b13e6a 100644 --- a/gcc/tree-ssanames.h +++ b/gcc/tree-ssanames.h @@ -67,8 +67,6 @@ struct GTY ((variable_size)) range_info_def { if (VAR) /* Sets the value range to SSA. */ -extern void set_range_info (tree, enum value_range_kind, const wide_int_ref &, - const wide_int_ref &); extern void set_range_info (tree, const value_range &); extern void set_nonzero_bits (tree, const wide_int_ref &); extern wide_int get_nonzero_bits (const_tree); @@ -92,8 +90,7 @@ extern void set_ptr_nonnull (tree); extern tree copy_ssa_name_fn (struct function *, tree, gimple *); extern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *); extern tree duplicate_ssa_name_fn (struct function *, tree, gimple *); -extern void duplicate_ssa_name_range_info (tree, enum value_range_kind, - struct range_info_def *); +extern void duplicate_ssa_name_range_info (tree dest, tree src); extern void reset_flow_sensitive_info (tree); extern void reset_flow_sensitive_info_in_bb (basic_block); extern void release_defs (gimple *); diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index e4381eb7079..3eddda66a66 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -2056,22 +2056,28 @@ vect_gen_vector_loop_niters (loop_vec_info loop_vinfo, tree niters, if (stmts != NULL && log_vf) { if (niters_no_overflow) - set_range_info (niters_vector, VR_RANGE, - wi::one (TYPE_PRECISION (type)), - wi::rshift (wi::max_value (TYPE_PRECISION (type), - TYPE_SIGN (type)), - exact_log2 (const_vf), - TYPE_SIGN (type))); + { + value_range vr (type, + wi::one (TYPE_PRECISION (type)), + wi::rshift (wi::max_value (TYPE_PRECISION (type), + TYPE_SIGN (type)), + exact_log2 (const_vf), + TYPE_SIGN (type))); + set_range_info (niters_vector, vr); + } /* For VF == 1 the vector IV might also overflow so we cannot assert a minimum value of 1. */ else if (const_vf > 1) - set_range_info (niters_vector, VR_RANGE, - wi::one (TYPE_PRECISION (type)), - wi::rshift (wi::max_value (TYPE_PRECISION (type), - TYPE_SIGN (type)) - - (const_vf - 1), - exact_log2 (const_vf), TYPE_SIGN (type)) - + 1); + { + value_range vr (type, + wi::one (TYPE_PRECISION (type)), + wi::rshift (wi::max_value (TYPE_PRECISION (type), + TYPE_SIGN (type)) + - (const_vf - 1), + exact_log2 (const_vf), TYPE_SIGN (type)) + + 1); + set_range_info (niters_vector, vr); + } } } *niters_vector_ptr = niters_vector; @@ -2888,9 +2894,12 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, /* It's guaranteed that vector loop bound before vectorization is at least VF, so set range information for newly generated var. */ if (new_var_p) - set_range_info (niters, VR_RANGE, - wi::to_wide (build_int_cst (type, vf)), - wi::to_wide (TYPE_MAX_VALUE (type))); + { + value_range vr (type, + wi::to_wide (build_int_cst (type, vf)), + wi::to_wide (TYPE_MAX_VALUE (type))); + set_range_info (niters, vr); + } /* Prolog iterates at most bound_prolog times, latch iterates at most bound_prolog - 1 times. */ diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index e9f19d0c8b9..ab6aa11c044 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -3742,9 +3742,16 @@ vrp_asserts::remove_range_assertions () && all_imm_uses_in_stmt_or_feed_cond (var, stmt, single_pred (bb))) { - set_range_info (var, SSA_NAME_RANGE_TYPE (lhs), - SSA_NAME_RANGE_INFO (lhs)->get_min (), - SSA_NAME_RANGE_INFO (lhs)->get_max ()); + /* We could use duplicate_ssa_name_range_info here + instead of peeking inside SSA_NAME_RANGE_INFO, + but the aforementioned asserts that the + destination has no global range. This is + slated for removal anyhow. */ + value_range r (TREE_TYPE (lhs), + SSA_NAME_RANGE_INFO (lhs)->get_min (), + SSA_NAME_RANGE_INFO (lhs)->get_max (), + SSA_NAME_RANGE_TYPE (lhs)); + set_range_info (var, r); maybe_set_nonzero_bits (single_pred_edge (bb), var); } } diff --git a/gcc/vr-values.cc b/gcc/vr-values.cc index f94da3130e3..122586fbcc8 100644 --- a/gcc/vr-values.cc +++ b/gcc/vr-values.cc @@ -2980,9 +2980,12 @@ simplify_using_ranges::simplify_truth_ops_using_ranges gsi_insert_before (gsi, newop, GSI_SAME_STMT); if (INTEGRAL_TYPE_P (TREE_TYPE (tem)) && TYPE_PRECISION (TREE_TYPE (tem)) > 1) - set_range_info (tem, VR_RANGE, - wi::zero (TYPE_PRECISION (TREE_TYPE (tem))), - wi::one (TYPE_PRECISION (TREE_TYPE (tem)))); + { + value_range vr (TREE_TYPE (tem), + wi::zero (TYPE_PRECISION (TREE_TYPE (tem))), + wi::one (TYPE_PRECISION (TREE_TYPE (tem)))); + set_range_info (tem, vr); + } gimple_assign_set_rhs_with_ops (gsi, NOP_EXPR, tem); } /* Or without. */