lima: re-run nir_opt_algebraic after int lowering
authorErico Nunes <nunes.erico@gmail.com>
Sun, 4 Aug 2019 21:43:44 +0000 (23:43 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Mon, 5 Aug 2019 21:36:35 +0000 (23:36 +0200)
nir_lower_int_to_float is currently only meant to run once, and some ops
must be lowered after being converted from int ops to be implementable,
so re-run nir_opt_algebraic after lowering ints to floats.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
src/gallium/drivers/lima/lima_program.c

index 13fd31166aea13ca211c49cb939296ad36f6f25e..66962e5ce238d9f5ce8a6093e9571089d2476210 100644 (file)
@@ -128,6 +128,14 @@ lima_program_optimize_vs_nir(struct nir_shader *s)
 
    NIR_PASS_V(s, nir_lower_int_to_float);
    NIR_PASS_V(s, nir_lower_bool_to_float);
+
+   /* Some ops must be lowered after being converted from int ops,
+    * so re-run nir_opt_algebraic after int lowering. */
+   do {
+      progress = false;
+      NIR_PASS(progress, s, nir_opt_algebraic);
+   } while (progress);
+
    NIR_PASS_V(s, nir_copy_prop);
    NIR_PASS_V(s, nir_opt_dce);
    NIR_PASS_V(s, nir_lower_locals_to_regs);
@@ -179,6 +187,13 @@ lima_program_optimize_fs_nir(struct nir_shader *s)
    NIR_PASS_V(s, nir_lower_int_to_float);
    NIR_PASS_V(s, nir_lower_bool_to_float);
 
+   /* Some ops must be lowered after being converted from int ops,
+    * so re-run nir_opt_algebraic after int lowering. */
+   do {
+      progress = false;
+      NIR_PASS(progress, s, nir_opt_algebraic);
+   } while (progress);
+
    /* Lower modifiers */
    NIR_PASS_V(s, nir_lower_to_source_mods, nir_lower_all_source_mods);
    NIR_PASS_V(s, nir_copy_prop);