This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR81090, properly free niter estimates


On Mon, 19 Jun 2017, Christophe Lyon wrote:

> Hi Richard,
> 
> On 16 June 2017 at 14:18, Richard Biener <rguenther@suse.de> wrote:
> > On Wed, 14 Jun 2017, Richard Biener wrote:
> >
> >>
> >> niter estimates are not kept up-to-date (they reference gimple stmts
> >> and trees) in the keep-loop-stuff infrastructure so similar to the
> >> SCEV cache we rely on people freeing it after passes.
> >>
> >> The following brings us a step closer to that by freeing them whenever
> >> SCEV is invalidated (we only compute them when SCEV is active) plus
> >> removing the odd record-bounds pass that just computes them, leaving
> >> scavenging to following passes.
> >>
> >> Bootstrap and regtest running on x86_64-unknown-linux-gnu.
> >
> > Some awkward interactions with peeling means I'm installing the
> > following less aggressive variant.
> >
> > Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
> >
> > Richard.
> >
> > 2017-06-16  Richard Biener  <rguenther@suse.de>
> >
> >         PR tree-optimization/81090
> >         * passes.def (pass_record_bounds): Remove.
> >         * tree-pass.h (make_pass_record_bounds): Likewise.
> >         * tree-ssa-loop.c (pass_data_record_bounds, pass_record_bounds,
> >         make_pass_record_bounds): Likewise.
> >         * tree-ssa-loop-ivcanon.c (canonicalize_induction_variables): Do
> >         not free niter estimates at the beginning but at the end.
> >         * tree-scalar-evolution.c (scev_finalize): Free niter estimates.
> >
> >         * gcc.dg/graphite/pr81090.c: New testcase.
> >
> 
> Sorry to bother you again...
> With this commit (r249249), I've noticed regressions on aarch64/arm:
> FAIL:    gcc.dg/vect/pr65947-9.c -flto -ffat-lto-objects
> scan-tree-dump-not vect "LOOP VECTORIZED"
> FAIL:    gcc.dg/vect/pr65947-9.c scan-tree-dump-not vect "LOOP VECTORIZED"

So the testcase gets vectorized now (for whatever reason) and still passes
execution.  Not sure why the testcase checked for not being vectorized.

Alan?

Richard.

