/* A subroutine of btr_referenced_p, called through for_each_rtx. PREG is a pointer to an rtx that is to be excluded from the traversal. If we find a reference to a target register anywhere else, return 1, and put a pointer to it into btr_reference_found. */ static int find_btr_reference (rtx *px, void *preg) { rtx x; if (px == preg) return -1; x = *px; if (!REG_P (x)) return 0; if (overlaps_hard_reg_set_p (all_btrs, GET_MODE (x), REGNO (x))) { btr_reference_found = px; return 1; } return -1; }
/* If the rtx at *XP references (sets or reads) any branch target register, return one such register. If EXCLUDEP is set, disregard any references within that location. */ static rtx * find_btr_use (rtx *xp, rtx *excludep = 0) { subrtx_ptr_iterator::array_type array; FOR_EACH_SUBRTX_PTR (iter, array, xp, NONCONST) { rtx *loc = *iter; if (loc == excludep) iter.skip_subrtxes (); else { const_rtx x = *loc; if (REG_P (x) && overlaps_hard_reg_set_p (all_btrs, GET_MODE (x), REGNO (x))) return loc; } }
/* Spill pseudos which are assigned to hard registers in SET. Add affected insns for processing in the subsequent constraint pass. */ static void spill_pseudos (HARD_REG_SET set) { int i; bitmap_head to_process; rtx_insn *insn; if (hard_reg_set_empty_p (set)) return; if (lra_dump_file != NULL) { fprintf (lra_dump_file, " Spilling non-eliminable hard regs:"); for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (TEST_HARD_REG_BIT (set, i)) fprintf (lra_dump_file, " %d", i); fprintf (lra_dump_file, "\n"); } bitmap_initialize (&to_process, ®_obstack); for (i = FIRST_PSEUDO_REGISTER; i < max_reg_num (); i++) if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0 && overlaps_hard_reg_set_p (set, PSEUDO_REGNO_MODE (i), reg_renumber[i])) { if (lra_dump_file != NULL) fprintf (lra_dump_file, " Spilling r%d(%d)\n", i, reg_renumber[i]); reg_renumber[i] = -1; bitmap_ior_into (&to_process, &lra_reg_info[i].insn_bitmap); } IOR_HARD_REG_SET (lra_no_alloc_regs, set); for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn)) if (bitmap_bit_p (&to_process, INSN_UID (insn))) { lra_push_insn (insn); lra_set_used_insn_alternative (insn, -1); } bitmap_clear (&to_process); }