From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1011) id 05BB0394AC20; Fri, 18 Jun 2021 21:44:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 05BB0394AC20 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Macleod To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-1653] Calculate a global definition if one has not been registered. X-Act-Checkin: gcc X-Git-Author: Andrew MacLeod X-Git-Refname: refs/heads/master X-Git-Oldrev: 870b674f72d4894b94efa61764fd87ecec29ffde X-Git-Newrev: cb448ade74da1de1633e6ed97f8c5ecbac24b27a Message-Id: <20210618214444.05BB0394AC20@sourceware.org> Date: Fri, 18 Jun 2021 21:44:44 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jun 2021 21:44:44 -0000 https://gcc.gnu.org/g:cb448ade74da1de1633e6ed97f8c5ecbac24b27a commit r12-1653-gcb448ade74da1de1633e6ed97f8c5ecbac24b27a Author: Andrew MacLeod Date: Fri Jun 18 12:52:10 2021 -0400 Calculate a global definition if one has not been registered. With poor values gone, Pick up range restrictions from statements by folding them with global cache values. * gimple-range-cache.cc (ranger_cache::range_of_def): Calculate a range if global is not available. (ranger_cache::entry_range): Fallback to range_of_def. * gimple-range-cache.h (range_of_def): Adjust prototype. Diff: --- gcc/gimple-range-cache.cc | 24 +++++++++++++++--------- gcc/gimple-range-cache.h | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index c85b299d13e..def604dc149 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -824,19 +824,27 @@ ranger_cache::set_global_range (tree name, const irange &r) // of an ssa_name in any given basic block. Note, this does no additonal // lookups, just accesses the data that is already known. -// Get the range of NAME when the def occurs in block BB +// Get the range of NAME when the def occurs in block BB. If BB is NULL +// get the best global value available. void ranger_cache::range_of_def (irange &r, tree name, basic_block bb) { gcc_checking_assert (gimple_range_ssa_p (name)); - gcc_checking_assert (bb == gimple_bb (SSA_NAME_DEF_STMT (name))); + gcc_checking_assert (!bb || bb == gimple_bb (SSA_NAME_DEF_STMT (name))); // Pick up the best global range available. if (!m_globals.get_global_range (r, name)) - r = gimple_range_global (name); + { + // If that fails, try to calculate the range using just global values. + gimple *s = SSA_NAME_DEF_STMT (name); + if (gimple_get_lhs (s) == name) + fold_range (r, s, get_global_range_query ()); + else + r = gimple_range_global (name); + } - if (r.varying_p () && m_non_null.non_null_deref_p (name, bb, false) && + if (bb && r.varying_p () && m_non_null.non_null_deref_p (name, bb, false) && !cfun->can_throw_non_call_exceptions) r = range_nonzero (TREE_TYPE (name)); } @@ -853,12 +861,10 @@ ranger_cache::entry_range (irange &r, tree name, basic_block bb) } // Look for the on-entry value of name in BB from the cache. + // Otherwise pick up the best available global value. if (!m_on_entry.get_bb_range (r, name, bb)) - { - // Try to pick up any known global value. - if (!m_globals.get_global_range (r, name)) - r = gimple_range_global (name); - } + range_of_def (r, name); + // Check if pointers have any non-null dereferences. Non-call // exceptions mean we could throw in the middle of the block, so just // punt for now on those. diff --git a/gcc/gimple-range-cache.h b/gcc/gimple-range-cache.h index e67af68f30b..04150ea54a8 100644 --- a/gcc/gimple-range-cache.h +++ b/gcc/gimple-range-cache.h @@ -115,7 +115,7 @@ private: void fill_block_cache (tree name, basic_block bb, basic_block def_bb); void propagate_cache (tree name); - void range_of_def (irange &r, tree name, basic_block bb); + void range_of_def (irange &r, tree name, basic_block bb = NULL); void entry_range (irange &r, tree expr, basic_block bb); void exit_range (irange &r, tree expr, basic_block bb);