/* Mark pseudo REGNO as living at program point POINT, update conflicting hard registers of the pseudo and START_LIVING, and start a new live range for the pseudo corresponding to REGNO if it is necessary. */ static void mark_pseudo_live (int regno, int point) { lra_live_range_t p; lra_assert (regno >= FIRST_PSEUDO_REGISTER); lra_assert (! sparseset_bit_p (pseudos_live, regno)); sparseset_set_bit (pseudos_live, regno); IOR_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs, hard_regs_live); if ((complete_info_p || lra_get_regno_hard_regno (regno) < 0) && ((p = lra_reg_info[regno].live_ranges) == NULL || (p->finish != point && p->finish + 1 != point))) lra_reg_info[regno].live_ranges = create_live_range (regno, point, -1, p); sparseset_set_bit (start_living, regno); }
/* Process the death of hard register REGNO. This updates hard_regs_live and START_DYING. */ static void make_hard_regno_dead (int regno) { lra_assert (regno < FIRST_PSEUDO_REGISTER); if (! TEST_HARD_REG_BIT (hard_regs_live, regno)) return; sparseset_set_bit (start_dying, regno); CLEAR_HARD_REG_BIT (hard_regs_live, regno); }
/* The function processing birth of hard register REGNO. It updates living hard regs, conflict hard regs for living pseudos, and START_LIVING. */ static void make_hard_regno_born (int regno) { unsigned int i; lra_assert (regno < FIRST_PSEUDO_REGISTER); if (TEST_HARD_REG_BIT (hard_regs_live, regno)) return; SET_HARD_REG_BIT (hard_regs_live, regno); sparseset_set_bit (start_living, regno); EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i) SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno); }
/* Mark pseudo REGNO as not living at program point POINT and update START_DYING. This finishes the current live range for the pseudo corresponding to REGNO. */ static void mark_pseudo_dead (int regno, int point) { lra_live_range_t p; lra_assert (regno >= FIRST_PSEUDO_REGISTER); lra_assert (sparseset_bit_p (pseudos_live, regno)); sparseset_clear_bit (pseudos_live, regno); sparseset_set_bit (start_dying, regno); if (complete_info_p || lra_get_regno_hard_regno (regno) < 0) { p = lra_reg_info[regno].live_ranges; lra_assert (p != NULL); p->finish = point; } }
/* The function processing birth of hard register REGNO. It updates living hard regs, START_LIVING, and conflict hard regs for living pseudos. Conflict hard regs for the pic pseudo is not updated if REGNO is REAL_PIC_OFFSET_TABLE_REGNUM and CHECK_PIC_PSEUDO_P is true. */ static void make_hard_regno_born (int regno, bool check_pic_pseudo_p ATTRIBUTE_UNUSED) { unsigned int i; lra_assert (regno < FIRST_PSEUDO_REGISTER); if (TEST_HARD_REG_BIT (hard_regs_live, regno)) return; SET_HARD_REG_BIT (hard_regs_live, regno); sparseset_set_bit (start_living, regno); EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i) #ifdef REAL_PIC_OFFSET_TABLE_REGNUM if (! check_pic_pseudo_p || regno != REAL_PIC_OFFSET_TABLE_REGNUM || pic_offset_table_rtx == NULL || i != REGNO (pic_offset_table_rtx)) #endif SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno); }