freedreno/ir3/ra: add helper to map name to array
authorRob Clark <robdclark@chromium.org>
Sat, 21 Mar 2020 18:25:36 +0000 (11:25 -0700)
committerMarge Bot <eric+marge@anholt.net>
Fri, 27 Mar 2020 22:41:36 +0000 (22:41 +0000)
For vreg names that refer to arrays rather than SSA values, this is the
counterpart to name_to_instr().

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4272>

src/freedreno/ir3/ir3_ra.c

index df5f115c0b3b104fceadbc704e9e71659d30f345..ccba90be55294fd0a6a8736bdf68e4b7de11d826 100644 (file)
 
 static struct ir3_instruction * name_to_instr(struct ir3_ra_ctx *ctx, unsigned name);
 
+static bool name_is_array(struct ir3_ra_ctx *ctx, unsigned name);
+static struct ir3_array * name_to_array(struct ir3_ra_ctx *ctx, unsigned name);
+
 /* does it conflict? */
 static inline bool
 intersects(unsigned a_start, unsigned a_end, unsigned b_start, unsigned b_end)
@@ -500,10 +503,30 @@ ra_init(struct ir3_ra_ctx *ctx)
 static struct ir3_instruction *
 name_to_instr(struct ir3_ra_ctx *ctx, unsigned name)
 {
+       assert(!name_is_array(ctx, name));
        struct hash_entry *entry = _mesa_hash_table_search(ctx->name_to_instr, &name);
        if (entry)
                return entry->data;
-       unreachable("invalid name");
+       unreachable("invalid instr name");
+       return NULL;
+}
+
+static bool
+name_is_array(struct ir3_ra_ctx *ctx, unsigned name)
+{
+       return name >= ctx->class_base[total_class_count];
+}
+
+static struct ir3_array *
+name_to_array(struct ir3_ra_ctx *ctx, unsigned name)
+{
+       assert(name_is_array(ctx, name));
+       foreach_array (arr, &ctx->ir->array_list) {
+               unsigned sz = reg_size_for_array(arr);
+               if (name < (arr->base + sz))
+                       return arr;
+       }
+       unreachable("invalid array name");
        return NULL;
 }