agx: Mark sources that kill
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sat, 19 Jun 2021 17:56:28 +0000 (13:56 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 5 Jul 2021 20:56:04 +0000 (20:56 +0000)
Trivially computed during liveness analysis (already a byproduct!) and required
for efficient register allocation.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11718>

src/asahi/compiler/agx_compiler.h
src/asahi/compiler/agx_liveness.c
src/asahi/compiler/agx_print.c

index 5a396b1..72bf9c6 100644 (file)
@@ -59,7 +59,12 @@ enum agx_size {
 
 typedef struct {
    /* Sufficient for as many SSA values as we need. Immediates and uniforms fit in 16-bits */
-   unsigned value : 23;
+   unsigned value : 22;
+
+   /* Indicates that this source kills the referenced value (because it is the
+    * last use in a block and the source is not live after the block). Set by
+    * liveness analysis. */
+   bool kill : 1;
 
    /* Cache hints */
    bool cache : 1;
index d309b0c..0767f06 100644 (file)
@@ -42,8 +42,12 @@ agx_liveness_ins_update(BITSET_WORD *live, agx_instr *I)
    }
 
    agx_foreach_src(I, s) {
-      if (I->src[s].type == AGX_INDEX_NORMAL)
+      if (I->src[s].type == AGX_INDEX_NORMAL) {
+         /* If the source is not live after this instruction, but becomes live
+          * at this instruction, this is the use that kills the source */
+         I->src[s].kill = !BITSET_TEST(live, I->src[s].value);
          BITSET_SET(live, I->src[s].value);
+      }
    }
 }
 
index 6856b87..4746009 100644 (file)
@@ -60,6 +60,9 @@ agx_print_index(agx_index index, FILE *fp)
       if (index.discard)
          fprintf(fp, "`");
 
+      if (index.kill)
+         fprintf(fp, "*");
+
       fprintf(fp, "%u", index.value);
       break;