xref: /aosp_15_r20/external/mesa3d/src/freedreno/ir3/ir3_ra.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #ifndef _IR3_RA_H
7*61046927SAndroid Build Coastguard Worker #define _IR3_RA_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "util/rb_tree.h"
10*61046927SAndroid Build Coastguard Worker #include "ir3.h"
11*61046927SAndroid Build Coastguard Worker #include "ir3_compiler.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
14*61046927SAndroid Build Coastguard Worker #define RA_DEBUG (ir3_shader_debug & IR3_DBG_RAMSGS)
15*61046927SAndroid Build Coastguard Worker #else
16*61046927SAndroid Build Coastguard Worker #define RA_DEBUG 0
17*61046927SAndroid Build Coastguard Worker #endif
18*61046927SAndroid Build Coastguard Worker #define d(fmt, ...)                                                            \
19*61046927SAndroid Build Coastguard Worker    do {                                                                        \
20*61046927SAndroid Build Coastguard Worker       if (RA_DEBUG) {                                                          \
21*61046927SAndroid Build Coastguard Worker          mesa_logi("RA: " fmt, ##__VA_ARGS__);                                 \
22*61046927SAndroid Build Coastguard Worker       }                                                                        \
23*61046927SAndroid Build Coastguard Worker    } while (0)
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #define di(instr, fmt, ...)                                                    \
26*61046927SAndroid Build Coastguard Worker    do {                                                                        \
27*61046927SAndroid Build Coastguard Worker       if (RA_DEBUG) {                                                          \
28*61046927SAndroid Build Coastguard Worker          struct log_stream *stream = mesa_log_streami();                       \
29*61046927SAndroid Build Coastguard Worker          mesa_log_stream_printf(stream, "RA: " fmt ": ", ##__VA_ARGS__);       \
30*61046927SAndroid Build Coastguard Worker          ir3_print_instr_stream(stream, instr);                                \
31*61046927SAndroid Build Coastguard Worker          mesa_log_stream_destroy(stream);                                      \
32*61046927SAndroid Build Coastguard Worker       }                                                                        \
33*61046927SAndroid Build Coastguard Worker    } while (0)
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker typedef uint16_t physreg_t;
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker static inline unsigned
ra_physreg_to_num(physreg_t physreg,unsigned flags)38*61046927SAndroid Build Coastguard Worker ra_physreg_to_num(physreg_t physreg, unsigned flags)
39*61046927SAndroid Build Coastguard Worker {
40*61046927SAndroid Build Coastguard Worker    if (!(flags & IR3_REG_HALF))
41*61046927SAndroid Build Coastguard Worker       physreg /= 2;
42*61046927SAndroid Build Coastguard Worker    if (flags & IR3_REG_SHARED)
43*61046927SAndroid Build Coastguard Worker       physreg += 48 * 4;
44*61046927SAndroid Build Coastguard Worker    else if (flags & IR3_REG_PREDICATE)
45*61046927SAndroid Build Coastguard Worker       physreg += REG_P0 * 4;
46*61046927SAndroid Build Coastguard Worker    return physreg;
47*61046927SAndroid Build Coastguard Worker }
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker static inline physreg_t
ra_num_to_physreg(unsigned num,unsigned flags)50*61046927SAndroid Build Coastguard Worker ra_num_to_physreg(unsigned num, unsigned flags)
51*61046927SAndroid Build Coastguard Worker {
52*61046927SAndroid Build Coastguard Worker    if (flags & IR3_REG_SHARED)
53*61046927SAndroid Build Coastguard Worker       num -= 48 * 4;
54*61046927SAndroid Build Coastguard Worker    else if (flags & IR3_REG_PREDICATE)
55*61046927SAndroid Build Coastguard Worker       num -= REG_P0 * 4;
56*61046927SAndroid Build Coastguard Worker    if (!(flags & IR3_REG_HALF))
57*61046927SAndroid Build Coastguard Worker       num *= 2;
58*61046927SAndroid Build Coastguard Worker    return num;
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker static inline unsigned
ra_reg_get_num(const struct ir3_register * reg)62*61046927SAndroid Build Coastguard Worker ra_reg_get_num(const struct ir3_register *reg)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker    return (reg->flags & IR3_REG_ARRAY) ? reg->array.base : reg->num;
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker static inline physreg_t
ra_reg_get_physreg(const struct ir3_register * reg)68*61046927SAndroid Build Coastguard Worker ra_reg_get_physreg(const struct ir3_register *reg)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker    return ra_num_to_physreg(ra_reg_get_num(reg), reg->flags);
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker static inline bool
def_is_gpr(const struct ir3_register * reg)74*61046927SAndroid Build Coastguard Worker def_is_gpr(const struct ir3_register *reg)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    return reg_num(reg) != REG_A0 && !(reg->flags & IR3_REG_PREDICATE);
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker /* Note: don't count undef as a source.
80*61046927SAndroid Build Coastguard Worker  */
81*61046927SAndroid Build Coastguard Worker static inline bool
ra_reg_is_src(const struct ir3_register * reg)82*61046927SAndroid Build Coastguard Worker ra_reg_is_src(const struct ir3_register *reg)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker    return (reg->flags & IR3_REG_SSA) && reg->def && def_is_gpr(reg->def);
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker static inline bool
ra_reg_is_dst(const struct ir3_register * reg)88*61046927SAndroid Build Coastguard Worker ra_reg_is_dst(const struct ir3_register *reg)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker    return (reg->flags & IR3_REG_SSA) && def_is_gpr(reg) &&
91*61046927SAndroid Build Coastguard Worker           ((reg->flags & IR3_REG_ARRAY) || reg->wrmask);
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker static inline bool
ra_reg_is_predicate(const struct ir3_register * reg)95*61046927SAndroid Build Coastguard Worker ra_reg_is_predicate(const struct ir3_register *reg)
96*61046927SAndroid Build Coastguard Worker {
97*61046927SAndroid Build Coastguard Worker    return (reg->flags & IR3_REG_SSA) && (reg->flags & IR3_REG_PREDICATE);
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker /* Iterators for sources and destinations which:
101*61046927SAndroid Build Coastguard Worker  * - Don't include fake sources (irrelevant for RA)
102*61046927SAndroid Build Coastguard Worker  * - Don't include non-SSA sources (immediates and constants, also irrelevant)
103*61046927SAndroid Build Coastguard Worker  */
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker #define ra_foreach_src_n(__srcreg, __n, __instr)                               \
106*61046927SAndroid Build Coastguard Worker    foreach_src_n(__srcreg, __n, __instr)                                       \
107*61046927SAndroid Build Coastguard Worker       if (ra_reg_is_src(__srcreg))
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker #define ra_foreach_src(__srcreg, __instr)                                      \
110*61046927SAndroid Build Coastguard Worker    ra_foreach_src_n(__srcreg, __i, __instr)
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker #define ra_foreach_src_rev(__srcreg, __instr)                                  \
113*61046927SAndroid Build Coastguard Worker    for (struct ir3_register *__srcreg = (void *)~0; __srcreg; __srcreg = NULL) \
114*61046927SAndroid Build Coastguard Worker       for (int __cnt = (__instr)->srcs_count, __i = __cnt - 1; __i >= 0;       \
115*61046927SAndroid Build Coastguard Worker            __i--)                                                              \
116*61046927SAndroid Build Coastguard Worker          if (ra_reg_is_src((__srcreg = (__instr)->srcs[__i])))
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker #define ra_foreach_dst_n(__dstreg, __n, __instr)                               \
119*61046927SAndroid Build Coastguard Worker    foreach_dst_n(__dstreg, __n, __instr)                                         \
120*61046927SAndroid Build Coastguard Worker       if (ra_reg_is_dst(__dstreg))
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker #define ra_foreach_dst(__dstreg, __instr)                                      \
123*61046927SAndroid Build Coastguard Worker    ra_foreach_dst_n(__dstreg, __i, __instr)
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker #define RA_HALF_SIZE     (4 * 48)
126*61046927SAndroid Build Coastguard Worker #define RA_FULL_SIZE     (4 * 48 * 2)
127*61046927SAndroid Build Coastguard Worker #define RA_SHARED_SIZE   (2 * 4 * 8)
128*61046927SAndroid Build Coastguard Worker #define RA_SHARED_HALF_SIZE (4 * 8)
129*61046927SAndroid Build Coastguard Worker #define RA_MAX_FILE_SIZE RA_FULL_SIZE
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker struct ir3_liveness {
132*61046927SAndroid Build Coastguard Worker    unsigned block_count;
133*61046927SAndroid Build Coastguard Worker    unsigned interval_offset;
134*61046927SAndroid Build Coastguard Worker    DECLARE_ARRAY(struct ir3_register *, definitions);
135*61046927SAndroid Build Coastguard Worker    DECLARE_ARRAY(BITSET_WORD *, live_out);
136*61046927SAndroid Build Coastguard Worker    DECLARE_ARRAY(BITSET_WORD *, live_in);
137*61046927SAndroid Build Coastguard Worker };
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker typedef bool (*reg_filter_cb)(const struct ir3_register *);
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker struct ir3_liveness *ir3_calc_liveness_for(void *mem_ctx, struct ir3 *ir,
142*61046927SAndroid Build Coastguard Worker                                            reg_filter_cb filter_src,
143*61046927SAndroid Build Coastguard Worker                                            reg_filter_cb filter_dst);
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker static inline struct ir3_liveness *
ir3_calc_liveness(void * mem_ctx,struct ir3 * ir)146*61046927SAndroid Build Coastguard Worker ir3_calc_liveness(void *mem_ctx, struct ir3 *ir)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker    return ir3_calc_liveness_for(mem_ctx, ir, ra_reg_is_src, ra_reg_is_dst);
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker bool ir3_def_live_after(struct ir3_liveness *live, struct ir3_register *def,
152*61046927SAndroid Build Coastguard Worker                         struct ir3_instruction *instr);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker void ir3_create_parallel_copies(struct ir3 *ir);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker void ir3_merge_regs(struct ir3_liveness *live, struct ir3 *ir);
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker void ir3_force_merge(struct ir3_register *a, struct ir3_register *b,
159*61046927SAndroid Build Coastguard Worker                      int b_offset);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker void ir3_index_instrs_for_merge_sets(struct ir3 *ir);
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker struct ir3_pressure {
164*61046927SAndroid Build Coastguard Worker    unsigned full, half, shared, shared_half;
165*61046927SAndroid Build Coastguard Worker };
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker void ir3_calc_pressure(struct ir3_shader_variant *v, struct ir3_liveness *live,
168*61046927SAndroid Build Coastguard Worker                        struct ir3_pressure *max_pressure);
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker bool ir3_spill(struct ir3 *ir, struct ir3_shader_variant *v,
171*61046927SAndroid Build Coastguard Worker                struct ir3_liveness **live,
172*61046927SAndroid Build Coastguard Worker                const struct ir3_pressure *limit_pressure);
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker bool ir3_lower_spill(struct ir3 *ir);
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker void ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness **live);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker void ir3_ra_validate(struct ir3_shader_variant *v, unsigned full_size,
179*61046927SAndroid Build Coastguard Worker                      unsigned half_size, unsigned block_count, bool shared_ra);
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker void ir3_lower_copies(struct ir3_shader_variant *v);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker /* Register interval datastructure
184*61046927SAndroid Build Coastguard Worker  *
185*61046927SAndroid Build Coastguard Worker  * ir3_reg_ctx is used to track which registers are live. The tricky part is
186*61046927SAndroid Build Coastguard Worker  * that some registers may overlap each other, when registers with overlapping
187*61046927SAndroid Build Coastguard Worker  * live ranges get coalesced. For example, splits will overlap with their
188*61046927SAndroid Build Coastguard Worker  * parent vector and sometimes collect sources will also overlap with the
189*61046927SAndroid Build Coastguard Worker  * collect'ed vector. ir3_merge_regs guarantees for us that none of the
190*61046927SAndroid Build Coastguard Worker  * registers in a merge set that are live at any given point partially
191*61046927SAndroid Build Coastguard Worker  * overlap, which means that we can organize them into a forest. While each
192*61046927SAndroid Build Coastguard Worker  * register has a per-merge-set offset, ir3_merge_regs also computes a
193*61046927SAndroid Build Coastguard Worker  * "global" offset which allows us to throw away the original merge sets and
194*61046927SAndroid Build Coastguard Worker  * think of registers as just intervals in a forest of live intervals. When a
195*61046927SAndroid Build Coastguard Worker  * register becomes live, we insert it into the forest, and when it dies we
196*61046927SAndroid Build Coastguard Worker  * remove it from the forest (and then its children get moved up a level). We
197*61046927SAndroid Build Coastguard Worker  * use red-black trees to keep track of each level of the forest, so insertion
198*61046927SAndroid Build Coastguard Worker  * and deletion should be fast operations. ir3_reg_ctx handles all the
199*61046927SAndroid Build Coastguard Worker  * internal bookkeeping for this, so that it can be shared between RA,
200*61046927SAndroid Build Coastguard Worker  * spilling, and register pressure tracking.
201*61046927SAndroid Build Coastguard Worker  */
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker struct ir3_reg_interval {
204*61046927SAndroid Build Coastguard Worker    struct rb_node node;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    struct rb_tree children;
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    struct ir3_reg_interval *parent;
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker    struct ir3_register *reg;
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker    bool inserted;
213*61046927SAndroid Build Coastguard Worker };
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker struct ir3_reg_ctx {
216*61046927SAndroid Build Coastguard Worker    /* The tree of top-level intervals in the forest. */
217*61046927SAndroid Build Coastguard Worker    struct rb_tree intervals;
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker    /* Users of ir3_reg_ctx need to keep around additional state that is
220*61046927SAndroid Build Coastguard Worker     * modified when top-level intervals are added or removed. For register
221*61046927SAndroid Build Coastguard Worker     * pressure tracking, this is just the register pressure, but for RA we
222*61046927SAndroid Build Coastguard Worker     * need to keep track of the physreg of each top-level interval. These
223*61046927SAndroid Build Coastguard Worker     * callbacks provide a place to let users deriving from ir3_reg_ctx update
224*61046927SAndroid Build Coastguard Worker     * their state when top-level intervals are inserted/removed.
225*61046927SAndroid Build Coastguard Worker     */
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker    /* Called when an interval is added and it turns out to be at the top
228*61046927SAndroid Build Coastguard Worker     * level.
229*61046927SAndroid Build Coastguard Worker     */
230*61046927SAndroid Build Coastguard Worker    void (*interval_add)(struct ir3_reg_ctx *ctx,
231*61046927SAndroid Build Coastguard Worker                         struct ir3_reg_interval *interval);
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker    /* Called when an interval is deleted from the top level. */
234*61046927SAndroid Build Coastguard Worker    void (*interval_delete)(struct ir3_reg_ctx *ctx,
235*61046927SAndroid Build Coastguard Worker                            struct ir3_reg_interval *interval);
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    /* Called when an interval is deleted and its child becomes top-level.
238*61046927SAndroid Build Coastguard Worker     */
239*61046927SAndroid Build Coastguard Worker    void (*interval_readd)(struct ir3_reg_ctx *ctx,
240*61046927SAndroid Build Coastguard Worker                           struct ir3_reg_interval *parent,
241*61046927SAndroid Build Coastguard Worker                           struct ir3_reg_interval *child);
242*61046927SAndroid Build Coastguard Worker };
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker static inline struct ir3_reg_interval *
ir3_rb_node_to_interval(struct rb_node * node)245*61046927SAndroid Build Coastguard Worker ir3_rb_node_to_interval(struct rb_node *node)
246*61046927SAndroid Build Coastguard Worker {
247*61046927SAndroid Build Coastguard Worker    return rb_node_data(struct ir3_reg_interval, node, node);
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker static inline const struct ir3_reg_interval *
ir3_rb_node_to_interval_const(const struct rb_node * node)251*61046927SAndroid Build Coastguard Worker ir3_rb_node_to_interval_const(const struct rb_node *node)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    return rb_node_data(struct ir3_reg_interval, node, node);
254*61046927SAndroid Build Coastguard Worker }
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker static inline struct ir3_reg_interval *
ir3_reg_interval_next(struct ir3_reg_interval * interval)257*61046927SAndroid Build Coastguard Worker ir3_reg_interval_next(struct ir3_reg_interval *interval)
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker    struct rb_node *next = rb_node_next(&interval->node);
260*61046927SAndroid Build Coastguard Worker    return next ? ir3_rb_node_to_interval(next) : NULL;
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker static inline struct ir3_reg_interval *
ir3_reg_interval_next_or_null(struct ir3_reg_interval * interval)264*61046927SAndroid Build Coastguard Worker ir3_reg_interval_next_or_null(struct ir3_reg_interval *interval)
265*61046927SAndroid Build Coastguard Worker {
266*61046927SAndroid Build Coastguard Worker    return interval ? ir3_reg_interval_next(interval) : NULL;
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker static inline void
ir3_reg_interval_init(struct ir3_reg_interval * interval,struct ir3_register * reg)270*61046927SAndroid Build Coastguard Worker ir3_reg_interval_init(struct ir3_reg_interval *interval,
271*61046927SAndroid Build Coastguard Worker                       struct ir3_register *reg)
272*61046927SAndroid Build Coastguard Worker {
273*61046927SAndroid Build Coastguard Worker    rb_tree_init(&interval->children);
274*61046927SAndroid Build Coastguard Worker    interval->reg = reg;
275*61046927SAndroid Build Coastguard Worker    interval->parent = NULL;
276*61046927SAndroid Build Coastguard Worker    interval->inserted = false;
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker void ir3_reg_interval_dump(struct log_stream *stream,
280*61046927SAndroid Build Coastguard Worker                            struct ir3_reg_interval *interval);
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker void ir3_reg_interval_insert(struct ir3_reg_ctx *ctx,
283*61046927SAndroid Build Coastguard Worker                              struct ir3_reg_interval *interval);
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker void ir3_reg_interval_remove(struct ir3_reg_ctx *ctx,
286*61046927SAndroid Build Coastguard Worker                              struct ir3_reg_interval *interval);
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker void ir3_reg_interval_remove_all(struct ir3_reg_ctx *ctx,
289*61046927SAndroid Build Coastguard Worker                                  struct ir3_reg_interval *interval);
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker void ra_update_affinity(unsigned file_size, struct ir3_register *reg,
292*61046927SAndroid Build Coastguard Worker                         physreg_t physreg);
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker #endif
295