Blob Blame History Raw
From c59f3601b81bf38cbb7a2b77820f1d827f608339 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Thu, 21 Dec 2023 10:39:08 +1000
Subject: [PATCH] intel/compiler: reemit boolean resolve for inverted if on
 gen5

Gen5 adds some boolean conversion instructions after nir emits,
but that nir srcs don't line up with them, so reemit the boolean
conversion if we reemit the inot.

Fixes: 31b5f5a51f3a ("nir/opt_if: Simplify if's with general conditions")
---
 src/intel/compiler/brw_fs_nir.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp
index b9f7366763b..5a4ec96e93f 100644
--- a/src/intel/compiler/brw_fs_nir.cpp
+++ b/src/intel/compiler/brw_fs_nir.cpp
@@ -361,6 +361,14 @@ fs_visitor::nir_emit_if(nir_if *if_stmt)
       invert = true;
       cond_reg = get_nir_src(cond->src[0].src);
       cond_reg = offset(cond_reg, bld, cond->src[0].swizzle[0]);
+
+      if (devinfo->ver <= 5) {
+         /* redo boolean resolve on gen5 */
+         fs_reg masked = bld.vgrf(BRW_REGISTER_TYPE_D);
+         bld.AND(masked, cond_reg, brw_imm_d(1));
+         masked.negate = true;
+         bld.MOV(retype(cond_reg, BRW_REGISTER_TYPE_D), masked);
+      }
    } else {
       invert = false;
       cond_reg = get_nir_src(if_stmt->condition);
-- 
2.43.0