/* Mark register REGNO in MODE as dead at program point POINT. Update BB_GEN_PSEUDOS and BB_KILLED_PSEUDOS. Return TRUE if the liveness tracking sets were modified, or FALSE if nothing changed. */ static bool mark_regno_dead (int regno, machine_mode mode, int point) { int last; bool changed = false; if (regno < FIRST_PSEUDO_REGISTER) { for (last = regno + hard_regno_nregs[regno][mode]; regno < last; regno++) make_hard_regno_dead (regno); } else { if (sparseset_bit_p (pseudos_live, regno)) { mark_pseudo_dead (regno, point); changed = true; } bitmap_clear_bit (bb_gen_pseudos, regno); bitmap_set_bit (bb_killed_pseudos, regno); } return changed; }
void sparseset_clear_bit (sparseset s, SPARSESET_ELT_TYPE e) { if (sparseset_bit_p (s, e)) { SPARSESET_ELT_TYPE idx = s->sparse[e]; SPARSESET_ELT_TYPE iter = s->iter; SPARSESET_ELT_TYPE mem = s->members - 1; /* If we are iterating over this set and we want to delete a member we've already visited, then we swap the element we want to delete with the element at the current iteration index so that it plays well together with the code below that actually removes the element. */ if (s->iterating && idx <= iter) { if (idx < iter) { sparseset_swap (s, idx, iter); idx = iter; } s->iter_inc = 0; } /* Replace the element we want to delete with the last element in the dense array and then decrement s->members, effectively removing the element we want to delete. */ sparseset_insert_bit (s, s->dense[mem], idx); s->members = mem; } }
/* 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; } }
/* 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); }
void sparseset_and (sparseset d, sparseset a, sparseset b) { SPARSESET_ELT_TYPE e; if (a == b) { if (d != a) sparseset_copy (d, a); return; } if (d == a || d == b) { sparseset s = (d == a) ? b : a; EXECUTE_IF_SET_IN_SPARSESET (d, e) if (!sparseset_bit_p (s, e)) sparseset_clear_bit (d, e); }