aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2016-06-08 14:11:51 +0000
committerJan Hubicka <hubicka@ucw.cz>2016-06-08 14:11:51 +0000
commit1eaaddca618f9d1feb14edfd5486e7e60048c9aa (patch)
tree91aebe6452474922006a1d37af8afb3dfbac16d0
parent5d454d76186cdfa76f45f40c1539d79fd57e8e1c (diff)
* 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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/doc/invoke.texi4
-rw-r--r--gcc/params.def7
-rw-r--r--gcc/tree-ssa-loop-ch.c13
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 <hubicka@ucw.cz>
+
+ * 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 <rguenther@suse.de>
* 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. */