]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Check that loop is not cold.
authorJan Hubicka <jh@suse.cz>
Fri, 29 Aug 2008 08:58:52 +0000 (10:58 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 29 Aug 2008 08:58:52 +0000 (08:58 +0000)
* tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Check that loop
is not cold.
* predict.c (optimize_bb_for_size_p, optimize_bb_for_speed_p):
Constify arguments.
(optimize_loop_for_size_p, optimize_loop_for_speed_p): New functions.
* basic-block.h (optimize_bb_for_size_p, optimize_bb_for_speed_p):
Constify.
(optimize_loop_for_size_p, optimize_loop_for_speed_p): Declare.

From-SVN: r139756

gcc/ChangeLog
gcc/basic-block.h
gcc/predict.c
gcc/tree-ssa-loop-ch.c

index 431661be58a99dfc0b31d5236f5eb3d8a597cc49..a859a36687411843ed119f25944157575f0cfbe2 100644 (file)
@@ -1,3 +1,14 @@
+2008-08-29  Jan Hubicka  <jh@suse.cz>
+
+       * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Check that loop
+       is not cold.
+       * predict.c (optimize_bb_for_size_p, optimize_bb_for_speed_p):
+       Constify arguments.
+       (optimize_loop_for_size_p, optimize_loop_for_speed_p): New functions.
+       * basic-block.h (optimize_bb_for_size_p, optimize_bb_for_speed_p):
+       Constify.
+       (optimize_loop_for_size_p, optimize_loop_for_speed_p): Declare.
+
 2008-08-29  Jan Hubicka  <jh@suse.cz>
 
        * tree-pass.h (pass_strip_predict_hints): Declare.
index c3cb76bd79bf286f6b32d755f2bf120f8b46cd50..50d3e628aeaac0b9352147ea4b2c0d75bbb5ea2c 100644 (file)
@@ -831,14 +831,16 @@ extern bool maybe_hot_bb_p (const_basic_block);
 extern bool maybe_hot_edge_p (edge);
 extern bool probably_cold_bb_p (const_basic_block);
 extern bool probably_never_executed_bb_p (const_basic_block);
-extern bool optimize_bb_for_size_p (basic_block);
-extern bool optimize_bb_for_speed_p (basic_block);
+extern bool optimize_bb_for_size_p (const_basic_block);
+extern bool optimize_bb_for_speed_p (const_basic_block);
 extern bool optimize_edge_for_size_p (edge);
 extern bool optimize_edge_for_speed_p (edge);
 extern bool optimize_insn_for_size_p (void);
 extern bool optimize_insn_for_speed_p (void);
 extern bool optimize_function_for_size_p (struct function *);
 extern bool optimize_function_for_speed_p (struct function *);
+extern bool optimize_loop_for_size_p (struct loop *);
+extern bool optimize_loop_for_speed_p (struct loop *);
 extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
 extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
 extern void gimple_predict_edge (edge, enum br_predictor, int);
index 610772314b33f0c77fb3fd92c1c0c07a6c08837d..4de95e2f66fae44406665f9ab5d6506bbb7c53f5 100644 (file)
@@ -200,7 +200,7 @@ optimize_function_for_speed_p (struct function *fun)
 /* Return TRUE when BB should be optimized for size.  */
 
 bool
-optimize_bb_for_size_p (basic_block bb)
+optimize_bb_for_size_p (const_basic_block bb)
 {
   return optimize_function_for_size_p (cfun) || !maybe_hot_bb_p (bb);
 }
@@ -208,7 +208,7 @@ optimize_bb_for_size_p (basic_block bb)
 /* Return TRUE when BB should be optimized for speed.  */
 
 bool
-optimize_bb_for_speed_p (basic_block bb)
+optimize_bb_for_speed_p (const_basic_block bb)
 {
   return !optimize_bb_for_size_p (bb);
 }
@@ -245,6 +245,22 @@ optimize_insn_for_speed_p (void)
   return !optimize_insn_for_size_p ();
 }
 
+/* Return TRUE when LOOP should be optimized for size.  */
+
+bool
+optimize_loop_for_size_p (struct loop *loop)
+{
+  return optimize_bb_for_size_p (loop->header);
+}
+
+/* Return TRUE when LOOP should be optimized for speed.  */
+
+bool
+optimize_loop_for_speed_p (struct loop *loop)
+{
+  return optimize_bb_for_speed_p (loop->header);
+}
+
 /* Set RTL expansion for BB profile.  */
 
 void
index 9a0dca7265e172de2d7b83840c9f368b1afa0f20..33e85c839dcc5fa7ad0c548f024d207a701d44b9 100644 (file)
@@ -58,6 +58,13 @@ should_duplicate_loop_header_p (basic_block header, struct loop *loop,
   if (header->aux)
     return false;
 
+  /* Loop header copying usually increases size of the code.  This used not to
+     be true, since quite often it is possible to verify that the condition is
+     satisfied in the first iteration and therefore to eliminate it.  Jump
+     threading handles these cases now.  */
+  if (optimize_loop_for_size_p (loop))
+    return false;
+
   gcc_assert (EDGE_COUNT (header->succs) > 0);
   if (single_succ_p (header))
     return false;