From fb3ca9109cba6d814c2e3843e256b298cfd73661 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 12 Dec 2018 18:14:34 -0800 Subject: [PATCH] intel/fs: Handle OR source modifiers in algebraic optimization Found by inspection. Reviewed-by: Kenneth Graunke --- src/intel/compiler/brw_fs.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 470c02145f6..c4c800c6c22 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -2596,7 +2596,16 @@ fs_visitor::opt_algebraic() case BRW_OPCODE_OR: if (inst->src[0].equals(inst->src[1]) || inst->src[1].is_zero()) { - inst->opcode = BRW_OPCODE_MOV; + /* On Gen8+, the OR instruction can have a source modifier that + * performs logical not on the operand. Cases of 'OR r0, ~r1, 0' + * or 'OR r0, ~r1, ~r1' should become a NOT instead of a MOV. + */ + if (inst->src[0].negate) { + inst->opcode = BRW_OPCODE_NOT; + inst->src[0].negate = false; + } else { + inst->opcode = BRW_OPCODE_MOV; + } inst->src[1] = reg_undef; progress = true; break; -- 2.30.2