Lines Matching defs:interval
50 struct ir3_reg_interval interval;
71 * insert the reload code for them last. Keep track of whether this interval
76 /* Keep track of whether this interval currently can't be spilled because:
163 /* We don't create an interval, etc. for the base reg, so just lower the
332 ra_spill_interval_init(struct ra_spill_interval *interval,
335 ir3_reg_interval_init(&interval->interval, reg);
336 interval->dst.flags = reg->flags;
337 interval->dst.def = reg;
338 interval->already_spilled = false;
339 interval->needs_reload = false;
340 interval->cant_spill = false;
344 ir3_reg_interval_to_interval(struct ir3_reg_interval *interval)
346 return rb_node_data(struct ra_spill_interval, interval, interval);
350 ra_spill_interval_root(struct ra_spill_interval *interval)
352 struct ir3_reg_interval *ir3_interval = &interval->interval;
387 struct ra_spill_interval *interval = ir3_reg_interval_to_interval(_interval);
390 unsigned size = reg_size(interval->interval.reg);
391 if (interval->interval.reg->flags & IR3_REG_SHARED) {
394 if (interval->interval.reg->flags & IR3_REG_HALF) {
397 rb_tree_insert(&ctx->half_live_intervals, &interval->half_node,
401 if (ctx->merged_regs || !(interval->interval.reg->flags & IR3_REG_HALF)) {
404 rb_tree_insert(&ctx->full_live_intervals, &interval->node,
414 struct ra_spill_interval *interval = ir3_reg_interval_to_interval(_interval);
417 unsigned size = reg_size(interval->interval.reg);
418 if (interval->interval.reg->flags & IR3_REG_SHARED) {
421 if (interval->interval.reg->flags & IR3_REG_HALF) {
424 rb_tree_remove(&ctx->half_live_intervals, &interval->half_node);
427 if (ctx->merged_regs || !(interval->interval.reg->flags & IR3_REG_HALF)) {
430 rb_tree_remove(&ctx->full_live_intervals, &interval->node);
468 struct ra_spill_interval *interval)
470 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval);
475 struct ra_spill_interval *interval)
477 ir3_reg_interval_remove(&ctx->reg_ctx, &interval->interval);
483 struct ra_spill_interval *interval = ctx->intervals[dst->name];
484 ra_spill_interval_init(interval, dst);
486 interval->next_use_distance = dst->next_use;
492 struct ra_spill_interval *interval = ctx->intervals[dst->name];
493 if (interval->interval.inserted)
496 ra_spill_ctx_insert(ctx, interval);
497 interval->cant_spill = true;
509 if (interval->interval.reg->flags & IR3_REG_SHARED)
511 else if (interval->interval.reg->flags & IR3_REG_HALF)
521 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
523 if (!interval->interval.inserted) {
524 ra_spill_ctx_insert(ctx, interval);
525 interval->needs_reload = true;
526 interval->already_spilled = true;
529 ra_spill_interval_root(interval)->cant_spill = true;
537 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
539 if (!interval->interval.inserted || interval->interval.parent ||
540 !rb_tree_is_empty(&interval->interval.children))
543 ra_spill_ctx_remove(ctx, interval);
550 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
552 if (!interval->interval.inserted)
555 ra_spill_ctx_remove(ctx, interval);
561 struct ra_spill_interval *interval = ctx->intervals[dst->name];
562 interval->cant_spill = false;
568 struct ra_spill_interval *interval = ctx->intervals[dst->name];
570 if (!interval->interval.inserted)
573 ra_spill_ctx_remove(ctx, interval);
579 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
581 assert(interval->interval.inserted);
583 interval->next_use_distance = src->next_use;
588 if (!interval->interval.parent && !(src->flags & IR3_REG_SHARED)) {
590 rb_tree_remove(&ctx->half_live_intervals, &interval->half_node);
591 rb_tree_insert(&ctx->half_live_intervals, &interval->half_node,
595 rb_tree_remove(&ctx->full_live_intervals, &interval->node);
596 rb_tree_insert(&ctx->full_live_intervals, &interval->node,
699 spill_interval(struct ra_spill_ctx *ctx, struct ra_spill_interval *interval,
702 spill(ctx, &interval->dst, get_spill_slot(ctx, interval->interval.reg),
713 rb_tree_foreach_safe (struct ra_spill_interval, interval,
715 d("trying ssa_%u:%u", interval->interval.reg->instr->serialno,
716 interval->interval.reg->name);
717 if (!interval->cant_spill) {
718 if (!interval->already_spilled)
719 spill_interval(ctx, interval, instr, instr->block);
720 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval);
732 rb_tree_foreach_safe (struct ra_spill_interval, interval,
734 d("trying ssa_%u:%u", interval->interval.reg->instr->serialno,
735 interval->interval.reg->name);
736 if (!interval->cant_spill) {
737 if (!interval->already_spilled)
738 spill_interval(ctx, interval, instr, instr->block);
739 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval);
752 * values already reloaded, either because it's the child of some other interval
863 struct ra_spill_interval *interval,
868 interval->dst.flags = def->flags;
869 interval->dst.def = def;
870 interval->needs_reload = false;
873 &interval->interval.children, interval.node) {
874 struct ir3_register *child_reg = child->interval.reg;
877 interval->interval.reg->interval_start) / reg_elem_size(def),
888 struct ra_spill_interval *interval = ctx->intervals[def->name];
890 struct ir3_reg_interval *ir3_parent = interval->interval.parent;
896 interval->dst.flags = def->flags;
897 interval->dst.def = extract(
906 rewrite_src_interval(ctx, interval, dst, instr, block);
913 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
915 if (interval->needs_reload) {
919 ra_spill_interval_root(interval)->cant_spill = false;
926 struct ra_spill_interval *interval = ctx->intervals[src->def->name];
928 set_src_val(src, &interval->dst);
998 * interval to remove before the source itself is changed.
1040 struct ra_spill_interval *interval = rzalloc(ctx, struct ra_spill_interval);
1041 ra_spill_interval_init(interval, reg);
1042 ctx->intervals[name] = interval;
1044 return interval;
1123 if (src_interval->interval.inserted) {
1136 struct ir3_register *temp = temp_interval->interval.reg;
1224 struct ra_spill_interval *interval = ctx->intervals[def->name];
1225 ra_spill_interval_init(interval, def);
1227 interval->next_use_distance =
1231 ra_spill_ctx_insert(ctx, interval);
1338 rb_tree_foreach_safe (struct ra_spill_interval, interval,
1341 is_live_in_all_preds(ctx, interval->interval.reg, block))
1343 spill_live_in(ctx, interval->interval.reg, block);
1344 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval);
1351 rb_tree_foreach_safe (struct ra_spill_interval, interval,
1354 is_live_in_all_preds(ctx, interval->interval.reg, block))
1356 spill_live_in(ctx, interval->interval.reg, block);
1357 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval);
1366 struct ra_spill_interval *interval,
1372 struct ir3_register *def = interval->interval.reg;
1381 &interval->interval.children, interval.node) {
1385 (child->interval.reg->interval_start - def->interval_start) /
1386 reg_elem_size(def), reg_elems(child->interval.reg),
1399 struct ra_spill_interval *interval = ctx->intervals[def->name];
1416 live_in_rewrite(ctx, interval, new_val, block, i);
1423 rb_tree_foreach (struct ra_spill_interval, interval, &ctx->reg_ctx.intervals,
1424 interval.node) {
1425 reload_live_in(ctx, interval->interval.reg, block);
1433 struct ra_spill_interval *interval = ctx->intervals[def->name];
1434 if (!interval->interval.inserted)
1462 interval->dst.def = cur_def;
1463 interval->dst.flags = cur_def->flags;
1497 interval->dst.def = dst;
1498 interval->dst.flags = dst->flags;
1517 struct ra_spill_interval *interval = ctx->intervals[reg->name];
1520 interval->dst = *val;
1522 ra_spill_ctx_remove(ctx, interval);
1530 if (!ctx->intervals[phi->dsts[0]->name]->interval.inserted) {
1555 spill_live_out(struct ra_spill_ctx *ctx, struct ra_spill_interval *interval,
1558 struct ir3_register *def = interval->interval.reg;
1560 spill(ctx, &interval->dst, get_spill_slot(ctx, def), NULL, block);
1561 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval);
1568 rb_tree_foreach_safe (struct ra_spill_interval, interval,
1569 &ctx->reg_ctx.intervals, interval.node) {
1570 if (!BITSET_TEST(state->live_out, interval->interval.reg->name)) {
1571 spill_live_out(ctx, interval, block);
1580 struct ra_spill_interval *interval = ctx->intervals[def->name];
1581 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval);
1593 struct ra_spill_interval *interval = ctx->intervals[name];
1594 if (!interval->interval.inserted)
1614 struct ra_spill_interval *interval = ctx->intervals[def->name];
1615 if (!interval->interval.inserted)
1617 set_src_val(instr->srcs[pred_idx], &interval->dst);
1623 struct ra_spill_interval *interval,
1629 struct ir3_register *def = interval->interval.reg;
1636 &interval->interval.children, interval.node) {
1654 rb_tree_foreach (struct ra_spill_interval, interval,
1655 &ctx->reg_ctx.intervals, interval.node) {
1656 record_pred_live_out(ctx, interval, block, i);
1664 struct ra_spill_interval *interval)
1666 if (!(interval->dst.flags & IR3_REG_SSA) ||
1667 interval->dst.def) {
1669 *val = interval->dst;
1670 _mesa_hash_table_insert(state->remap, interval->interval.reg, val);
1673 &interval->interval.children, interval.node) {
1684 rb_tree_foreach (struct ra_spill_interval, interval, &ctx->reg_ctx.intervals,
1685 interval.node) {
1686 record_live_out(ctx, state, interval);
1924 * interval information which isn't trashed by spilling, and forcibly merge