On Wed, 8 Jun 2016, Jan Hubicka wrote: > Hi, > I think 20 insns to copy for loop header is way too much. The constant came > from jump.c that was operating with quite different IL and compiler. > This patch adds --param for it so we can fine tune it for new millenia. > > Bootstrapped/regtested x86_64-linux, OK?
Ok. Thanks Richard. > Honza > > * invoke.texi (max-loop-headers-insns): Document. > * params.def (PARAM_MAX_LOOP_HEADER_INSNS): New. > * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Update comment. > (ch_base::copy_headers): Use PARAM_MAX_LOOP_HEADER_INSNS. > > Index: doc/invoke.texi > =================================================================== > --- doc/invoke.texi (revision 237184) > +++ doc/invoke.texi (working copy) > @@ -9066,6 +9066,9 @@ The maximum number of insns of an unswit > @item max-unswitch-level > The maximum number of branches unswitched in a single loop. > > +@item max-loop-headers-insns > +The maximum number of insns in loop header duplicated by copy loop headers > pass. > + > @item lim-expensive > The minimum cost of an expensive expression in the loop invariant motion. > > Index: params.def > =================================================================== > --- params.def (revision 237184) > +++ params.def (working copy) > @@ -344,6 +344,13 @@ DEFPARAM(PARAM_MAX_UNSWITCH_LEVEL, > "The maximum number of unswitchings in a single loop.", > 3, 0, 0) > > +/* The maximum number of insns in loop header duplicated by copy loop headers > + pass. */ > +DEFPARAM(PARAM_MAX_LOOP_HEADER_INSNS, > + "max-loop-header-insns", > + "The maximum number of insns in loop header duplicated by copy loop > headers pass.", > + 20, 0, 0) > + > /* The maximum number of iterations of a loop the brute force algorithm > for analysis of # of iterations of the loop tries to evaluate. */ > DEFPARAM(PARAM_MAX_ITERATIONS_TO_TRACK, > Index: tree-ssa-loop-ch.c > =================================================================== > --- tree-ssa-loop-ch.c (revision 237184) > +++ tree-ssa-loop-ch.c (working copy) > @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. > #include "tree-inline.h" > #include "tree-ssa-scopedtables.h" > #include "tree-ssa-threadedge.h" > +#include "params.h" > > /* Duplicates headers of loops if they are small enough, so that the > statements > in the loop body are always executed when the loop is entered. This > @@ -106,8 +107,7 @@ should_duplicate_loop_header_p (basic_bl > return false; > } > > - /* Approximately copy the conditions that used to be used in jump.c -- > - at most 20 insns and no calls. */ > + /* Count number of instructions and punt on calls. */ > for (bsi = gsi_start_bb (header); !gsi_end_p (bsi); gsi_next (&bsi)) > { > last = gsi_stmt (bsi); > @@ -290,8 +290,8 @@ ch_base::copy_headers (function *fun) > > FOR_EACH_LOOP (loop, 0) > { > - /* Copy at most 20 insns. */ > - int limit = 20; > + int ninsns = PARAM_VALUE (PARAM_MAX_LOOP_HEADER_INSNS); > + int limit = ninsns; > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, > "Analyzing loop %i\n", loop->num); > @@ -333,7 +333,8 @@ ch_base::copy_headers (function *fun) > fprintf (dump_file, > "Duplicating header of the loop %d up to edge %d->%d," > " %i insns.\n", > - loop->num, exit->src->index, exit->dest->index, 20 - limit); > + loop->num, exit->src->index, exit->dest->index, > + ninsns - limit); > > /* Ensure that the header will have just the latch as a predecessor > inside the loop. */ > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)