static void abstract_best_seq (void) { pattern_seq bestpseq; /* Do the abstraction. */ determine_seq_blocks (); split_blocks_after_seqs (); split_pattern_seq (); erase_matching_seqs (); free_seq_blocks (); /* Record the usage of the link register. */ df_set_regs_ever_live (REGNO (pattern_seqs->link_reg), true); /* Remove the best pattern sequence. */ bestpseq = pattern_seqs; pattern_seqs = bestpseq->next_pattern_seq; free_pattern_seq (bestpseq); }
static bool rename_single_chain (du_head_p head, HARD_REG_SET *unavailable) { int best_new_reg; int n_uses = 0; struct du_chain *tmp; int reg = head->regno; enum reg_class super_class = NO_REGS; if (head->cannot_rename) return false; if (fixed_regs[reg] || global_regs[reg] || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)) return false; /* Iterate over elements in the chain in order to: 1. Count number of uses, and narrow the set of registers we can use for renaming. 2. Compute the superunion of register classes in this chain. */ for (tmp = head->first; tmp; tmp = tmp->next_use) { if (DEBUG_INSN_P (tmp->insn)) continue; n_uses++; IOR_COMPL_HARD_REG_SET (*unavailable, reg_class_contents[tmp->cl]); super_class = reg_class_superunion[(int) super_class][(int) tmp->cl]; } if (n_uses < 1) return false; best_new_reg = find_rename_reg (head, super_class, unavailable, reg, false); if (dump_file) { fprintf (dump_file, "Register %s in insn %d", reg_names[reg], INSN_UID (head->first->insn)); if (head->need_caller_save_reg) fprintf (dump_file, " crosses a call"); } if (best_new_reg == reg) { if (dump_file) fprintf (dump_file, "; no available better choice\n"); return false; } if (regrename_do_replace (head, best_new_reg)) { if (dump_file) fprintf (dump_file, ", renamed as %s\n", reg_names[best_new_reg]); df_set_regs_ever_live (best_new_reg, true); } else { if (dump_file) fprintf (dump_file, ", renaming as %s failed\n", reg_names[best_new_reg]); return false; } return true; }