Message ID | 20210921225429.326017-2-iii@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | reassoc: Propagate PHI_LOOP_BIAS along single uses | expand |
On Wed, 22 Sep 2021, Ilya Leoshkevich wrote: > Biasing loop-carried PHIs during the 1st reassociation pass interferes > with reduction chains and does not bring measurable benefits, so do it > only during the 2nd reassociation pass. OK. Thanks, Richard. > gcc/ChangeLog: > > * passes.def (pass_reassoc): Rename parameter to early_p. > * tree-ssa-reassoc.c (reassoc_bias_loop_carried_phi_ranks_p): > New variable. > (phi_rank): Don't bias loop-carried phi ranks > before vectorization pass. > (execute_reassoc): Add bias_loop_carried_phi_ranks_p parameter. > (pass_reassoc::pass_reassoc): Add bias_loop_carried_phi_ranks_p > initializer. > (pass_reassoc::set_param): Set bias_loop_carried_phi_ranks_p > value. > (pass_reassoc::execute): Pass bias_loop_carried_phi_ranks_p to > execute_reassoc. > (pass_reassoc::bias_loop_carried_phi_ranks_p): New member. > --- > gcc/passes.def | 4 ++-- > gcc/tree-ssa-reassoc.c | 16 ++++++++++++++-- > 2 files changed, 16 insertions(+), 4 deletions(-) > > diff --git a/gcc/passes.def b/gcc/passes.def > index d7a1f8c97a6..c5f915d04c6 100644 > --- a/gcc/passes.def > +++ b/gcc/passes.def > @@ -242,7 +242,7 @@ along with GCC; see the file COPYING3. If not see > /* Identify paths that should never be executed in a conforming > program and isolate those paths. */ > NEXT_PASS (pass_isolate_erroneous_paths); > - NEXT_PASS (pass_reassoc, true /* insert_powi_p */); > + NEXT_PASS (pass_reassoc, true /* early_p */); > NEXT_PASS (pass_dce); > NEXT_PASS (pass_forwprop); > NEXT_PASS (pass_phiopt, false /* early_p */); > @@ -325,7 +325,7 @@ along with GCC; see the file COPYING3. If not see > NEXT_PASS (pass_lower_vector_ssa); > NEXT_PASS (pass_lower_switch); > NEXT_PASS (pass_cse_reciprocals); > - NEXT_PASS (pass_reassoc, false /* insert_powi_p */); > + NEXT_PASS (pass_reassoc, false /* early_p */); > NEXT_PASS (pass_strength_reduction); > NEXT_PASS (pass_split_paths); > NEXT_PASS (pass_tracer); > diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c > index 8498cfc7aa8..420c14e8cf5 100644 > --- a/gcc/tree-ssa-reassoc.c > +++ b/gcc/tree-ssa-reassoc.c > @@ -180,6 +180,10 @@ along with GCC; see the file COPYING3. If not see > point 3a in the pass header comment. */ > static bool reassoc_insert_powi_p; > > +/* Enable biasing ranks of loop accumulators. We don't want this before > + vectorization, since it interferes with reduction chains. */ > +static bool reassoc_bias_loop_carried_phi_ranks_p; > + > /* Statistics */ > static struct > { > @@ -269,6 +273,9 @@ phi_rank (gimple *stmt) > use_operand_p use; > gimple *use_stmt; > > + if (!reassoc_bias_loop_carried_phi_ranks_p) > + return bb_rank[bb->index]; > + > /* We only care about real loops (those with a latch). */ > if (!father->latch) > return bb_rank[bb->index]; > @@ -6940,9 +6947,10 @@ fini_reassoc (void) > optimization of a gimple conditional. Otherwise returns zero. */ > > static unsigned int > -execute_reassoc (bool insert_powi_p) > +execute_reassoc (bool insert_powi_p, bool bias_loop_carried_phi_ranks_p) > { > reassoc_insert_powi_p = insert_powi_p; > + reassoc_bias_loop_carried_phi_ranks_p = bias_loop_carried_phi_ranks_p; > > init_reassoc (); > > @@ -6983,15 +6991,19 @@ public: > { > gcc_assert (n == 0); > insert_powi_p = param; > + bias_loop_carried_phi_ranks_p = !param; > } > virtual bool gate (function *) { return flag_tree_reassoc != 0; } > virtual unsigned int execute (function *) > - { return execute_reassoc (insert_powi_p); } > + { > + return execute_reassoc (insert_powi_p, bias_loop_carried_phi_ranks_p); > + } > > private: > /* Enable insertion of __builtin_powi calls during execute_reassoc. See > point 3a in the pass header comment. */ > bool insert_powi_p; > + bool bias_loop_carried_phi_ranks_p; > }; // class pass_reassoc > > } // anon namespace >
diff --git a/gcc/passes.def b/gcc/passes.def index d7a1f8c97a6..c5f915d04c6 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -242,7 +242,7 @@ along with GCC; see the file COPYING3. If not see /* Identify paths that should never be executed in a conforming program and isolate those paths. */ NEXT_PASS (pass_isolate_erroneous_paths); - NEXT_PASS (pass_reassoc, true /* insert_powi_p */); + NEXT_PASS (pass_reassoc, true /* early_p */); NEXT_PASS (pass_dce); NEXT_PASS (pass_forwprop); NEXT_PASS (pass_phiopt, false /* early_p */); @@ -325,7 +325,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_lower_vector_ssa); NEXT_PASS (pass_lower_switch); NEXT_PASS (pass_cse_reciprocals); - NEXT_PASS (pass_reassoc, false /* insert_powi_p */); + NEXT_PASS (pass_reassoc, false /* early_p */); NEXT_PASS (pass_strength_reduction); NEXT_PASS (pass_split_paths); NEXT_PASS (pass_tracer); diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 8498cfc7aa8..420c14e8cf5 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -180,6 +180,10 @@ along with GCC; see the file COPYING3. If not see point 3a in the pass header comment. */ static bool reassoc_insert_powi_p; +/* Enable biasing ranks of loop accumulators. We don't want this before + vectorization, since it interferes with reduction chains. */ +static bool reassoc_bias_loop_carried_phi_ranks_p; + /* Statistics */ static struct { @@ -269,6 +273,9 @@ phi_rank (gimple *stmt) use_operand_p use; gimple *use_stmt; + if (!reassoc_bias_loop_carried_phi_ranks_p) + return bb_rank[bb->index]; + /* We only care about real loops (those with a latch). */ if (!father->latch) return bb_rank[bb->index]; @@ -6940,9 +6947,10 @@ fini_reassoc (void) optimization of a gimple conditional. Otherwise returns zero. */ static unsigned int -execute_reassoc (bool insert_powi_p) +execute_reassoc (bool insert_powi_p, bool bias_loop_carried_phi_ranks_p) { reassoc_insert_powi_p = insert_powi_p; + reassoc_bias_loop_carried_phi_ranks_p = bias_loop_carried_phi_ranks_p; init_reassoc (); @@ -6983,15 +6991,19 @@ public: { gcc_assert (n == 0); insert_powi_p = param; + bias_loop_carried_phi_ranks_p = !param; } virtual bool gate (function *) { return flag_tree_reassoc != 0; } virtual unsigned int execute (function *) - { return execute_reassoc (insert_powi_p); } + { + return execute_reassoc (insert_powi_p, bias_loop_carried_phi_ranks_p); + } private: /* Enable insertion of __builtin_powi calls during execute_reassoc. See point 3a in the pass header comment. */ bool insert_powi_p; + bool bias_loop_carried_phi_ranks_p; }; // class pass_reassoc } // anon namespace