From a360ca7476a967d12c6622bbe4e5e65e74fccd50 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 15 Oct 2013 23:42:19 -0700 Subject: [PATCH] glsl: Optimize mul(a, -1) into neg(a). Two extra instructions in some heroesofnewerth shaders, but a win for everything else. total instructions in shared programs: 1531352 -> 1530815 (-0.04%) instructions in affected programs: 121898 -> 121361 (-0.44%) Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- src/glsl/opt_algebraic.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp index d706a6ad13c..3e5802e1818 100644 --- a/src/glsl/opt_algebraic.cpp +++ b/src/glsl/opt_algebraic.cpp @@ -84,6 +84,12 @@ is_vec_one(ir_constant *ir) return (ir == NULL) ? false : ir->is_one(); } +static inline bool +is_vec_negative_one(ir_constant *ir) +{ + return (ir == NULL) ? false : ir->is_negative_one(); +} + static inline bool is_vec_basis(ir_constant *ir) { @@ -287,6 +293,23 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir) this->progress = true; return ir_constant::zero(ir, ir->type); } + if (is_vec_negative_one(op_const[0])) { + this->progress = true; + temp = new(mem_ctx) ir_expression(ir_unop_neg, + ir->operands[1]->type, + ir->operands[1], + NULL); + return swizzle_if_required(ir, temp); + } + if (is_vec_negative_one(op_const[1])) { + this->progress = true; + temp = new(mem_ctx) ir_expression(ir_unop_neg, + ir->operands[0]->type, + ir->operands[0], + NULL); + return swizzle_if_required(ir, temp); + } + /* Reassociate multiplication of constants so that we can do * constant folding. -- 2.30.2