From: Samuel Pitoiset Date: Sun, 18 Sep 2016 10:33:12 +0000 (+0200) Subject: nv50/ir: optimize SUB(a, b) to MOV(a - b) X-Git-Tag: upstream/17.1.0~6260 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=557a29b51fa3324cfbeecff100a54c7c6a6d87cd;p=platform%2Fupstream%2Fmesa.git nv50/ir: optimize SUB(a, b) to MOV(a - b) This helps shaders in UE4 demos, especially with Elemental (+1% perf). This optimization reduces spilling usage in one shader which explains the little gain. GF100/GK104: total instructions in shared programs :2838551 -> 2838045 (-0.02%) total gprs used in shared programs :396706 -> 396684 (-0.01%) total local used in shared programs :34432 -> 34416 (-0.05%) local gpr inst bytes helped 1 19 112 112 hurt 0 0 0 0 Signed-off-by: Samuel Pitoiset Reviewed-by: Ilia Mirkin --- diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index a9172f8..74a5a85 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -576,6 +576,16 @@ ConstantFolding::expr(Instruction *i, return; } break; + case OP_SUB: + switch (i->dType) { + case TYPE_F32: res.data.f32 = a->data.f32 - b->data.f32; break; + case TYPE_F64: res.data.f64 = a->data.f64 - b->data.f64; break; + case TYPE_S32: + case TYPE_U32: res.data.u32 = a->data.u32 - b->data.u32; break; + default: + return; + } + break; case OP_POW: switch (i->dType) { case TYPE_F32: res.data.f32 = pow(a->data.f32, b->data.f32); break;