diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-06-23 15:25:45 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-06-24 13:25:58 -0400 |
commit | 5bdcfb74ff97b42f08993af8614c35685fdd8689 (patch) | |
tree | 573c834dd99bba578438d63718260251f5b61c1d | |
parent | 90fa63e134f478c775b64b281901ecbba3c9f15b (diff) | |
download | gcc-5bdcfb74ff97b42f08993af8614c35685fdd8689.zip gcc-5bdcfb74ff97b42f08993af8614c35685fdd8689.tar.gz gcc-5bdcfb74ff97b42f08993af8614c35685fdd8689.tar.bz2 |
Correctly unify recomputation with existing range.
When propagating the on-entry cache, new block ranges are calculated
by combining all the incoming edges and comparing to the old value.
When a recomputation was performed on an edge, it didn't take into account
that the value in the block may already be better than a potential
recompuation... Thus a worse values was sometimes propagated.
Fixed by simply calling the now correct range_on_edge the cache provides.
* gimple-range-cache.cc (ranger_cache::propagate_cache): Call
range_on_edge instead of manually calculating.
-rw-r--r-- | gcc/gimple-range-cache.cc | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index a377261..98ecdbb 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -1037,27 +1037,12 @@ ranger_cache::propagate_cache (tree name) new_range.set_undefined (); FOR_EACH_EDGE (e, ei, bb->preds) { + range_on_edge (e_range, e, name); if (DEBUG_RANGE_CACHE) - fprintf (dump_file, " edge %d->%d :", e->src->index, bb->index); - // Get whatever range we can for this edge. - if (!m_gori.outgoing_edge_range_p (e_range, e, name, *this)) { - exit_range (e_range, name, e->src); - if (DEBUG_RANGE_CACHE) - { - fprintf (dump_file, "No outgoing edge range, picked up "); - e_range.dump (dump_file); - fprintf (dump_file, "\n"); - } - } - else - { - if (DEBUG_RANGE_CACHE) - { - fprintf (dump_file, "outgoing range :"); - e_range.dump (dump_file); - fprintf (dump_file, "\n"); - } + fprintf (dump_file, " edge %d->%d :", e->src->index, bb->index); + e_range.dump (dump_file); + fprintf (dump_file, "\n"); } new_range.union_ (e_range); if (new_range.varying_p ()) @@ -1074,7 +1059,11 @@ ranger_cache::propagate_cache (tree name) if (DEBUG_RANGE_CACHE) { if (!ok_p) - fprintf (dump_file, " Cache failure to store value."); + { + fprintf (dump_file, " Cache failure to store value:"); + print_generic_expr (dump_file, name, TDF_SLIM); + fprintf (dump_file, " "); + } else { fprintf (dump_file, " Updating range to "); |