https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69609
--- Comment #3 from Bernd Schmidt <bernds at gcc dot gnu.org> --- Something like this maybe? Tries to determine if too large a fraction of blocks are only reachable by computed jumps in a large function (which I'm guessing is what triggers the compile time issues). diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index 8cbde89..10d106a 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -2435,13 +2435,39 @@ reorder_basic_blocks (void) { gcc_assert (current_ir_type () == IR_RTL_CFGLAYOUT); - if (n_basic_blocks_for_fn (cfun) <= NUM_FIXED_BLOCKS + 1) + int n_bbs = n_basic_blocks_for_fn (cfun); + if (n_bbs <= NUM_FIXED_BLOCKS + 1) return; set_edge_can_fallthru_flag (); mark_dfs_back_edges (); - switch (flag_reorder_blocks_algorithm) + enum reorder_blocks_algorithm alg = flag_reorder_blocks_algorithm; + /* Try to detect cases where the STC algorithm is too expensive + and likely to be ineffective. */ + if (alg == REORDER_BLOCKS_ALGORITHM_STC && n_bbs > 2000) + { + basic_block bb; + int abnormals = 0; + FOR_EACH_BB_FN (bb, cfun) + { + edge e; + edge_iterator ei; + bool all_abnormal = true; + FOR_EACH_EDGE (e, ei, bb->preds) + if (!(e->flags & EDGE_ABNORMAL)) + { + all_abnormal = false; + break; + } + if (all_abnormal) + abnormals++; + } + if ((double)abnormals * 16 / n_bbs > 3) + alg = REORDER_BLOCKS_ALGORITHM_SIMPLE; + } + + switch (alg) { case REORDER_BLOCKS_ALGORITHM_SIMPLE: reorder_basic_blocks_simple ();