• Home
  • Raw
  • Download

Lines Matching full:interval

28    struct ir3_reg_interval interval;  member
33 /* If this interval was spilled, the original physreg_start before spilling.
79 ir3_reg_interval_to_ra_interval(struct ir3_reg_interval *interval) in ir3_reg_interval_to_ra_interval() argument
81 return rb_node_data(struct ra_interval, interval, interval); in ir3_reg_interval_to_ra_interval()
97 ra_interval_next(struct ra_interval *interval) in ra_interval_next() argument
99 struct rb_node *next = rb_node_next(&interval->physreg_node); in ra_interval_next()
104 ra_interval_next_or_null(struct ra_interval *interval) in ra_interval_next_or_null() argument
106 return interval ? ra_interval_next(interval) : NULL; in ra_interval_next_or_null()
121 const struct ra_interval *interval = rb_node_to_interval_const(node); in ra_interval_cmp() local
122 if (interval->physreg_start > reg) in ra_interval_cmp()
124 else if (interval->physreg_end <= reg) in ra_interval_cmp()
143 /* Get the interval covering the reg, or the closest to the right if it
149 struct ra_interval *interval = ra_interval_search_sloppy(tree, reg); in ra_interval_search_right() local
150 if (!interval) { in ra_interval_search_right()
152 } else if (interval->physreg_end > reg) { in ra_interval_search_right()
153 return interval; in ra_interval_search_right()
155 /* There is no interval covering reg, and ra_file_search_sloppy() in ra_interval_search_right()
156 * returned the closest range to the left, so the next interval to the in ra_interval_search_right()
159 return ra_interval_next_or_null(interval); in ra_interval_search_right()
172 struct ra_interval *interval = ir3_reg_interval_to_ra_interval(_interval); in interval_add() local
178 for (physreg_t i = interval->physreg_start; i < interval->physreg_end; i++) { in interval_add()
182 rb_tree_insert(&ctx->physreg_intervals, &interval->physreg_node, in interval_add()
189 struct ra_interval *interval = ir3_reg_interval_to_ra_interval(_interval); in interval_delete() local
192 for (physreg_t i = interval->physreg_start; i < interval->physreg_end; i++) { in interval_delete()
196 rb_tree_remove(&ctx->physreg_intervals, &interval->physreg_node); in interval_delete()
207 parent->physreg_start + (child->interval.reg->interval_start - in interval_readd()
208 parent->interval.reg->interval_start); in interval_readd()
211 (child->interval.reg->interval_end - child->interval.reg->interval_start); in interval_readd()
236 ra_interval_init(struct ra_interval *interval, struct ir3_register *reg) in ra_interval_init() argument
238 ir3_reg_interval_init(&interval->interval, reg); in ra_interval_init()
242 ra_interval_get_physreg(const struct ra_interval *interval) in ra_interval_get_physreg() argument
244 unsigned child_start = interval->interval.reg->interval_start; in ra_interval_get_physreg()
246 while (interval->interval.parent) { in ra_interval_get_physreg()
247 interval = ir3_reg_interval_to_ra_interval(interval->interval.parent); in ra_interval_get_physreg()
250 return interval->physreg_start + in ra_interval_get_physreg()
251 (child_start - interval->interval.reg->interval_start); in ra_interval_get_physreg()
255 ra_interval_get_num(const struct ra_interval *interval) in ra_interval_get_num() argument
257 return ra_physreg_to_num(ra_interval_get_physreg(interval), in ra_interval_get_num()
258 interval->interval.reg->flags); in ra_interval_get_num()
262 ra_interval_dump(struct log_stream *stream, struct ra_interval *interval) in ra_interval_dump() argument
264 mesa_log_stream_printf(stream, "physreg %u ", interval->physreg_start); in ra_interval_dump()
266 ir3_reg_interval_dump(stream, &interval->interval); in ra_interval_dump()
275 rb_tree_foreach (struct ra_interval, interval, &ctx->physreg_intervals, in ra_ctx_dump()
277 ra_interval_dump(stream, interval); in ra_ctx_dump()
359 for (struct ra_interval *interval = ra_ctx_search_right(ctx, candidate); in find_best_spill_reg() local
360 interval && interval->physreg_start < candidate + size; in find_best_spill_reg()
361 interval = ra_interval_next_or_null(interval)) { in find_best_spill_reg()
365 if (interval->src) { in find_best_spill_reg()
373 if (!interval->spill_def) in find_best_spill_reg()
374 cost += (interval->physreg_end - interval->physreg_start); in find_best_spill_reg()
435 spill_interval_children(struct ra_interval *interval, in spill_interval_children() argument
438 rb_tree_foreach (struct ra_interval, child, &interval->interval.children, in spill_interval_children()
439 interval.node) { in spill_interval_children()
441 child->spill_def = extract(interval->spill_def, in spill_interval_children()
442 (child->interval.reg->interval_start - in spill_interval_children()
443 interval->interval.reg->interval_start) / in spill_interval_children()
444 reg_elem_size(interval->interval.reg), in spill_interval_children()
445 reg_elems(child->interval.reg), before); in spill_interval_children()
446 interval->physreg_start_orig = child->physreg_start; in spill_interval_children()
453 spill_interval(struct ra_ctx *ctx, struct ra_interval *interval) in spill_interval() argument
455 struct ir3_instruction *before = interval->interval.reg->instr; in spill_interval()
457 d("spilling ssa_%u:%u", before->serialno, interval->interval.reg->name); in spill_interval()
459 if (!interval->spill_def) { in spill_interval()
479 dst->flags |= (interval->interval.reg->flags & IR3_REG_HALF); in spill_interval()
480 dst->wrmask = interval->interval.reg->wrmask; in spill_interval()
482 ir3_src_create(mov, interval->interval.reg->num, in spill_interval()
484 (interval->interval.reg->flags & IR3_REG_HALF))->wrmask = in spill_interval()
485 interval->interval.reg->wrmask; in spill_interval()
487 (interval->interval.reg->flags & IR3_REG_HALF) ? TYPE_U16 : TYPE_U32; in spill_interval()
489 interval->spill_def = dst; in spill_interval()
490 interval->physreg_start_orig = interval->physreg_start; in spill_interval()
493 spill_interval_children(interval, interval->spill_def->instr); in spill_interval()
495 ir3_reg_interval_remove_all(&ctx->reg_ctx, &interval->interval); in spill_interval()
579 struct ra_interval *interval = &ctx->intervals[src->def->name]; in try_demote_instruction() local
580 if (interval->spill_def) { in try_demote_instruction()
581 src->def = interval->spill_def; in try_demote_instruction()
583 interval->needs_reload = false; in try_demote_instruction()
584 if (interval->interval.inserted) in try_demote_instruction()
585 ir3_reg_interval_remove(&ctx->reg_ctx, &interval->interval); in try_demote_instruction()
586 while (interval->interval.parent) in try_demote_instruction()
587 interval = ir3_reg_interval_to_ra_interval(interval->interval.parent); in try_demote_instruction()
588 interval->src = false; in try_demote_instruction()
607 struct ra_interval *interval = ra_ctx_search_right(ctx, start); in free_space() local
608 while (interval && interval->physreg_start < start + size) { in free_space()
609 struct ra_interval *next = ra_interval_next_or_null(interval); in free_space()
610 spill_interval(ctx, interval); in free_space()
611 interval = next; in free_space()
680 struct ra_interval *interval = &ctx->intervals[reg->name]; in reload_src() local
696 interval->physreg_start = best_reg; in reload_src()
697 interval->physreg_end = best_reg + size; in reload_src()
698 interval->needs_reload = true; in reload_src()
699 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval); in reload_src()
700 interval->src = true; in reload_src()
705 struct ra_interval *interval) in reload_interval() argument
707 struct ir3_register *def = interval->interval.reg; in reload_interval()
711 ir3_dst_create(mov, ra_physreg_to_num(interval->physreg_start, flags), in reload_interval()
717 assert(interval->spill_def); in reload_interval()
718 mov_src->def = interval->spill_def; in reload_interval()
729 struct ra_interval *interval = &ctx->intervals[reg->name]; in reload_src_finalize() local
731 if (!interval->needs_reload) in reload_src_finalize()
734 reload_interval(ctx, ir3_before_instr(instr), interval); in reload_src_finalize()
736 interval->needs_reload = false; in reload_src_finalize()
769 struct ra_interval *interval = &ctx->intervals[src->def->name]; in mark_src() local
771 if (interval->interval.inserted) { in mark_src()
772 while (interval->interval.parent) in mark_src()
773 interval = ir3_reg_interval_to_ra_interval(interval->interval.parent); in mark_src()
775 interval->src = true; in mark_src()
786 struct ra_interval *interval = &ctx->intervals[src->def->name]; in ensure_src_live() local
788 if (!interval->interval.inserted) { in ensure_src_live()
792 assert(interval->spill_def); in ensure_src_live()
802 src->def = interval->spill_def; in ensure_src_live()
814 struct ra_interval *interval = &ctx->intervals[src->def->name]; in assign_src() local
815 assert(interval->interval.inserted); in assign_src()
816 src->num = ra_physreg_to_num(ra_interval_get_physreg(interval), src->flags); in assign_src()
819 !interval->interval.parent && in assign_src()
820 rb_tree_is_empty(&interval->interval.children)) in assign_src()
821 ir3_reg_interval_remove(&ctx->reg_ctx, &interval->interval); in assign_src()
823 while (interval->interval.parent) in assign_src()
824 interval = ir3_reg_interval_to_ra_interval(interval->interval.parent); in assign_src()
826 interval->src = false; in assign_src()
854 struct ra_interval *interval = &ctx->intervals[dst->name]; in handle_dst() local
855 ra_interval_init(interval, dst); in handle_dst()
856 interval->spill_def = NULL; in handle_dst()
862 !tied_interval->interval.parent && in handle_dst()
863 rb_tree_is_empty(&tied_interval->interval.children)) { in handle_dst()
865 interval->physreg_start = tied_interval->physreg_start; in handle_dst()
866 interval->physreg_end = tied_interval->physreg_end; in handle_dst()
867 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval); in handle_dst()
888 * interval. Since we don't support moving intervals in shared RA, this may in handle_dst()
890 * top-level interval for the destination so that the source intervals will in handle_dst()
901 interval->physreg_start = physreg; in handle_dst()
902 interval->physreg_end = physreg + reg_size(dst); in handle_dst()
903 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval); in handle_dst()
925 struct ra_interval *interval = &ctx->intervals[src->def->name]; in handle_src_late() local
934 if (interval->interval.inserted) in handle_src_late()
935 ir3_reg_interval_remove(&ctx->reg_ctx, &interval->interval); in handle_src_late()
995 ir3_reg_interval_insert(&ctx->reg_ctx, &dst_interval->interval); in handle_split()
1001 ir3_reg_interval_remove(&ctx->reg_ctx, &src_interval->interval); in handle_split()
1081 ir3_reg_interval_insert(&ctx->reg_ctx, &dst_interval->interval); in handle_phi()
1145 struct ra_interval *interval = &ctx->intervals[name]; in reload_live_outs() local
1146 if (!interval->interval.inserted) { in reload_live_outs()
1149 /* When this interval was spilled inside the loop, we probably chose a in reload_live_outs()
1154 unsigned size = interval->physreg_end - interval->physreg_start; in reload_live_outs()
1155 interval->physreg_start = interval->physreg_start_orig; in reload_live_outs()
1156 interval->physreg_end = interval->physreg_start + size; in reload_live_outs()
1158 reload_interval(ctx, ir3_before_terminator(block), interval); in reload_live_outs()
1165 struct ra_interval *interval, in record_pred_live_out() argument
1170 struct ir3_register *def = interval->interval.reg; in record_pred_live_out()
1174 &interval->interval.children, interval.node) { in record_pred_live_out()
1192 rb_tree_foreach (struct ra_interval, interval, in record_pred_live_outs()
1193 &ctx->reg_ctx.intervals, interval.node) { in record_pred_live_outs()
1194 record_pred_live_out(ctx, interval, pred); in record_pred_live_outs()
1208 struct ra_interval *interval = &ctx->intervals[name]; in handle_block() local
1211 * them, so we still need to initialize the interval. But we shouldn't in handle_block()
1214 ra_interval_init(interval, def); in handle_block()
1216 if ((def->flags & IR3_REG_SHARED) && !interval->spill_def) { in handle_block()
1217 ir3_reg_interval_insert(&ctx->reg_ctx, &interval->interval); in handle_block()