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]

Introduce param for copy loop headers pass


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?

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.  */


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