From b787b353d04e23fdea567186f7cb422fd687bcdd Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 16 Mar 2020 06:41:41 -0700 Subject: [PATCH] freedreno/ir3: add mov/cov stats While not always avoidable, cov instructions are a useful thing to look at to see if we could fold into src. Signed-off-by: Rob Clark Part-of: --- src/freedreno/ir3/ir3.c | 11 ++++++++--- src/freedreno/ir3/ir3.h | 2 ++ src/freedreno/ir3/ir3_shader.c | 3 ++- src/gallium/drivers/freedreno/ir3/ir3_gallium.c | 6 ++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index 6b6b83b..f2dbc88 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -917,13 +917,11 @@ void * ir3_assemble(struct ir3 *shader, struct ir3_info *info, { uint32_t *ptr, *dwords; + memset(info, 0, sizeof(*info)); info->gpu_id = gpu_id; info->max_reg = -1; info->max_half_reg = -1; info->max_const = -1; - info->instrs_count = 0; - info->sizedwords = 0; - info->ss = info->sy = 0; foreach_block (block, &shader->block_list) { foreach_instr (instr, &block->instr_list) { @@ -958,6 +956,13 @@ void * ir3_assemble(struct ir3 *shader, struct ir3_info *info, info->nops_count += instr->nop; if (instr->opc == OPC_NOP) info->nops_count += 1 + instr->repeat; + if (instr->opc == OPC_MOV) { + if (instr->cat1.src_type == instr->cat1.dst_type) { + info->mov_count += 1 + instr->repeat; + } else { + info->cov_count += 1 + instr->repeat; + } + } dwords += 2; if (instr->flags & IR3_INSTR_SS) { diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 4dfcdf0..65c1679 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -48,6 +48,8 @@ struct ir3_info { uint16_t sizedwords; uint16_t instrs_count; /* expanded to account for rpt's */ uint16_t nops_count; /* # of nop instructions, including nopN */ + uint16_t mov_count; + uint16_t cov_count; /* NOTE: max_reg, etc, does not include registers not touched * by the shader (ie. vertex fetched via VFD_DECODE but not * touched by shader) diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c index e42f771..80a56a5 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c @@ -508,11 +508,12 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out) fprintf(out, "\n"); /* print generic shader info: */ - fprintf(out, "; %s prog %d/%d: %u instr, %u nops, %u non-nops, %u dwords\n", + fprintf(out, "; %s prog %d/%d: %u instr, %u nops, %u non-nops, %u mov, %u cov, %u dwords\n", type, so->shader->id, so->id, so->info.instrs_count, so->info.nops_count, so->info.instrs_count - so->info.nops_count, + so->info.mov_count, so->info.cov_count, so->info.sizedwords); fprintf(out, "; %s prog %d/%d: %u last-baryf, %d half, %d full, %u constlen\n", diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c index 8fff7da..158869a 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c @@ -51,13 +51,15 @@ dump_shader_info(struct ir3_shader_variant *v, bool binning_pass, return; pipe_debug_message(debug, SHADER_INFO, - "%s shader: %u inst, %u nops, %u non-nops, %u dwords, " - "%u last-baryf, %u half, %u full, %u constlen, " + "%s shader: %u inst, %u nops, %u non-nops, %u mov, %u cov, " + "%u dwords, %u last-baryf, %u half, %u full, %u constlen, " "%u sstall, %u (ss), %u (sy), %d max_sun, %d loops\n", ir3_shader_stage(v), v->info.instrs_count, v->info.nops_count, v->info.instrs_count - v->info.nops_count, + v->info.mov_count, + v->info.cov_count, v->info.sizedwords, v->info.last_baryf, v->info.max_half_reg + 1, -- 2.7.4