agx: Refactor expressions in agx_nir_lower_address
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sun, 28 May 2023 01:51:00 +0000 (21:51 -0400)
committerMarge Bot <emma+marge@anholt.net>
Fri, 9 Jun 2023 12:06:00 +0000 (12:06 +0000)
So we can add more instructions without duplication.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23529>

src/asahi/compiler/agx_nir_lower_address.c

index f5dddf6..a6980ff 100644 (file)
@@ -293,28 +293,31 @@ pass(struct nir_builder *b, nir_instr *instr, UNUSED void *data)
    assert(match.shift >= 0);
    nir_ssa_def *new_base = nir_channel(b, match.base.def, match.base.comp);
 
+   nir_ssa_def *repl = NULL;
+   bool has_dest = (intr->intrinsic != nir_intrinsic_store_global);
+   unsigned num_components = has_dest ? nir_dest_num_components(intr->dest) : 0;
+   unsigned bit_size = has_dest ? nir_dest_bit_size(intr->dest) : 0;
+
    if (intr->intrinsic == nir_intrinsic_load_global) {
-      nir_ssa_def *repl =
-         nir_load_agx(b, nir_dest_num_components(intr->dest),
-                      nir_dest_bit_size(intr->dest), new_base, offset,
+      repl =
+         nir_load_agx(b, num_components, bit_size, new_base, offset,
                       .access = nir_intrinsic_access(intr), .base = match.shift,
                       .format = format, .sign_extend = match.sign_extend);
 
-      nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
    } else if (intr->intrinsic == nir_intrinsic_load_global_constant) {
-      nir_ssa_def *repl = nir_load_constant_agx(
-         b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest),
-         new_base, offset, .access = nir_intrinsic_access(intr),
-         .base = match.shift, .format = format,
-         .sign_extend = match.sign_extend);
-
-      nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
+      repl = nir_load_constant_agx(b, num_components, bit_size, new_base,
+                                   offset, .access = nir_intrinsic_access(intr),
+                                   .base = match.shift, .format = format,
+                                   .sign_extend = match.sign_extend);
    } else {
       nir_store_agx(b, intr->src[0].ssa, new_base, offset,
                     .access = nir_intrinsic_access(intr), .base = match.shift,
                     .format = format, .sign_extend = match.sign_extend);
    }
 
+   if (repl)
+      nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
+
    nir_instr_remove(instr);
    return true;
 }