> Christophe
> 
> > Index: gcc/passes.def
> > ===================================================================
> > --- gcc/passes.def      (revision 249246)
> > +++ gcc/passes.def      (working copy)
> > @@ -276,7 +276,6 @@ along with GCC; see the file COPYING3.
> >           /* All unswitching, final value replacement and splitting can expose
> >              empty loops.  Remove them now.  */
> >           NEXT_PASS (pass_cd_dce);
> > -         NEXT_PASS (pass_record_bounds);
> >           NEXT_PASS (pass_iv_canon);
> >           NEXT_PASS (pass_loop_distribution);
> >           NEXT_PASS (pass_copy_prop);
> > Index: gcc/testsuite/gcc.dg/graphite/pr81090.c
> > ===================================================================
> > --- gcc/testsuite/gcc.dg/graphite/pr81090.c     (nonexistent)
> > +++ gcc/testsuite/gcc.dg/graphite/pr81090.c     (working copy)
> > @@ -0,0 +1,27 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -floop-nest-optimize" } */
> > +
> > +int x3, za;
> > +int hg[1];
> > +
> > +void
> > +yw (int dq)
> > +{
> > +  const int r7 = 2;
> > +
> > +  while (dq < 1)
> > +    {
> > +      for (x3 = 0; x3 < r7; ++x3)
> > +       for (za = 0; za < r7; ++za)
> > +         hg[1] = 0;
> > +      ++dq;
> > +    }
> > +
> > +  x3 = 0;
> > +  while (x3 < r7)
> > +    {
> > +      ++x3;
> > +      if (x3 == 0)
> > +       break;
> > +    }
> > +}
> > Index: gcc/tree-pass.h
> > ===================================================================
> > --- gcc/tree-pass.h     (revision 249246)
> > +++ gcc/tree-pass.h     (working copy)
> > @@ -373,7 +373,6 @@ extern gimple_opt_pass *make_pass_predco
> >  extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
> >  extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
> >  extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
> > -extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt);
> >  extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
> >  extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
> >  extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
> > Index: gcc/tree-scalar-evolution.c
> > ===================================================================
> > --- gcc/tree-scalar-evolution.c (revision 249246)
> > +++ gcc/tree-scalar-evolution.c (working copy)
> > @@ -3636,6 +3636,7 @@ scev_finalize (void)
> >      return;
> >    scalar_evolution_info->empty ();
> >    scalar_evolution_info = NULL;
> > +  free_numbers_of_iterations_estimates (cfun);
> >  }
> >
> >  /* Returns true if the expression EXPR is considered to be too expensive
> > Index: gcc/tree-ssa-loop-ivcanon.c
> > ===================================================================
> > --- gcc/tree-ssa-loop-ivcanon.c (revision 249246)
> > +++ gcc/tree-ssa-loop-ivcanon.c (working copy)
> > @@ -1212,7 +1212,6 @@ canonicalize_induction_variables (void)
> >    bool irred_invalidated = false;
> >    bitmap loop_closed_ssa_invalidated = BITMAP_ALLOC (NULL);
> >
> > -  free_numbers_of_iterations_estimates (cfun);
> >    estimate_numbers_of_iterations ();
> >
> >    FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
> > @@ -1230,6 +1229,7 @@ canonicalize_induction_variables (void)
> >
> >    /* Clean up the information about numbers of iterations, since brute force
> >       evaluation could reveal new information.  */
> > +  free_numbers_of_iterations_estimates (cfun);
> >    scev_reset ();
> >
> >    if (!bitmap_empty_p (loop_closed_ssa_invalidated))
> > Index: gcc/tree-ssa-loop.c
> > ===================================================================
> > --- gcc/tree-ssa-loop.c (revision 249246)
> > +++ gcc/tree-ssa-loop.c (working copy)
> > @@ -459,54 +459,6 @@ make_pass_scev_cprop (gcc::context *ctxt
> >    return new pass_scev_cprop (ctxt);
> >  }
> >
> > -/* Record bounds on numbers of iterations of loops.  */
> > -
> > -namespace {
> > -
> > -const pass_data pass_data_record_bounds =
> > -{
> > -  GIMPLE_PASS, /* type */
> > -  "*record_bounds", /* name */
> > -  OPTGROUP_NONE, /* optinfo_flags */
> > -  TV_TREE_LOOP_BOUNDS, /* tv_id */
> > -  ( PROP_cfg | PROP_ssa ), /* properties_required */
> > -  0, /* properties_provided */
> > -  0, /* properties_destroyed */
> > -  0, /* todo_flags_start */
> > -  0, /* todo_flags_finish */
> > -};
> > -
> > -class pass_record_bounds : public gimple_opt_pass
> > -{
> > -public:
> > -  pass_record_bounds (gcc::context *ctxt)
> > -    : gimple_opt_pass (pass_data_record_bounds, ctxt)
> > -  {}
> > -
> > -  /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > -
> > -}; // class pass_record_bounds
> > -
> > -unsigned int
> > -pass_record_bounds::execute (function *fun)
> > -{
> > -  if (number_of_loops (fun) <= 1)
> > -    return 0;
> > -
> > -  estimate_numbers_of_iterations ();
> > -  scev_reset ();
> > -  return 0;
> > -}
> > -
> > -} // anon namespace
> > -
> > -gimple_opt_pass *
> > -make_pass_record_bounds (gcc::context *ctxt)
> > -{
> > -  return new pass_record_bounds (ctxt);
> > -}
> > -
> >  /* Induction variable optimizations.  */
> >
> >  namespace {
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]