freedreno/ir3: add input/output iterators

We can at least get rid of the if-not-NULL check in a bunch of places.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Rob Clark 2019-10-24 12:05:56 -07:00
parent b2417801e5
commit c00a67171c
11 changed files with 49 additions and 63 deletions

View file

@ -1063,6 +1063,19 @@ static inline bool __is_false_dep(struct ir3_instruction *instr, unsigned n)
#define foreach_ssa_src(__srcinst, __instr) \
foreach_ssa_src_n(__srcinst, __i, __instr)
/* iterators for shader inputs: */
#define foreach_input_n(__ininstr, __cnt, __ir) \
for (unsigned __cnt = 0; __cnt < (__ir)->ninputs; __cnt++) \
if ((__ininstr = (__ir)->inputs[__cnt]))
#define foreach_input(__ininstr, __ir) \
foreach_input_n(__ininstr, __i, __ir)
/* iterators for shader outputs: */
#define foreach_output_n(__outinstr, __cnt, __ir) \
for (unsigned __cnt = 0; __cnt < (__ir)->noutputs; __cnt++) \
if ((__outinstr = (__ir)->outputs[__cnt]))
#define foreach_output(__outinstr, __ir) \
foreach_output_n(__outinstr, __i, __ir)
/* dump: */
void ir3_print(struct ir3 *ir);

View file

@ -408,12 +408,10 @@ ir3_a6xx_fixup_atomic_dests(struct ir3 *ir, struct ir3_shader_variant *so)
}
/* we also need to fixup shader outputs: */
for (unsigned i = 0; i < ir->noutputs; i++) {
if (!ir->outputs[i])
continue;
if (is_atomic(ir->outputs[i]->opc) && (ir->outputs[i]->flags & IR3_INSTR_G))
ir->outputs[i] = get_atomic_dest_mov(ir->outputs[i]);
}
struct ir3_instruction *out;
foreach_output_n(out, n, ir)
if (is_atomic(out->opc) && (out->flags & IR3_INSTR_G))
ir->outputs[n] = get_atomic_dest_mov(out);
}
}

View file

