[Mesa-dev] [PATCH 20/23] glsl/cse: Recognize negated expressions as common
Ian Romanick
idr at freedesktop.org
Fri Mar 20 13:58:20 PDT 2015
From: Ian Romanick <ian.d.romanick at intel.com>
For example (x * 43) and (x * -43) should be considered common.
v2: Fix a problem where the x in -x would get replaced with -x producing
-(-x). Oops.
Shader-db results:
GM45 (0x2A42):
total instructions in shared programs: 3544158 -> 3544133 (-0.00%)
instructions in affected programs: 2151 -> 2126 (-1.16%)
helped: 19
Iron Lake (0x0046):
total instructions in shared programs: 4973887 -> 4973849 (-0.00%)
instructions in affected programs: 3020 -> 2982 (-1.26%)
helped: 26
Sandy Bridge (0x0116):
total instructions in shared programs: 6799717 -> 6799682 (-0.00%)
instructions in affected programs: 2658 -> 2623 (-1.32%)
helped: 22
HURT: 6
Sandy Bridge (0x0116) NIR:
total instructions in shared programs: 6787220 -> 6787227 (0.00%)
instructions in affected programs: 1670 -> 1677 (0.42%)
helped: 11
HURT: 12
Ivy Bridge (0x0166):
total instructions in shared programs: 6274097 -> 6274041 (-0.00%)
instructions in affected programs: 3227 -> 3171 (-1.74%)
helped: 25
HURT: 5
Ivy Bridge (0x0166) NIR:
total instructions in shared programs: 6298649 -> 6298635 (-0.00%)
instructions in affected programs: 2302 -> 2288 (-0.61%)
helped: 14
HURT: 11
Haswell (0x0426):
total instructions in shared programs: 5760202 -> 5760189 (-0.00%)
instructions in affected programs: 2070 -> 2057 (-0.63%)
helped: 13
HURT: 10
Haswell (0x0426) NIR:
total instructions in shared programs: 5767149 -> 5767160 (0.00%)
instructions in affected programs: 3124 -> 3135 (0.35%)
helped: 13
HURT: 22
Broadwell (0x162E):
total instructions in shared programs: 6808264 -> 6808224 (-0.00%)
instructions in affected programs: 2931 -> 2891 (-1.36%)
helped: 32
HURT: 10
Broadwell (0x162E) NIR:
total instructions in shared programs: 6986287 -> 6986297 (0.00%)
instructions in affected programs: 2861 -> 2871 (0.35%)
helped: 8
HURT: 24
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Cc: Jason Ekstrand <jason.ekstrand at intel.com>
---
src/glsl/opt_cse.cpp | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
diff --git a/src/glsl/opt_cse.cpp b/src/glsl/opt_cse.cpp
index b0b67f4..41053fb 100644
--- a/src/glsl/opt_cse.cpp
+++ b/src/glsl/opt_cse.cpp
@@ -266,9 +266,28 @@ cse_visitor::try_cse(ir_rvalue *rvalue)
printf("\n");
}
- if (!rvalue->equals(*entry->val))
+ const bool same = rvalue->equals(*entry->val);
+ const bool negative_same = rvalue->negative_equals(*entry->val);
+
+ if (!same && !negative_same)
continue;
+ if (negative_same) {
+ /* There are two special cases to catch or an infinite optimization
+ * loop can occur. Either entry->val is the negation of rvalue
+ * (i.e., rvalue is an node in the entry->val tree) or vice-versa.
+ */
+ ir_expression *const val_expr = (*entry->val)->as_expression();
+ if (val_expr && val_expr->operation == ir_unop_neg
+ && val_expr->operands[0] == rvalue)
+ continue;
+
+ ir_expression *const rv_expr = rvalue->as_expression();
+ if (rv_expr && rv_expr->operation == ir_unop_neg
+ && rv_expr->operands[0] == *entry->val)
+ continue;
+ }
+
if (debug) {
printf("CSE: Replacing: ");
(*entry->val)->print();
@@ -316,7 +335,16 @@ cse_visitor::try_cse(ir_rvalue *rvalue)
}
/* Replace the expression in our current tree with the variable. */
- return new(rvalue) ir_dereference_variable(entry->var);
+ if (same)
+ return new(rvalue) ir_dereference_variable(entry->var);
+ else {
+ assert(negative_same);
+
+ ir_rvalue *const deref =
+ new(rvalue) ir_dereference_variable(entry->var);
+
+ return new(rvalue) ir_expression(ir_unop_neg, deref);
+ }
}
return NULL;
--
2.1.0
More information about the mesa-dev
mailing list