diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2021-09-03 11:22:26 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2021-09-03 15:30:57 +0200 |
commit | 410e8742638dadc8f84db681ca7bd9c031d41446 (patch) | |
tree | aad68d5fc37166b8a2beb71595296d3023383407 /gcc | |
parent | 134289146468b0b7215159d1940a674e1c3b228e (diff) | |
download | gcc-410e8742638dadc8f84db681ca7bd9c031d41446.zip gcc-410e8742638dadc8f84db681ca7bd9c031d41446.tar.gz gcc-410e8742638dadc8f84db681ca7bd9c031d41446.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-range-path.cc | 33 | ||||
-rw-r--r-- | gcc/gimple-range-path.h | 2 |
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc index 6d6e5eb..db15eb3 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<basic_block> &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 0d2d2e7..5177313 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 |