@ -3425,15 +3425,10 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
ret = ir3_ra(so, precolor, ARRAY_SIZE(precolor));
} else if (so->num_sampler_prefetch) {
assert(so->type == MESA_SHADER_FRAGMENT);
struct ir3_instruction *precolor[2];
struct ir3_instruction *instr, *precolor[2];
int idx = 0;
for (unsigned i = 0; i < ir->ninputs; i++) {
struct ir3_instruction *instr = ctx->ir->inputs[i];
if (!instr)
continue;
foreach_input(instr, ir) {
if (instr->input.sysval != SYSTEM_VALUE_BARYCENTRIC_PIXEL)
continue;

View file

@ -759,11 +759,10 @@ ir3_cp(struct ir3 *ir, struct ir3_shader_variant *so)
ir3_clear_mark(ir);
for (unsigned i = 0; i < ir->noutputs; i++) {
if (ir->outputs[i]) {
instr_cp(&ctx, ir->outputs[i]);
ir->outputs[i] = eliminate_output_mov(ir->outputs[i]);
}
struct ir3_instruction *out;
foreach_output_n(out, n, ir) {
instr_cp(&ctx, out);
ir->outputs[n] = eliminate_output_mov(out);
}
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {

View file

@ -233,9 +233,9 @@ compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
}
}
for (i = 0; i < ir->noutputs; i++)
if (ir->outputs[i])
ir3_instr_depth(ir->outputs[i], 0, false);
struct ir3_instruction *out;
foreach_output(out, ir)
ir3_instr_depth(out, 0, false);
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
for (i = 0; i < block->keeps_count; i++)
@ -261,11 +261,10 @@ compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
}
/* cleanup unused inputs: */
for (i = 0; i < ir->ninputs; i++) {
struct ir3_instruction *in = ir->inputs[i];
if (in && (in->flags & IR3_INSTR_UNUSED))
ir->inputs[i] = NULL;
}
struct ir3_instruction *in;
foreach_input_n(in, n, ir)
if (in->flags & IR3_INSTR_UNUSED)
ir->inputs[n] = NULL;
return progress;
}

View file

@ -247,12 +247,9 @@ find_neighbors(struct ir3 *ir)
for (i = 0; i < ir->noutputs; i += 4)
group_n(&arr_ops_out, &ir->outputs[i], 4);
for (i = 0; i < ir->noutputs; i++) {
if (ir->outputs[i]) {
struct ir3_instruction *instr = ir->outputs[i];
instr_find_neighbors(instr);
}
}
struct ir3_instruction *out;
foreach_output(out, ir)
instr_find_neighbors(out);
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
for (i = 0; i < block->keeps_count; i++) {

View file

@ -321,10 +321,9 @@ ir3_print(struct ir3 *ir)
list_for_each_entry (struct ir3_block, block, &ir->block_list, node)
print_block(block, 0);
for (unsigned i = 0; i < ir->noutputs; i++) {
if (!ir->outputs[i])
continue;
struct ir3_instruction *out;
foreach_output_n(out, i, ir) {
printf("out%d: ", i);
print_instr(ir->outputs[i], 0);
print_instr(out, 0);
}
}

View file

@ -944,11 +944,9 @@ ra_add_interference(struct ir3_ra_ctx *ctx)
}
/* need to fix things up to keep outputs live: */
for (unsigned i = 0; i < ir->noutputs; i++) {
struct ir3_instruction *instr = ir->outputs[i];
if (!instr)
continue;
unsigned name = ra_name(ctx, &ctx->instrd[instr->ip]);
struct ir3_instruction *out;
foreach_output(out, ir) {
unsigned name = ra_name(ctx, &ctx->instrd[out->ip]);
ctx->use[name] = ctx->instr_cnt;
}

View file

@ -170,14 +170,9 @@ update_use_count(struct ir3 *ir)
/* Shader outputs are also used:
*/
for (unsigned i = 0; i < ir->noutputs; i++) {
struct ir3_instruction *out = ir->outputs[i];
if (!out)
continue;
struct ir3_instruction *out;
foreach_output(out, ir)
use_instr(out);
}
}
#define NULL_INSTR ((void *)~0)

View file

@ -380,12 +380,9 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out)
uint8_t regid;
unsigned i;
for (i = 0; i < ir->ninputs; i++) {
if (!ir->inputs[i]) {
fprintf(out, "; in%d unused\n", i);
continue;
}
reg = ir->inputs[i]->regs[0];
struct ir3_instruction *instr;
foreach_input_n(instr, i, ir) {
reg = instr->regs[0];
regid = reg->num;
fprintf(out, "@in(%sr%d.%c)\tin%d\n",
(reg->flags & IR3_REG_HALF) ? "h" : "",
@ -402,12 +399,8 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out)
fetch->wrmask, fetch->cmd);
}
for (i = 0; i < ir->noutputs; i++) {
if (!ir->outputs[i]) {
fprintf(out, "; out%d unused\n", i);
continue;
}
reg = ir->outputs[i]->regs[0];
foreach_output_n(instr, i, ir) {
reg = instr->regs[0];
regid = reg->num;
fprintf(out, "@out(%sr%d.%c)\tout%d\n",
(reg->flags & IR3_REG_HALF) ? "h" : "",

View file

@ -96,9 +96,9 @@ ir3_sun(struct ir3 *ir)
ir3_clear_mark(ir);
for (unsigned i = 0; i < ir->noutputs; i++)
if (ir->outputs[i])
max = MAX2(max, number_instr(ir->outputs[i]));
struct ir3_instruction *out;
foreach_output(out, ir)
max = MAX2(max, number_instr(out));
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
for (unsigned i = 0; i < block->keeps_count; i++)