Shader-db results for fragment shaders on Broadwell: total instructions in shared programs: 4310987 -> 4310663 (-0.01%) instructions in affected programs: 43242 -> 42918 (-0.75%) helped: 142 HURT: 0
Shader-db results for vertex shaders on Broadwell: total instructions in shared programs: 2889581 -> 2844309 (-1.57%) instructions in affected programs: 1418720 -> 1373448 (-3.19%) helped: 6139 HURT: 0 --- src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 555987d..161a262 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -21,6 +21,8 @@ * IN THE SOFTWARE. */ +#include <algorithm> + #include "glsl/ir.h" #include "glsl/ir_optimization.h" #include "glsl/nir/glsl_to_nir.h" @@ -662,6 +664,16 @@ fs_visitor::nir_emit_alu(nir_alu_instr *instr) op[i] = offset(op[i], instr->src[i].swizzle[channel]); } + /* Immediates can only be used as the second source of two-source + * instructions. We have code in opt_algebraic to flip them as needed + * for most instructions. However, it doesn't hurt anything to just do + * the right thing if we can detect it at the NIR level. + */ + if ((nir_op_infos[instr->op].algebraic_properties & NIR_OP_IS_COMMUTATIVE) && + nir_src_as_const_value(instr->src[0].src)) { + std::swap(op[0], op[1]); + } + switch (instr->op) { case nir_op_i2f: case nir_op_u2f: -- 2.4.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev