diff mbox series

[COMMITTED] Export global ranges during the VRP block walk.

Message ID e83caa67-31d5-4fbb-678f-f5e689c5a2fa@redhat.com
State New
Headers show
Series [COMMITTED] Export global ranges during the VRP block walk. | expand

Commit Message

Andrew MacLeod May 13, 2022, 1:58 p.m. UTC
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.

Andrew

Comments

Iain Sandoe May 14, 2022, 8 a.m. UTC | #1
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
Toon Moene May 14, 2022, 8:09 a.m. UTC | #2
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,
Iain Sandoe May 14, 2022, 9:52 a.m. UTC | #3
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
diff mbox series

Patch

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);