gallivm/nir: Call nir_lower_bool_to_int32 after nir_opt_algebraic_late
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 9 Feb 2022 01:53:02 +0000 (17:53 -0800)
committerMarge Bot <emma+marge@anholt.net>
Thu, 10 Feb 2022 03:12:46 +0000 (03:12 +0000)
All of the opcodes in nir_opt_algebraic_late are the unsized (1-bit)
versions.  If the lowering to int32 happens first, many of the
optimizations and lowerings won't happen.

Of particular importance is the lowering of fisfinite.  If a shader
happens to contain fisfinite of an fp16 value, it will assert later
during compliation.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Fixes: 78b4e417d44 ("gallivm: handle fisfinite/fisnormal")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14942>

src/gallium/auxiliary/gallivm/lp_bld_nir.c

index 6dbb840..2538bf3 100644 (file)
@@ -733,8 +733,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
       break;
    }
    case nir_op_fisfinite32:
-      result = lp_build_isfinite(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
-      break;
+      unreachable("Should have been lowered in nir_opt_algebraic_late.");
    case nir_op_flog2:
       result = lp_build_log2_safe(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
       break;
@@ -2479,7 +2478,6 @@ void lp_build_opt_nir(struct nir_shader *nir)
       NIR_PASS_V(nir, nir_lower_subgroups, &subgroups_options);
 
    } while (progress);
-   nir_lower_bool_to_int32(nir);
 
    do {
       progress = false;
@@ -2490,4 +2488,9 @@ void lp_build_opt_nir(struct nir_shader *nir)
          NIR_PASS_V(nir, nir_opt_cse);
       }
    } while (progress);
+
+   if (nir_lower_bool_to_int32(nir)) {
+      NIR_PASS_V(nir, nir_copy_prop);
+      NIR_PASS_V(nir, nir_opt_dce);
+   }
 }