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:
Kenneth Graunke
2016-04-29 14:40:26 -07:00
parent 3bf27a9a00
commit 329fe93210
3 changed files with 19 additions and 32 deletions

View File

@@ -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