Mesa (main): lima: Use ra_alloc_contig_reg_class().

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 4 19:32:16 UTC 2021


Module: Mesa
Branch: main
Commit: 23df5dba92ae679b508dc3b6ccf11fc1f0144edc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=23df5dba92ae679b508dc3b6ccf11fc1f0144edc

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Mar  5 10:37:20 2021 -0800

lima: Use ra_alloc_contig_reg_class().

This greatly simplifies our register allocation code and reduces the
number of registers RA has to walk over.

Reviewed-by: Erico Nunes <nunes.erico at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9437>

---

 src/gallium/drivers/lima/ir/pp/regalloc.c | 107 +++++-------------------------
 1 file changed, 16 insertions(+), 91 deletions(-)

diff --git a/src/gallium/drivers/lima/ir/pp/regalloc.c b/src/gallium/drivers/lima/ir/pp/regalloc.c
index 21829754032..3ea136b5660 100644
--- a/src/gallium/drivers/lima/ir/pp/regalloc.c
+++ b/src/gallium/drivers/lima/ir/pp/regalloc.c
@@ -29,26 +29,7 @@
 #include "ppir.h"
 #include "lima_context.h"
 
-#define PPIR_FULL_REG_NUM  6
-
-#define PPIR_VEC1_REG_NUM       (PPIR_FULL_REG_NUM * 4) /* x, y, z, w */
-#define PPIR_VEC2_REG_NUM       (PPIR_FULL_REG_NUM * 3) /* xy, yz, zw */
-#define PPIR_VEC3_REG_NUM       (PPIR_FULL_REG_NUM * 2) /* xyz, yzw */
-#define PPIR_VEC4_REG_NUM       PPIR_FULL_REG_NUM       /* xyzw */
-#define PPIR_HEAD_VEC1_REG_NUM  PPIR_FULL_REG_NUM       /* x */
-#define PPIR_HEAD_VEC2_REG_NUM  PPIR_FULL_REG_NUM       /* xy */
-#define PPIR_HEAD_VEC3_REG_NUM  PPIR_FULL_REG_NUM       /* xyz */
-#define PPIR_HEAD_VEC4_REG_NUM  PPIR_FULL_REG_NUM       /* xyzw */
-
-#define PPIR_VEC1_REG_BASE       0
-#define PPIR_VEC2_REG_BASE       (PPIR_VEC1_REG_BASE + PPIR_VEC1_REG_NUM)
-#define PPIR_VEC3_REG_BASE       (PPIR_VEC2_REG_BASE + PPIR_VEC2_REG_NUM)
-#define PPIR_VEC4_REG_BASE       (PPIR_VEC3_REG_BASE + PPIR_VEC3_REG_NUM)
-#define PPIR_HEAD_VEC1_REG_BASE  (PPIR_VEC4_REG_BASE + PPIR_VEC4_REG_NUM)
-#define PPIR_HEAD_VEC2_REG_BASE  (PPIR_HEAD_VEC1_REG_BASE + PPIR_HEAD_VEC1_REG_NUM)
-#define PPIR_HEAD_VEC3_REG_BASE  (PPIR_HEAD_VEC2_REG_BASE + PPIR_HEAD_VEC2_REG_NUM)
-#define PPIR_HEAD_VEC4_REG_BASE  (PPIR_HEAD_VEC3_REG_BASE + PPIR_HEAD_VEC3_REG_NUM)
-#define PPIR_REG_COUNT           (PPIR_HEAD_VEC4_REG_BASE + PPIR_HEAD_VEC4_REG_NUM)
+#define PPIR_REG_COUNT  (6 * 4)
 
 enum ppir_ra_reg_class {
    ppir_ra_reg_class_vec1,
@@ -68,70 +49,32 @@ enum ppir_ra_reg_class {
    ppir_ra_reg_class_num,
 };
 
-static const int ppir_ra_reg_base[ppir_ra_reg_class_num + 1] = {
-   [ppir_ra_reg_class_vec1]       = PPIR_VEC1_REG_BASE,
-   [ppir_ra_reg_class_vec2]       = PPIR_VEC2_REG_BASE,
-   [ppir_ra_reg_class_vec3]       = PPIR_VEC3_REG_BASE,
-   [ppir_ra_reg_class_vec4]       = PPIR_VEC4_REG_BASE,
-   [ppir_ra_reg_class_head_vec1]  = PPIR_HEAD_VEC1_REG_BASE,
-   [ppir_ra_reg_class_head_vec2]  = PPIR_HEAD_VEC2_REG_BASE,
-   [ppir_ra_reg_class_head_vec3]  = PPIR_HEAD_VEC3_REG_BASE,
-   [ppir_ra_reg_class_head_vec4]  = PPIR_HEAD_VEC4_REG_BASE,
-   [ppir_ra_reg_class_num]        = PPIR_REG_COUNT,
-};
-
-static unsigned int *
-ppir_ra_reg_q_values[ppir_ra_reg_class_num] = {
-   (unsigned int []) {1, 2, 3, 4, 1, 2, 3, 4},
-   (unsigned int []) {2, 3, 3, 3, 1, 2, 3, 3},
-   (unsigned int []) {2, 2, 2, 2, 1, 2, 2, 2},
-   (unsigned int []) {1, 1, 1, 1, 1, 1, 1, 1},
-   (unsigned int []) {1, 1, 1, 1, 1, 1, 1, 1},
-   (unsigned int []) {1, 1, 1, 1, 1, 1, 1, 1},
-   (unsigned int []) {1, 1, 1, 1, 1, 1, 1, 1},
-   (unsigned int []) {1, 1, 1, 1, 1, 1, 1, 1},
-};
-
 struct ra_regs *ppir_regalloc_init(void *mem_ctx)
 {
    struct ra_regs *ret = ra_alloc_reg_set(mem_ctx, PPIR_REG_COUNT, false);
    if (!ret)
       return NULL;
 
-   /* (x, y, z, w) (xy, yz, zw) (xyz, yzw) (xyzw) (x) (xy) (xyz) (xyzw) */
-   static const int class_reg_num[ppir_ra_reg_class_num] = {
-      4, 3, 2, 1, 1, 1, 1, 1,
-   };
-   /* base reg (x, y, z, w) confliction with other regs */
-   for (int h = 0; h < 4; h++) {
-      int base_reg_mask = 1 << h;
-      for (int i = 1; i < ppir_ra_reg_class_num; i++) {
-         int class_reg_base_mask = (1 << ((i % 4) + 1)) - 1;
-         for (int j = 0; j < class_reg_num[i]; j++) {
-            if (base_reg_mask & (class_reg_base_mask << j)) {
-               for (int k = 0; k < PPIR_FULL_REG_NUM; k++) {
-                  ra_add_reg_conflict(ret, k * 4 + h,
-                     ppir_ra_reg_base[i] + k * class_reg_num[i] + j);
-               }
-            }
-         }
+   /* Classes for contiguous 1-4 channel groups anywhere within a register. */
+   struct ra_class *classes[ppir_ra_reg_class_num];
+   for (int i = 0; i < ppir_ra_reg_class_head_vec1; i++) {
+      classes[i] = ra_alloc_contig_reg_class(ret, i + 1);
+
+      for (int j = 0; j < PPIR_REG_COUNT; j += 4) {
+         for (int swiz = 0; swiz < (4 - i); swiz++)
+            ra_class_add_reg(classes[i], j + swiz);
       }
    }
-   /* build all other confliction by the base reg confliction */
-   for (int i = 0; i < PPIR_VEC1_REG_NUM; i++)
-      ra_make_reg_conflicts_transitive(ret, i);
 
-   struct ra_class *classes[ppir_ra_reg_class_num];
-   for (int i = 0; i < ppir_ra_reg_class_num; i++)
-      classes[i] = ra_alloc_reg_class(ret);
+   /* Classes for contiguous 1-4 channels with a start channel of .x */
+   for (int i = ppir_ra_reg_class_head_vec1; i < ppir_ra_reg_class_num; i++) {
+      classes[i] = ra_alloc_contig_reg_class(ret, i - ppir_ra_reg_class_head_vec1 + 1);
 
-   int reg_index = 0;
-   for (int i = 0; i < ppir_ra_reg_class_num; i++) {
-      while (reg_index < ppir_ra_reg_base[i + 1])
-         ra_class_add_reg(classes[i], reg_index++);
+      for (int j = 0; j < PPIR_REG_COUNT; j += 4)
+         ra_class_add_reg(classes[i], j);
    }
 
-   ra_set_finalize(ret, ppir_ra_reg_q_values);
+   ra_set_finalize(ret, NULL);
    return ret;
 }
 
@@ -159,23 +102,6 @@ static void ppir_regalloc_update_reglist_ssa(ppir_compiler *comp)
    }
 }
 
-static int get_phy_reg_index(int reg)
-{
-   int i;
-
-   for (i = 0; i < ppir_ra_reg_class_num; i++) {
-      if (reg < ppir_ra_reg_base[i + 1]) {
-         reg -= ppir_ra_reg_base[i];
-         break;
-      }
-   }
-
-   if (i < ppir_ra_reg_class_head_vec1)
-      return reg / (4 - i) * 4 + reg % (4 - i);
-   else
-      return reg * 4;
-}
-
 static void ppir_regalloc_print_result(ppir_compiler *comp)
 {
    printf("======ppir regalloc result======\n");
@@ -651,8 +577,7 @@ static bool ppir_regalloc_prog_try(ppir_compiler *comp, bool *spilled)
 
    n = 0;
    list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
-      int reg_index = ra_get_node_reg(g, n++);
-      reg->index = get_phy_reg_index(reg_index);
+      reg->index = ra_get_node_reg(g, n++);
    }
 
    ralloc_free(g);



More information about the mesa-commit mailing list