pan/bi: Add `soft` NIR->BIR condition translation
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 21 Mar 2020 22:12:31 +0000 (18:12 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:35 +0000 (03:32 +0000)
We would like to use this routine opportunistically when fusing
conditions into csels and branches, so let's add a mode where we don't
abort.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4276>

src/panfrost/bifrost/bifrost_compile.c

index 43b44314fece2d93a1e49a49a40c9237b40f7af9..5d7604ecad356dc843e204fa061aec50fd7a791d 100644 (file)
@@ -411,8 +411,13 @@ bi_class_for_nir_alu(nir_op op)
         }
 }
 
+/* Gets a bi_cond for a given NIR comparison opcode. In soft mode, it will
+ * return BI_COND_ALWAYS as a sentinel if it fails to do so (when used for
+ * optimizations). Otherwise it will bail (when used for primary code
+ * generation). */
+
 static enum bi_cond
-bi_cond_for_nir(nir_op op)
+bi_cond_for_nir(nir_op op, bool soft)
 {
         switch (op) {
         BI_CASE_CMP(nir_op_flt)
@@ -431,7 +436,10 @@ bi_cond_for_nir(nir_op op)
         BI_CASE_CMP(nir_op_ine)
                 return BI_COND_NE;
         default:
-                unreachable("Invalid compare");
+                if (soft)
+                        return BI_COND_ALWAYS;
+                else
+                        unreachable("Invalid compare");
         }
 }
 
@@ -541,7 +549,7 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
         BI_CASE_CMP(nir_op_ieq)
         BI_CASE_CMP(nir_op_fne)
         BI_CASE_CMP(nir_op_ine)
-                alu.op.compare = bi_cond_for_nir(instr->op);
+                alu.op.compare = bi_cond_for_nir(instr->op, false);
                 break;
         default:
                 break;