[Mesa-dev] [PATCH] glsl: Optimize logic operation A || (A && B) v2
thomashelland90 at gmail.com
thomashelland90 at gmail.com
Sat Jul 12 07:16:23 PDT 2014
From: Thomas Helland <thomashelland90 at gmail.com>
Let's cut the needless A && B here.
Gives some effect on a clean shader-db with
some extra shaders from TF2 and portal.
helped: shaders/tf2/2042.shader_test fs16: 23 -> 21 (-8.70%)
helped: shaders/tf2/2042.shader_test fs8: 23 -> 21 (-8.70%)
helped: shaders/tf2/4624.shader_test fs16: 21 -> 19 (-9.52%)
helped: shaders/tf2/4624.shader_test fs8: 21 -> 19 (-9.52%)
helped: shaders/tf2/763.shader_test fs16: 23 -> 21 (-8.70%)
helped: shaders/tf2/763.shader_test fs8: 23 -> 21 (-8.70%)
HURT: shaders/orbital_explorer.shader_test vs: 1049 -> 1052 (0.29%)
total instructions in shared programs: 758979 -> 758970 (-0.00%)
instructions in affected programs: 1183 -> 1174 (-0.76%)
GAINED: 0
LOST: 0
v1 -> v2: Correct the comments, return A instead of A && B
Interestingly, returning A instead of A && B does not improve
the results in shader-db like I would've expected.
I would've expected it to cut of another instruction or so.
Signed-off-by: Thomas Helland <thomashelland90 at gmail.com>
---
src/glsl/opt_algebraic.cpp | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index ac7514a..fe7166d 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -588,7 +588,18 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
} else if (ir->operands[0]->equals(ir->operands[1])) {
/* (a || a) == a */
return ir->operands[0];
+ } else if (op_expr[0] && op_expr[0]->operation == ir_binop_logic_and &&
+ (op_expr[0]->operands[0]->equals(op_expr[1]) ||
+ op_expr[0]->operands[1]->equals(op_expr[1]))) {
+ /* (A && B) || A == A or (B && A) || A == A */
+ return ir->operands[1];
+ } else if (op_expr[1] && op_expr[1]->operation == ir_binop_logic_and &&
+ (op_expr[1]->operands[0]->equals(op_expr[0]) ||
+ op_expr[1]->operands[1]->equals(op_expr[0]))) {
+ /* A || (A && B) == A or A || (B && A) == A */
+ return ir->operands[0];
}
+
break;
case ir_binop_pow:
--
2.0.0
More information about the mesa-dev
mailing list