On Sun, Oct 7, 2012 at 5:59 PM, Vladimir Makarov wrote: > * lra-lives.c (lra_start_point_ranges, lra_finish_point_ranges): > Remove. > (process_bb_lives): Change start regno in > EXECUTE_IF_SET_IN_BITMAP. Iterate on DF_LR_IN (bb) instead of > pseudos_live_through_calls.
This can be done a bit better still by checking whether the pseudos_live_through_calls set is empty: * lra-lives.c (process_bb_lives): At the top of a basic block, break from the loop over pseudos_live_through_calls if the set is empty. --- lra-lives.c.orig 2012-10-08 12:24:10.000000000 +0200 +++ lra-lives.c 2012-10-08 12:26:07.000000000 +0200 @@ -751,8 +751,12 @@ process_bb_lives (basic_block bb) mark_pseudo_dead (i); EXECUTE_IF_SET_IN_BITMAP (DF_LR_IN (bb), FIRST_PSEUDO_REGISTER, j, bi) - if (sparseset_bit_p (pseudos_live_through_calls, j)) - check_pseudos_live_through_calls (j); + { + if (sparseset_cardinality (pseudos_live_through_calls) == 0) + break; + if (sparseset_bit_p (pseudos_live_through_calls, j)) + check_pseudos_live_through_calls (j); + } incr_curr_point (freq); } This test is extremely cheap (the load for the cardinality test re-used by sparseset_bit_p) and it cuts down the time spent in live range chains even further (especially e.g. for blocks that don't contain calls). OK for the branch if it passes bootstrap+testing on x86_64-unknown-linux-gnu? Ciao! Steven