glsl: Drop no-op shifts involving 0.

I noticed this in a shader in Unigine Heaven that was spilling.  While it
doesn't really reduce register pressure, it shaves a few instructions
anyway (7955 -> 7882).

v2: Fix turning "0 >> x" into "x" instead of "0" (caught by Erik
    Faye-Lund).

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Eric Anholt 2013-10-21 17:01:49 -07:00
parent 3a0fdf2ab6
commit 08bf52712e

View file

@ -346,6 +346,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
}
break;
case ir_binop_rshift:
case ir_binop_lshift:
/* 0 >> x == 0 */
if (is_vec_zero(op_const[0]))
return ir->operands[0];
/* x >> 0 == x */
if (is_vec_zero(op_const[1]))
return ir->operands[0];
break;
case ir_binop_logic_and:
/* FINISHME: Also simplify (a && a) to (a). */
if (is_vec_one(op_const[0])) {