aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2008-08-29 10:58:52 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2008-08-29 08:58:52 +0000
commitcc870036bd76fccec8aeb19a3f8c4fda081e5c3d (patch)
tree92d8dcba01165e9199c912b448b73d517d093087 /gcc
parent7299cb994088a68a4fec5e479a03fc8a71e50646 (diff)
downloadgcc-cc870036bd76fccec8aeb19a3f8c4fda081e5c3d.zip
gcc-cc870036bd76fccec8aeb19a3f8c4fda081e5c3d.tar.gz
gcc-cc870036bd76fccec8aeb19a3f8c4fda081e5c3d.tar.bz2
tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Check that loop is not cold.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/basic-block.h6
-rw-r--r--gcc/predict.c20
-rw-r--r--gcc/tree-ssa-loop-ch.c7
4 files changed, 40 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 431661b..a859a36 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
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.
* predict.c (strip_builtin_expect): Rename to ...
(strip_predict_hints): ... this one; strip also GIMPLE_PREDICT.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index c3cb76b..50d3e62 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -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);
diff --git a/gcc/predict.c b/gcc/predict.c
index 6107723..4de95e2 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -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
diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c
index 9a0dca7..33e85c8 100644
--- a/gcc/tree-ssa-loop-ch.c
+++ b/gcc/tree-ssa-loop-ch.c
@@ -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;