nir: Allow more than just ALU instructions in 'weak' GVN
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 17 Nov 2022 09:59:37 +0000 (01:59 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 14 Dec 2022 20:56:55 +0000 (20:56 +0000)
This removes the ALU-only restriction on the "weak" GVN introduced by
the previous commit.  This makes it slightly more aggressive, allowing
it to coalesce things like UBO loads (still within sister then/else
blocks).  This also can have surprisingly large cascading effects.

I was concerned that this might increase register pressure, but
shader-db and fossil-db show effectively no change in spills/fills,
so it seems to be fine.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19823>

src/compiler/nir/nir_opt_gcm.c

index d0cb8f9233972ae48e51cde60155f3c60a4601ea..2770fdce732ed76354c3dc499906a4913b54840e 100644 (file)
@@ -792,14 +792,11 @@ gcm_place_instr(nir_instr *instr, struct gcm_state *state)
 }
 
 /**
- * Are ALU instructions a and b both contained in the same if/else block?
+ * Are instructions a and b both contained in the same if/else block?
  */
 static bool
 weak_gvn(const nir_instr *a, const nir_instr *b)
 {
-   if (a->type != nir_instr_type_alu)
-      return false;
-
    const struct nir_cf_node *ap = a->block->cf_node.parent;
    const struct nir_cf_node *bp = b->block->cf_node.parent;
    return ap && ap == bp && ap->type == nir_cf_node_if;