[LLVMdev] interesting minor llvm optimizer flaw
Reed Kotler
rkotler at mips.com
Thu Oct 18 20:19:38 PDT 2012
sorry;;; original pattern was
def: Mips16Pat
<(setge CPU16Regs:$lhs, immSExt16:$rhs),
(XorRxRxRy16 (SltiCCRxImmX16 CPU16Regs:$lhs, immSExt16:$rhs),
(LiRxImmX16 1))>;
(cut and pasted immZExt16:$rhs into example accidentally)
On 10/18/2012 08:13 PM, reed kotler wrote:
> if I write:
>
> int z, x;
> ...
> z = (x >= k); -- where k is a constant
>
> The compiler always wants to translate this into:
>
> z = (x > (k-1));
>
> In general this can often lead to better code (and it does for Mips 16
> for sure), except at
> the boundary condition where k==-32768
>
> Then it creates the literal -32769 which cannot be placed in a simple
> immediate field.
> That creates a lot of extra code for Mips 16.
>
> I had originally written a pattern for setge when the right operand is a
> constant.
>
> def: Mips16Pat
> <(setge CPU16Regs:$lhs, immZExt16:$rhs),
> (XorRxRxRy16 (SltiCCRxImmX16 CPU16Regs:$lhs, immZExt16:$rhs),
> (LiRxImmX16 1))>;
>
> I was able to work around this boundary case by doing the reverse
> transformation at the boundary.
>
> i..e.
>
> z = (x > (k-1)) => z = (x >= k)
>
> def: Mips16Pat
> <(setgt CPU16Regs:$lhs, -32769),
> (XorRxRxRy16 (SltiCCRxImmX16 CPU16Regs:$lhs, -32768),
> (LiRxImmX16 1))>;
More information about the llvm-dev
mailing list