summaryrefslogtreecommitdiffstats
path: root/src/glsl/opt_cse.cpp
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2013-10-30 23:56:18 -0700
committerEric Anholt <[email protected]>2013-11-15 11:33:07 -0800
commit8957c6b887ff09f44e7b491e7a0551e94a265b8d (patch)
tree2301a0352283077ecc0dbd87251d4f7eb4fdfbb6 /src/glsl/opt_cse.cpp
parentfc51e7ac58d7aeab0b455e9d39b6547c2b954494 (diff)
glsl: Move the CSE equality functions to the ir class.
I want to reuse them in opt_algebraic. v2: Merge in Chris Forbes's break fix. Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/glsl/opt_cse.cpp')
-rw-r--r--src/glsl/opt_cse.cpp180
1 files changed, 1 insertions, 179 deletions
diff --git a/src/glsl/opt_cse.cpp b/src/glsl/opt_cse.cpp
index c53b4c6e737..8f73940d854 100644
--- a/src/glsl/opt_cse.cpp
+++ b/src/glsl/opt_cse.cpp
@@ -243,184 +243,6 @@ is_cse_candidate(ir_rvalue *ir)
return v.ok;
}
-static bool
-equals(ir_rvalue *a, ir_rvalue *b);
-
-static bool
-equals(ir_constant *a, ir_constant *b)
-{
- if (!a || !b)
- return false;
-
- if (a->type != b->type)
- return false;
-
- for (unsigned i = 0; i < a->type->components(); i++) {
- if (a->value.u[i] != b->value.u[i])
- return false;
- }
-
- return true;
-}
-
-static bool
-equals(ir_dereference_variable *a, ir_dereference_variable *b)
-{
- if (!a || !b)
- return false;
-
- return a->var == b->var;
-}
-
-static bool
-equals(ir_dereference_array *a, ir_dereference_array *b)
-{
- if (!a || !b)
- return false;
-
- if (!equals(a->array, b->array))
- return false;
-
- if (!equals(a->array_index, b->array_index))
- return false;
-
- return true;
-}
-
-static bool
-equals(ir_swizzle *a, ir_swizzle *b)
-{
- if (!a || !b)
- return false;
-
- if (a->type != b->type)
- return false;
-
- if (a->mask.x != b->mask.x ||
- a->mask.y != b->mask.y ||
- a->mask.z != b->mask.z ||
- a->mask.w != b->mask.w) {
- return false;
- }
-
- return equals(a->val, b->val);
-}
-
-static bool
-equals(ir_texture *a, ir_texture *b)
-{
- if (!a || !b)
- return false;
-
- if (a->type != b->type)
- return false;
-
- if (a->op != b->op)
- return false;
-
- if (!equals(a->coordinate, b->coordinate))
- return false;
-
- if (!equals(a->projector, b->projector))
- return false;
-
- if (!equals(a->shadow_comparitor, b->shadow_comparitor))
- return false;
-
- if (!equals(a->offset, b->offset))
- return false;
-
- if (!equals(a->sampler, b->sampler))
- return false;
-
- switch (a->op) {
- case ir_tex:
- case ir_lod:
- case ir_query_levels:
- break;
- case ir_txb:
- if (!equals(a->lod_info.bias, b->lod_info.bias))
- return false;
- break;
- case ir_txl:
- case ir_txf:
- case ir_txs:
- if (!equals(a->lod_info.lod, b->lod_info.lod))
- return false;
- break;
- case ir_txd:
- if (!equals(a->lod_info.grad.dPdx, b->lod_info.grad.dPdx) ||
- !equals(a->lod_info.grad.dPdy, b->lod_info.grad.dPdy))
- return false;
- break;
- case ir_txf_ms:
- if (!equals(a->lod_info.sample_index, b->lod_info.sample_index))
- return false;
- break;
- case ir_tg4:
- if (!equals(a->lod_info.component, b->lod_info.component))
- return false;
- break;
- default:
- assert(!"Unrecognized texture op");
- }
-
- return true;
-}
-
-static bool
-equals(ir_expression *a, ir_expression *b)
-{
- if (!a || !b)
- return false;
-
- if (a->type != b->type)
- return false;
-
- if (a->operation != b->operation)
- return false;
-
- for (unsigned i = 0; i < a->get_num_operands(); i++) {
- if (!equals(a->operands[i], b->operands[i]))
- return false;
- }
-
- return true;
-}
-
-static bool
-equals(ir_rvalue *a, ir_rvalue *b)
-{
- if (!a || !b)
- return !a && !b;
-
- if (a->type != b->type)
- return false;
-
- switch (a->ir_type) {
- case ir_type_texture:
- return equals(a->as_texture(), b->as_texture());
-
- case ir_type_constant:
- return equals(a->as_constant(), b->as_constant());
-
- case ir_type_expression:
- return equals(a->as_expression(), b->as_expression());
-
- case ir_type_dereference_variable:
- return equals(a->as_dereference_variable(), b->as_dereference_variable());
-
- case ir_type_dereference_array:
- return equals(a->as_dereference_array(), b->as_dereference_array());
-
- case ir_type_swizzle:
- return equals(a->as_swizzle(), b->as_swizzle());
-
- default:
- return false;
- }
-}
-
/**
* Tries to find and return a reference to a previous computation of a given
* expression.
@@ -441,7 +263,7 @@ cse_visitor::try_cse(ir_rvalue *rvalue)
printf("\n");
}
- if (!equals(rvalue, *entry->val))
+ if (!rvalue->equals(*entry->val))
continue;
if (debug) {