glsl: Consolidate duplicate copies of constant folding.
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@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -73,6 +73,8 @@ bool do_common_optimization(exec_list *ir, bool linked,
|
|||||||
const struct gl_shader_compiler_options *options,
|
const struct gl_shader_compiler_options *options,
|
||||||
bool native_integers);
|
bool native_integers);
|
||||||
|
|
||||||
|
bool ir_constant_fold(ir_rvalue **rvalue);
|
||||||
|
|
||||||
bool do_rebalance_tree(exec_list *instructions);
|
bool do_rebalance_tree(exec_list *instructions);
|
||||||
bool do_algebraic(exec_list *instructions, bool native_integers,
|
bool do_algebraic(exec_list *instructions, bool native_integers,
|
||||||
const struct gl_shader_compiler_options *options);
|
const struct gl_shader_compiler_options *options);
|
||||||
|
@@ -61,11 +61,11 @@ public:
|
|||||||
|
|
||||||
} /* unnamed namespace */
|
} /* unnamed namespace */
|
||||||
|
|
||||||
void
|
bool
|
||||||
ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
|
ir_constant_fold(ir_rvalue **rvalue)
|
||||||
{
|
{
|
||||||
if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
|
if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
/* Note that we do rvalue visitoring on leaving. So if an
|
/* Note that we do rvalue visitoring on leaving. So if an
|
||||||
* expression has a non-constant operand, no need to go looking
|
* 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) {
|
if (expr) {
|
||||||
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
|
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
|
||||||
if (!expr->operands[i]->as_constant())
|
if (!expr->operands[i]->as_constant())
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ditto for swizzles. */
|
/* Ditto for swizzles. */
|
||||||
ir_swizzle *swiz = (*rvalue)->as_swizzle();
|
ir_swizzle *swiz = (*rvalue)->as_swizzle();
|
||||||
if (swiz && !swiz->val->as_constant())
|
if (swiz && !swiz->val->as_constant())
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
ir_constant *constant = (*rvalue)->constant_expression_value();
|
ir_constant *constant = (*rvalue)->constant_expression_value();
|
||||||
if (constant) {
|
if (constant) {
|
||||||
*rvalue = 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
|
ir_visitor_status
|
||||||
|
@@ -136,34 +136,11 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue) {
|
ir_constant_propagation_visitor::constant_folding(ir_rvalue **rvalue)
|
||||||
|
{
|
||||||
if (*rvalue == NULL || (*rvalue)->ir_type == ir_type_constant)
|
if (ir_constant_fold(rvalue))
|
||||||
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;
|
|
||||||
this->progress = true;
|
this->progress = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ir_constant_propagation_visitor::constant_propagation(ir_rvalue **rvalue) {
|
ir_constant_propagation_visitor::constant_propagation(ir_rvalue **rvalue) {
|
||||||
|
Reference in New Issue
Block a user