[Mesa-dev] [PATCH] i965/fs_nir: Put the immediate in src1 for commutative ALU ops
Jason Ekstrand
jason at jlekstrand.net
Fri May 8 10:04:33 PDT 2015
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
More information about the mesa-dev
mailing list