From 1eaaddca618f9d1feb14edfd5486e7e60048c9aa Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 8 Jun 2016 14:11:51 +0000 Subject: * 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@237219 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/doc/invoke.texi | 4 ++++ gcc/params.def | 7 +++++++ gcc/tree-ssa-loop-ch.c | 13 +++++++------ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 474b064ff04..359c1d7bb43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-06-07 Jan Hubicka + + * 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. + 2016-06-08 Richard Biener * tree-vect-stmts.c (vectorizable_load): Remove restrictions diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index fc66be55ba8..2e92dcb44ca 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -9066,6 +9066,10 @@ The maximum number of insns of an unswitched loop. @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 he copy loop headers +pass. + @item lim-expensive The minimum cost of an expensive expression in the loop invariant motion. diff --git a/gcc/params.def b/gcc/params.def index 62a1e404a1a..2f552eb4abf 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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 he copy loop + headers pass. */ +DEFPARAM(PARAM_MAX_LOOP_HEADER_INSNS, + "max-loop-header-insns", + "The maximum number of insns in loop header duplicated by he 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, diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c index 0ddbda6da7e..9a8136968de 100644 --- a/gcc/tree-ssa-loop-ch.c +++ b/gcc/tree-ssa-loop-ch.c @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see #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_block header, struct loop *loop, 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 initial_limit = PARAM_VALUE (PARAM_MAX_LOOP_HEADER_INSNS); + int remaining_limit = initial_limit; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Analyzing loop %i\n", loop->num); @@ -313,7 +313,7 @@ ch_base::copy_headers (function *fun) exit = NULL; n_bbs = 0; - while (should_duplicate_loop_header_p (header, loop, &limit)) + while (should_duplicate_loop_header_p (header, loop, &remaining_limit)) { /* Find a successor of header that is inside a loop; i.e. the new header after the condition is copied. */ @@ -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, + initial_limit - remaining_limit); /* Ensure that the header will have just the latch as a predecessor inside the loop. */ -- cgit v1.2.3