diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2022-02-16 19:59:34 -0500 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2022-05-13 09:57:03 -0400 |
commit | af34279921f4bb95b07c0be7fce9baeffafcb53d (patch) | |
tree | 0b08ab1d4fb5de1f669c4c7eadf02d3170a324b0 | |
parent | 602a3161f425ee3fe325413eeab9792e8e07a2ff (diff) | |
download | gcc-af34279921f4bb95b07c0be7fce9baeffafcb53d.zip gcc-af34279921f4bb95b07c0be7fce9baeffafcb53d.tar.gz gcc-af34279921f4bb95b07c0be7fce9baeffafcb53d.tar.bz2 |
Export global ranges during the VRP block walk.
VRP currently searches the ssa_name list for globals to exported after it
finishes running. Recent changes have VRP calling a side-effect routine for
each stmt during the walk. This change simply exports globals as they are
calculated the final time during the walk.
* gimple-range.cc (gimple_ranger::register_side_effects): First check
if the DEF should be exported as a global.
* tree-vrp.cc (rvrp_folder::pre_fold_bb): Process PHI side effects,
which will export globals.
(execute_ranger_vrp): Remove call to export_global_ranges.
-rw-r--r-- | gcc/gimple-range.cc | 22 | ||||
-rw-r--r-- | gcc/tree-vrp.cc | 4 |
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index f0caefc..1fdee02 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -458,6 +458,28 @@ gimple_ranger::fold_stmt (gimple_stmt_iterator *gsi, tree (*valueize) (tree)) void gimple_ranger::register_side_effects (gimple *s) { + // First, export the LHS if it is a new global range. + tree lhs = gimple_get_lhs (s); + if (lhs) + { + int_range_max tmp; + if (range_of_stmt (tmp, s, lhs) && !tmp.varying_p () + && update_global_range (tmp, lhs) && dump_file) + { + value_range vr = tmp; + fprintf (dump_file, "Global Exported: "); + print_generic_expr (dump_file, lhs, TDF_SLIM); + fprintf (dump_file, " = "); + vr.dump (dump_file); + int_range_max same = vr; + if (same != tmp) + { + fprintf (dump_file, " ... irange was : "); + tmp.dump (dump_file); + } + fputc ('\n', dump_file); + } + } m_cache.block_apply_nonnull (s); } diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 0cbd9d3..8ba9ca7 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -4302,6 +4302,9 @@ public: void pre_fold_bb (basic_block bb) OVERRIDE { m_pta->enter (bb); + for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); + gsi_next (&gsi)) + m_ranger->register_side_effects (gsi.phi ()); } void post_fold_bb (basic_block bb) OVERRIDE @@ -4345,7 +4348,6 @@ execute_ranger_vrp (struct function *fun, bool warn_array_bounds_p) gimple_ranger *ranger = enable_ranger (fun); rvrp_folder folder (ranger); folder.substitute_and_fold (); - ranger->export_global_ranges (); if (dump_file && (dump_flags & TDF_DETAILS)) ranger->dump (dump_file); |