Message ID | e83caa67-31d5-4fbb-678f-f5e689c5a2fa@redhat.com |
---|---|
State | New |
Headers | show |
Series | [COMMITTED] Export global ranges during the VRP block walk. | expand |
Hi Andrew > On 13 May 2022, at 14:58, Andrew MacLeod via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > VRP currently searches the ssa_name list for globals to exported after it finishes running. This change simply exports globals as they are calculated for the final time during the DOM walk. > > This avoid the occasional awkwardness of determined what ssa-names in the list are important, as well as allowing forthcoming side-effect code to adjust what is currently known as a global value during the walk without affecting the values exported for the entire function. > > Bootstrapped on x86_64-pc-linux-gnu with no regressions. Pushed. This (r13-436-gaf34279921f4) appears to cause or expose a problem which breaks bootstrap with in-tree MPFR on at least x86_64-linux/darwin. thanks Iain during GIMPLE pass: threadfull ../../../src/mpfr/src/sin_cos.c: In function ‘mpfr_sin_cos’: ../../../src/mpfr/src/sin_cos.c:29:1: internal compiler error: in type, at value-range.h:225 29 | mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mpfr_rnd_t rnd_mode) | ^~~~~~~~~~~~ 0x107d316 irange::type() const ../../src/gcc/value-range.h:225 0x2a0052d operator_minus::lhs_op1_relation(irange const&, irange const&, irange const&, relation_kind_t) const ../../src/gcc/range-op.cc:1349 0x28a4a6a fold_using_range::range_of_range_op(irange&, gimple*, fur_source&) ../../src/gcc/gimple-range-fold.cc:643 0x28a43e4 fold_using_range::fold_stmt(irange&, gimple*, fur_source&, tree_node*) ../../src/gcc/gimple-range-fold.cc:555 0x28a380f fold_range(irange&, gimple*, edge_def*, range_query*) ../../src/gcc/gimple-range-fold.cc:326 0x28accb3 gori_compute::outgoing_edge_range_p(irange&, edge_def*, tree_node*, range_query&) ../../src/gcc/gimple-range-gori.cc:1298 0x289e775 ranger_cache::range_from_dom(irange&, tree_node*, basic_block_def*, ranger_cache::rfd_mode) ../../src/gcc/gimple-range-cache.cc:1511 0x289dc50 ranger_cache::fill_block_cache(tree_node*, basic_block_def*, basic_block_def*) ../../src/gcc/gimple-range-cache.cc:1311 0x289d2a6 ranger_cache::block_range(irange&, basic_block_def*, tree_node*, bool) ../../src/gcc/gimple-range-cache.cc:1139 0x289830a gimple_ranger::range_on_entry(irange&, basic_block_def*, tree_node*) ../../src/gcc/gimple-range.cc:154 0x289817e gimple_ranger::range_of_expr(irange&, tree_node*, gimple*) ../../src/gcc/gimple-range.cc:128 0x165d10f path_range_query::range_on_path_entry(irange&, tree_node*) ../../src/gcc/gimple-range-path.cc:162 0x165d327 path_range_query::internal_range_of_expr(irange&, tree_node*, gimple*) ../../src/gcc/gimple-range-path.cc:203 0x165d435 path_range_query::range_of_expr(irange&, tree_node*, gimple*) ../../src/gcc/gimple-range-path.cc:225 0x28a30b9 fur_stmt::get_operand(irange&, tree_node*) ../../src/gcc/gimple-range-fold.cc:157 0x28abca9 gori_compute::compute_operand1_range(irange&, gimple*, irange const&, tree_node*, fur_source&) ../../src/gcc/gimple-range-gori.cc:1023 0x28ab121 gori_compute::compute_operand_range(irange&, gimple*, irange const&, tree_node*, fur_source&) ../../src/gcc/gimple-range-gori.cc:760 0x28ac05d gori_compute::compute_operand1_range(irange&, gimple*, irange const&, tree_node*, fur_source&) ../../src/gcc/gimple-range-gori.cc:1077 0x28ab121 gori_compute::compute_operand_range(irange&, gimple*, irange const&, tree_node*, fur_source&) ../../src/gcc/gimple-range-gori.cc:760 0x28aca70 gori_compute::outgoing_edge_range_p(irange&, edge_def*, tree_node*, range_query&) ../../src/gcc/gimple-range-gori.cc:1271
On 5/14/22 10:00, Iain Sandoe via Gcc-patches wrote: > Hi Andrew > >> On 13 May 2022, at 14:58, Andrew MacLeod via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: >> >> VRP currently searches the ssa_name list for globals to exported after it finishes running. This change simply exports globals as they are calculated for the final time during the DOM walk. >> >> This avoid the occasional awkwardness of determined what ssa-names in the list are important, as well as allowing forthcoming side-effect code to adjust what is currently known as a global value during the walk without affecting the values exported for the entire function. >> >> Bootstrapped on x86_64-pc-linux-gnu with no regressions. Pushed. > > This (r13-436-gaf34279921f4) appears to cause or expose a problem which breaks bootstrap with in-tree MPFR on at least x86_64-linux/darwin. > > thanks > Iain > > during GIMPLE pass: threadfull > ../../../src/mpfr/src/sin_cos.c: In function ‘mpfr_sin_cos’: > ../../../src/mpfr/src/sin_cos.c:29:1: internal compiler error: in type, at value-range.h:225 > 29 | mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mpfr_rnd_t rnd_mode) > | ^~~~~~~~~~~~ > 0x107d316 irange::type() const > ../../src/gcc/value-range.h:225 Seems to have been fixed in r13-449. Compare: https://gcc.gnu.org/pipermail/gcc-testresults/2022-May/761443.html with (r13-448): https://gcc.gnu.org/pipermail/gcc-testresults/2022-May/761431.html Kind regards,
Hi Andrew, Toon, > On 14 May 2022, at 09:09, Toon Moene <toon@moene.org> wrote: > On 5/14/22 10:00, Iain Sandoe via Gcc-patches wrote: >>> On 13 May 2022, at 14:58, Andrew MacLeod via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: >>> >>> VRP currently searches the ssa_name list for globals to exported after it finishes running. This change simply exports globals as they are calculated for the final time during the DOM walk. >>> >>> This avoid the occasional awkwardness of determined what ssa-names in the list are important, as well as allowing forthcoming side-effect code to adjust what is currently known as a global value during the walk without affecting the values exported for the entire function. >>> >>> Bootstrapped on x86_64-pc-linux-gnu with no regressions. Pushed. >> This (r13-436-gaf34279921f4) appears to cause or expose a problem which breaks bootstrap with in-tree MPFR on at least x86_64-linux/darwin. >> thanks >> Iain >> during GIMPLE pass: threadfull >> ../../../src/mpfr/src/sin_cos.c: In function ‘mpfr_sin_cos’: >> ../../../src/mpfr/src/sin_cos.c:29:1: internal compiler error: in type, at value-range.h:225 >> 29 | mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mpfr_rnd_t rnd_mode) >> | ^~~~~~~~~~~~ >> 0x107d316 irange::type() const >> ../../src/gcc/value-range.h:225 > Seems to have been fixed in r13-449. yes, indeed (thanks for the fix Andrew). > Compare: > > https://gcc.gnu.org/pipermail/gcc-testresults/2022-May/761443.html > > with (r13-448): Which, by the law of maximum cussedness, was exactly the revision I pulled for weekly test runs :/ sorry for the noise, Iain
commit af34279921f4bb95b07c0be7fce9baeffafcb53d Author: Andrew MacLeod <amacleod@redhat.com> Date: Wed Feb 16 19:59:34 2022 -0500 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. diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index f0caefce2a3..1fdee026a4b 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 0cbd9d369ca..8ba9ca7328f 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);