This patch removes the (unused) undo_replace_buff_elem list. Verges on the obvious, but still.
Patch 3 splits the generation of moves into two: one function to record what needs to happen, and another function to actually do it. It's then easy to bail out if we decide that we don't want the moves. Richard gcc/ * modulo-sched.c (undo_replace_buff_elem): Delete. (generate_reg_moves): Don't build and return an undo list. (free_undo_replace_buff): Delete. (sms_schedule): Adjust call to generate_reg_moves. Don't call free_undo_replace_buff. Index: gcc/modulo-sched.c =================================================================== --- gcc/modulo-sched.c 2011-08-24 12:38:37.171362916 +0100 +++ gcc/modulo-sched.c 2011-08-24 12:56:17.754942951 +0100 @@ -165,17 +165,6 @@ struct partial_schedule int stage_count; /* The stage count of the partial schedule. */ }; -/* We use this to record all the register replacements we do in - the kernel so we can undo SMS if it is not profitable. */ -struct undo_replace_buff_elem -{ - rtx insn; - rtx orig_reg; - rtx new_reg; - struct undo_replace_buff_elem *next; -}; - - static partial_schedule_ptr create_partial_schedule (int ii, ddg_ptr, int history); static void free_partial_schedule (partial_schedule_ptr); @@ -456,13 +445,12 @@ print_node_sched_params (FILE *file, int nreg_moves = ----------------------------------- + 1 - { dependence. ii { 1 if not. */ -static struct undo_replace_buff_elem * +static void generate_reg_moves (partial_schedule_ptr ps, bool rescan) { ddg_ptr g = ps->g; int ii = ps->ii; int i; - struct undo_replace_buff_elem *reg_move_replaces = NULL; for (i = 0; i < g->num_nodes; i++) { @@ -543,22 +531,6 @@ generate_reg_moves (partial_schedule_ptr EXECUTE_IF_SET_IN_SBITMAP (uses_of_defs[i_reg_move], 0, i_use, sbi) { - struct undo_replace_buff_elem *rep; - - rep = (struct undo_replace_buff_elem *) - xcalloc (1, sizeof (struct undo_replace_buff_elem)); - rep->insn = g->nodes[i_use].insn; - rep->orig_reg = old_reg; - rep->new_reg = new_reg; - - if (! reg_move_replaces) - reg_move_replaces = rep; - else - { - rep->next = reg_move_replaces; - reg_move_replaces = rep; - } - replace_rtx (g->nodes[i_use].insn, old_reg, new_reg); if (rescan) df_insn_rescan (g->nodes[i_use].insn); @@ -568,21 +540,6 @@ generate_reg_moves (partial_schedule_ptr } sbitmap_vector_free (uses_of_defs); } - return reg_move_replaces; -} - -/* Free memory allocated for the undo buffer. */ -static void -free_undo_replace_buff (struct undo_replace_buff_elem *reg_move_replaces) -{ - - while (reg_move_replaces) - { - struct undo_replace_buff_elem *rep = reg_move_replaces; - - reg_move_replaces = reg_move_replaces->next; - free (rep); - } } /* Update the sched_params (time, row and stage) for node U using the II, @@ -1472,8 +1429,6 @@ sms_schedule (void) } else { - struct undo_replace_buff_elem *reg_move_replaces; - if (!opt_sc_p) { /* Rotate the partial schedule to have the branch in row ii-1. */ @@ -1523,13 +1478,11 @@ sms_schedule (void) /* The life-info is not valid any more. */ df_set_bb_dirty (g->bb); - reg_move_replaces = generate_reg_moves (ps, true); + generate_reg_moves (ps, true); if (dump_file) print_node_sched_params (dump_file, g->num_nodes, g); /* Generate prolog and epilog. */ generate_prolog_epilog (ps, loop, count_reg, count_init); - - free_undo_replace_buff (reg_move_replaces); } free_partial_schedule (ps);