From: Aldy Hernandez Date: Fri, 3 Sep 2021 09:22:26 +0000 (+0200) Subject: Use non-null knowledge in path_range_query. X-Git-Tag: basepoints/gcc-13~4980 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=410e8742638dadc8f84db681ca7bd9c031d41446;p=thirdparty%2Fgcc.git Use non-null knowledge in path_range_query. This patch improves ranges for pointers we are interested in a path, by using the non-null class from the ranger. This allows us to thread more paths with minimal effort. Tested on x86-64 Linux. gcc/ChangeLog: * gimple-range-path.cc (path_range_query::range_defined_in_block): Adjust for non-null. (path_range_query::adjust_for_non_null_uses): New. (path_range_query::precompute_ranges): Call adjust_for_non_null_uses. * gimple-range-path.h: Add m_non_null and adjust_for_non_null_uses. --- diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc index 6d6e5eb66354..db15eb3ff227 100644 --- a/gcc/gimple-range-path.cc +++ b/gcc/gimple-range-path.cc @@ -221,6 +221,9 @@ path_range_query::range_defined_in_block (irange &r, tree name, basic_block bb) else if (!fold_range (r, def_stmt, this)) r.set_varying (TREE_TYPE (name)); + if (bb) + m_non_null.adjust_range (r, name, bb); + if (DEBUG_SOLVER && (bb || !r.varying_p ())) { fprintf (dump_file, "range_defined_in_block (BB%d) for ", bb ? bb->index : -1); @@ -302,6 +305,35 @@ path_range_query::precompute_ranges_in_block (basic_block bb) } } +// Adjust all pointer imports in BB with non-null information. + +void +path_range_query::adjust_for_non_null_uses (basic_block bb) +{ + int_range_max r; + bitmap_iterator bi; + unsigned i; + + EXECUTE_IF_SET_IN_BITMAP (m_imports, 0, i, bi) + { + tree name = ssa_name (i); + + if (!POINTER_TYPE_P (TREE_TYPE (name))) + continue; + + if (get_cache (r, name)) + { + if (r.nonzero_p ()) + continue; + } + else + r.set_varying (TREE_TYPE (name)); + + if (m_non_null.adjust_range (r, name, bb)) + set_cache (r, name); + } +} + // Precompute the ranges for IMPORTS along PATH. // // IMPORTS are the set of SSA names, any of which could potentially @@ -332,6 +364,7 @@ path_range_query::precompute_ranges (const vec &path, basic_block bb = curr_bb (); precompute_ranges_in_block (bb); + adjust_for_non_null_uses (bb); if (at_exit ()) break; diff --git a/gcc/gimple-range-path.h b/gcc/gimple-range-path.h index 0d2d2e7f75d2..517731310402 100644 --- a/gcc/gimple-range-path.h +++ b/gcc/gimple-range-path.h @@ -53,6 +53,7 @@ private: // Methods to precompute ranges for the given path. bool range_defined_in_block (irange &, tree name, basic_block bb); void precompute_ranges_in_block (basic_block bb); + void adjust_for_non_null_uses (basic_block bb); void ssa_range_in_phi (irange &r, gphi *phi); // Path navigation. @@ -80,6 +81,7 @@ private: const bitmap_head *m_imports; gimple_ranger &m_ranger; + non_null_ref m_non_null; }; #endif // GCC_TREE_SSA_THREADSOLVER_H