On Sun, Oct 30, 2016 at 8:10 PM, Segher Boessenkool wrote: > This patch solves this problem by simply running the duplicate_computed_gotos > pass again, as long as it does any work. The patch looks much bigger than > it is, because I factored out two routines to simplify the control flow.
It's made the patch a bit difficult to read. Condensing it a bit... > + for (;;) > { > + if (n_basic_blocks_for_fn (fun) <= NUM_FIXED_BLOCKS + 1) > + return 0; This test should not be needed in the loop. This pass can never collapse the function to a single basic block. > + clear_bb_flags (); > + cfg_layout_initialize (0); See comment below... > + basic_block bb; > + FOR_EACH_BB_FN (bb, fun) > + { > + /* Build the reorder chain for the original order of blocks. */ > + if (bb->next_bb != EXIT_BLOCK_PTR_FOR_FN (fun)) > + bb->aux = bb->next_bb; > + } > > + duplicate_computed_gotos_find_candidates (fun, candidates, max_size); > > + bool changed = false; > + if (!bitmap_empty_p (candidates)) > + changed = duplicate_computed_gotos_do_duplicate (fun, candidates); > > + if (changed) > + fixup_partitions (); > + > + cfg_layout_finalize (); I don't think you have to go into/out-of cfglayout mode for each iteration. > /* Merge the duplicated blocks into predecessors, when possible. */ > + if (changed) > + cleanup_cfg (0); > + else > + break; > } Maybe a gcc_assert that the loop doesn't iterate more often than num_edges? Ciao! Steven