[Mesa-dev] [PATCH 3/5] glsl: Consolidate duplicate copies of constant folding.
Kenneth Graunke
kenneth at whitecape.org
Mon May 9 06:50:12 UTC 2016
We could probably clean this up more (maybe make it a method), but at
least there's only one copy of this code now, and that's a start.
No change in shader-db.
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/compiler/glsl/ir_optimization.h | 2 ++
src/compiler/glsl/opt_constant_folding.cpp | 20 ++++++++++++------
src/compiler/glsl/opt_constant_propagation.cpp | 29 +++-----------------------
3 files changed, 19 insertions(+), 32 deletions(-)
diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h
index f9599a3..5fc2740 100644
--- a/src/compiler/glsl/ir_optimization.h
+++ b/src/compiler/glsl/ir_optimization.h
@@ -73,6 +73,8 @@ bool do_common_optimization(exec_list *ir, bool linked,
const struct gl_shader_compiler_options *options,
bool native_integers);
+bool ir_constant_fold(ir_rvalue **rvalue);
+
bool do_rebalance_tree(exec_list *instructions);
bool do_algebraic(exec_list *instructions, bool native_integers,
const struct gl_shader_compiler_options *options);
diff --git a/src/compiler/glsl/opt_constant_folding.cpp b/src/compiler/glsl/opt_constant_folding.cpp
index de13c9e..0ea53a5 100644
--- a/src/compiler/glsl/opt_constant_folding.cpp
+++ b/src/compiler/glsl/opt_constant_folding.cpp
@@ -61,11 +61,11 @@ public:
} /* unnamed namespace */
-void
-ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
+bool
+ir_constant_fold(ir_rvalue **rvalue)
{
if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
- return;
+ return false;
/* Note that we do rvalue visitoring on leaving. So if an
* expression has a non-constant operand, no need to go looking
@@ -76,20 +76,28 @@ ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
if (expr) {
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
if (!expr->operands[i]->as_constant())
- return;
+ return false;
}
}
/* Ditto for swizzles. */
ir_swizzle *swiz = (*rvalue)->as_swizzle();
if (swiz && !swiz->val->as_constant())
- return;
+ return false;
ir_constant *constant = (*rvalue)->constant_expression_value();
if (constant) {
*rvalue = constant;
- this->progress = true;
+ return true;
}
+ return false;
+}
+
+void
+ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
+{
+ if (ir_constant_fold(rvalue))
+ this->progress = true;
}
ir_visitor_status
diff --git a/src/compiler/glsl/opt_constant_propagation.cpp b/src/compiler/glsl/opt_constant_propagation.cpp
index 4764d16..4b82bd1 100644
--- a/src/compiler/glsl/opt_constant_propagation.cpp
+++ b/src/compiler/glsl/opt_constant_propagation.cpp
@@ -136,33 +136,10 @@ public:
void
-ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue) {
-
- if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
- return;
-
- /* Note that we visit rvalues one leaving. So if an expression has a
- * non-constant operand, no need to go looking down it to find if it's
- * constant. This cuts the time of this pass down drastically.
- */
- ir_expression *expr = (*rvalue)->as_expression();
- if (expr) {
- for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
- if (!expr->operands[i]->as_constant())
- return;
- }
- }
-
- /* Ditto for swizzles. */
- ir_swizzle *swiz = (*rvalue)->as_swizzle();
- if (swiz && !swiz->val->as_constant())
- return;
-
- ir_constant *constant = (*rvalue)->constant_expression_value();
- if (constant) {
- *rvalue = constant;
+ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue)
+{
+ if (ir_constant_fold(rvalue))
this->progress = true;
- }
}
void
--
2.8.2
More information about the mesa-dev
mailing list