http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48156
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-03-18 14:14:15 UTC --- Another option is: --- gcc/combine-stack-adj.c 2010-12-02 11:51:32.000000000 +0100 +++ gcc/combine-stack-adj.c 2011-03-18 15:12:09.497674812 +0100 @@ -551,7 +551,16 @@ gate_handle_stack_adjustments (void) static unsigned int rest_of_handle_stack_adjustments (void) { - cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0); + if (flag_crossjumping && optimize <= 1) + { + df_live_add_problem (); + df_live_set_all_dirty (); + df_analyze (); + cleanup_cfg (CLEANUP_CROSSJUMP); + df_remove_problem (df_live); + } + else + cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0); /* This is kind of a heuristic. We need to run combine_stack_adjustments even for machines with possibly nonzero TARGET_RETURN_POPS_ARGS ifcvt.c already does something similar, so the df_get_bb_dirty calls it does always return whether the bb is dirty in df_live.