mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
nv50/ir: optimize shl + and
Address loading can often end up as shl + shr + shl combinations. The
latter two are equal shifts, which get converted into an and mask.
However if the previous shl is more than the mask is trying to remove
(in terms of low bits), we can just remove the and entirely. This
reduces some large shaders by as many as 3% of instructions (out of 2K).
total instructions in shared programs : 6495509 -> 6491076 (-0.07%)
total gprs used in shared programs : 954621 -> 954623 (0.00%)
local gpr inst bytes
helped 0 0 1014 1014
hurt 0 2 0 0
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
5ba380c226
commit
19963231a3
1 changed files with 11 additions and 0 deletions
|
|
@ -1260,6 +1260,17 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
|
|||
i->op = OP_EXTBF;
|
||||
i->setSrc(0, src->getSrc(0));
|
||||
i->setSrc(1, new_ImmediateValue(prog, ext));
|
||||
} else if (src->op == OP_SHL &&
|
||||
src->src(1).getImmediate(imm1) &&
|
||||
i->src(t).mod == Modifier(0) &&
|
||||
util_is_power_of_two(~imm0.reg.data.u32 + 1) &&
|
||||
util_last_bit(~imm0.reg.data.u32) <= imm1.reg.data.u32) {
|
||||
i->op = OP_MOV;
|
||||
i->setSrc(s, NULL);
|
||||
if (t) {
|
||||
i->setSrc(0, i->getSrc(t));
|
||||
i->setSrc(t, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue