Mesa (master): pan/midgard: Use 16-bit liveness masks
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Oct 16 12:18:35 UTC 2019
Module: Mesa
Branch: master
Commit: fd2216e1fda76b2274bac3c3bce6c5af2dea5fc1
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fd2216e1fda76b2274bac3c3bce6c5af2dea5fc1
Author: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Date: Tue Oct 15 22:01:16 2019 -0400
pan/midgard: Use 16-bit liveness masks
We'll want liveness per-byte, so we need to accomodate up to 16 bytes.
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
---
src/panfrost/midgard/compiler.h | 10 ++++------
src/panfrost/midgard/midgard_liveness.c | 17 +++++++++--------
src/panfrost/midgard/midgard_ra.c | 2 +-
3 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h
index a4d78c2239b..508f7fd3d18 100644
--- a/src/panfrost/midgard/compiler.h
+++ b/src/panfrost/midgard/compiler.h
@@ -187,11 +187,9 @@ typedef struct midgard_block {
/* In liveness analysis, these are live masks (per-component) for
* indices for the block. Scalar compilers have the luxury of using
- * simple bit fields, but for us, liveness is a vector idea. We use
- * 8-bit to allow finegrained tracking up to vec8. If you're
- * implementing vec16 on Panfrost... I'm sorry. */
- uint8_t *live_in;
- uint8_t *live_out;
+ * simple bit fields, but for us, liveness is a vector idea. */
+ uint16_t *live_in;
+ uint16_t *live_out;
} midgard_block;
typedef struct midgard_bundle {
@@ -610,7 +608,7 @@ struct ra_graph;
void mir_lower_special_reads(compiler_context *ctx);
struct ra_graph* allocate_registers(compiler_context *ctx, bool *spilled);
void install_registers(compiler_context *ctx, struct ra_graph *g);
-void mir_liveness_ins_update(uint8_t *live, midgard_instruction *ins, unsigned max);
+void mir_liveness_ins_update(uint16_t *live, midgard_instruction *ins, unsigned max);
void mir_compute_liveness(compiler_context *ctx);
void mir_invalidate_liveness(compiler_context *ctx);
bool mir_is_live_after(compiler_context *ctx, midgard_block *block, midgard_instruction *start, int src);
diff --git a/src/panfrost/midgard/midgard_liveness.c b/src/panfrost/midgard/midgard_liveness.c
index 6ea36c5e6c6..8320b918ed2 100644
--- a/src/panfrost/midgard/midgard_liveness.c
+++ b/src/panfrost/midgard/midgard_liveness.c
@@ -24,10 +24,11 @@
#include "compiler.h"
#include "util/u_memory.h"
-/* Routines for liveness analysis */
+/* Routines for liveness analysis. Liveness is tracked per byte per node. Per
+ * byte granularity is necessary for proper handling of int8 */
static void
-liveness_gen(uint8_t *live, unsigned node, unsigned max, unsigned mask)
+liveness_gen(uint16_t *live, unsigned node, unsigned max, uint16_t mask)
{
if (node >= max)
return;
@@ -36,7 +37,7 @@ liveness_gen(uint8_t *live, unsigned node, unsigned max, unsigned mask)
}
static void
-liveness_kill(uint8_t *live, unsigned node, unsigned max, unsigned mask)
+liveness_kill(uint16_t *live, unsigned node, unsigned max, uint16_t mask)
{
if (node >= max)
return;
@@ -45,7 +46,7 @@ liveness_kill(uint8_t *live, unsigned node, unsigned max, unsigned mask)
}
static bool
-liveness_get(uint8_t *live, unsigned node, unsigned max) {
+liveness_get(uint16_t *live, unsigned node, uint16_t max) {
if (node >= max)
return false;
@@ -55,7 +56,7 @@ liveness_get(uint8_t *live, unsigned node, unsigned max) {
/* Updates live_in for a single instruction */
void
-mir_liveness_ins_update(uint8_t *live, midgard_instruction *ins, unsigned max)
+mir_liveness_ins_update(uint16_t *live, midgard_instruction *ins, unsigned max)
{
/* live_in[s] = GEN[s] + (live_out[s] - KILL[s]) */
@@ -91,7 +92,7 @@ liveness_block_update(compiler_context *ctx, midgard_block *blk)
liveness_block_live_out(ctx, blk);
- uint8_t *live = mem_dup(blk->live_out, ctx->temp_count);
+ uint16_t *live = mem_dup(blk->live_out, ctx->temp_count * sizeof(uint16_t));
mir_foreach_instr_in_block_rev(blk, ins)
mir_liveness_ins_update(live, ins, ctx->temp_count);
@@ -130,8 +131,8 @@ mir_compute_liveness(compiler_context *ctx)
/* Allocate */
mir_foreach_block(ctx, block) {
- block->live_in = calloc(ctx->temp_count, 1);
- block->live_out = calloc(ctx->temp_count, 1);
+ block->live_in = calloc(ctx->temp_count, sizeof(uint16_t));
+ block->live_out = calloc(ctx->temp_count, sizeof(uint16_t));
}
/* Initialize the work list with the exit block */
diff --git a/src/panfrost/midgard/midgard_ra.c b/src/panfrost/midgard/midgard_ra.c
index afee5b82745..199e9ef076e 100644
--- a/src/panfrost/midgard/midgard_ra.c
+++ b/src/panfrost/midgard/midgard_ra.c
@@ -554,7 +554,7 @@ mir_compute_interference(
* end of each block and walk the block backwards. */
mir_foreach_block(ctx, blk) {
- uint8_t *live = mem_dup(blk->live_out, ctx->temp_count * sizeof(uint8_t));
+ uint16_t *live = mem_dup(blk->live_out, ctx->temp_count * sizeof(uint16_t));
mir_foreach_instr_in_block_rev(blk, ins) {
/* Mark all registers live after the instruction as
More information about the mesa-commit
mailing list