summaryrefslogtreecommitdiff
path: root/gcc/bb-reorder.c
diff options
context:
space:
mode:
authorJosef Zlomek <zlomekj@suse.cz>2003-12-20 17:31:12 +0100
committerJosef Zlomek <zlomek@gcc.gnu.org>2003-12-20 16:31:12 +0000
commit6ae533cf8947fe7f6e536adf5431b13e28f844f3 (patch)
tree8002125c0b41568a066ba1a96222954da65a4ad6 /gcc/bb-reorder.c
parent5d7f899bb3fa4b02a499818563714df1d9c16721 (diff)
downloadgcc-6ae533cf8947fe7f6e536adf5431b13e28f844f3.tar.gz
PR optimization/13430, PR optimization/12322
PR optimization/13430, PR optimization/12322 * bb-reorder.c (copy_bb_p): Do not allow block with many successors to be copied. (find_traces_1_round): Surround check for fake edges by #ifdef ENABLE_CHECKING #endif. From-SVN: r74887
Diffstat (limited to 'gcc/bb-reorder.c')
-rw-r--r--gcc/bb-reorder.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 85e184dd719..fc50b6494d3 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -415,8 +415,10 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
/* Select the successor that will be placed after BB. */
for (e = bb->succ; e; e = e->succ_next)
{
+#ifdef ENABLE_CHECKING
if (e->flags & EDGE_FAKE)
abort ();
+#endif
if (e->dest == EXIT_BLOCK_PTR)
continue;
@@ -1001,6 +1003,8 @@ copy_bb_p (basic_block bb, int code_may_grow)
int size = 0;
int max_size = uncond_jump_length;
rtx insn;
+ int n_succ;
+ edge e;
if (!bb->frequency)
return false;
@@ -1009,6 +1013,15 @@ copy_bb_p (basic_block bb, int code_may_grow)
if (!cfg_layout_can_duplicate_bb_p (bb))
return false;
+ /* Avoid duplicating blocks which have many successors (PR/13430). */
+ n_succ = 0;
+ for (e = bb->succ; e; e = e->succ_next)
+ {
+ n_succ++;
+ if (n_succ > 8)
+ return false;
+ }
+
if (code_may_grow && maybe_hot_bb_p (bb))
max_size *= 8;