[llvm-dev] should we do this time-consuming transform in InstCombine?
Sanjay Patel via llvm-dev
llvm-dev at lists.llvm.org
Wed Dec 19 07:28:43 PST 2018
Be careful with sdiv/srem - the transform is not valid on the minval edge
cases:
https://rise4fun.com/Alive/cWl
On Tue, Dec 18, 2018 at 6:48 PM Zheng CZ Chen <czhengsz at cn.ibm.com> wrote:
> Hi Sanjay,
>
> for the original abs issue, I tested following pattern:
>
> return (a+b) >= 0 ? (a+b) : -(a+b); //works now, can be recognized as abs
> return (a+b) >= 0 ? (a+b) : -a-b; //works now
>
> return (a-b) >= 0 ? (a-b) : -(a-b); //works now
> return (a-b) >= 0 ? (a-b) : -a+b; //works now
>
> return (a*b) >= 0 ? (a*b) : -(a*b); //works now
> *return (a-b) >= 0 ? (a*b) : -a*b; //doesn't work*
>
> return (a/b) >= 0 ? (a/b) : -(a/b); //works now
> *return (a/b) >= 0 ? (a/b) : -a/b; //doesn't work*
>
> *return (a%b) >= 0 ? (a%b) : -a%b; //doesn't work*
>
> I think I can start from MUL.
>
> Thanks.
>
> BRS//
> Chen Zheng
> Power Compiler Backend Developer
>
>
> [image: Inactive hide details for Sanjay Patel ---2018/12/19 01:16:24
> AM---Yes, it looks like we are missing an IR canonicalization for]Sanjay
> Patel ---2018/12/19 01:16:24 AM---Yes, it looks like we are missing an IR
> canonicalization for 'mul' like this:
>
> From: Sanjay Patel <spatel at rotateright.com>
> To: Zheng CZ Chen <czhengsz at cn.ibm.com>
> Cc: Roman Lebedev <lebedev.ri at gmail.com>, llvm-dev <
> llvm-dev at lists.llvm.org>
> Date: 2018/12/19 01:16 AM
> Subject: Re: [llvm-dev] should we do this time-consuming transform in
> InstCombine?
> ------------------------------
>
>
>
> Yes, it looks like we are missing an IR canonicalization for 'mul' like
> this:
> *https://rise4fun.com/Alive/ARs* <https://rise4fun.com/Alive/ARs>
>
> %neg = sub i8 0, %x
> %r = mul i8 %neg, %y
> =>
> %mul2 = mul i8 %x, %y
> %r = sub i8 0, %mul2
>
> What other opcodes do you see where this transform applies?
>
> If adding that transform is enough to solve the original problem, then we
> don't need to add the larger pattern match that includes the select?
>
> On Tue, Dec 18, 2018 at 1:26 AM Zheng CZ Chen via llvm-dev <
> *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>> wrote:
>
> Hi Roman,
>
> Thanks for your good idea. I think it can solve the abs issue very
> well. I can continue with my work now^-^.
>
> But if it is not abs and there is no select,
> %res = OP i32 %b, %a
> %sub = sub i32 0, %b
> %res2 = OP i32 %sub, %a
>
> theoretically, we can still do the following transform for the above
> pattern:
> %res2 = OP i32 %sub, %a ==> %res2 = sub i32 0, %res
>
> Not sure whether we can do it in instCombine.
>
> Thanks.
>
> BRS//
> Chen Zheng
> Power Compiler Backend Developer
>
>
> [image: Inactive hide details for Roman Lebedev ---2018/12/18 03:45:06
> PM---On Tue, Dec 18, 2018 at 10:18 AM Zheng CZ Chen via llvm-dev]Roman
> Lebedev ---2018/12/18 03:45:06 PM---On Tue, Dec 18, 2018 at 10:18 AM Zheng
> CZ Chen via llvm-dev <*llvm-dev at lists.llvm.org*
> <llvm-dev at lists.llvm.org>> wrote:
>
> From: Roman Lebedev <*lebedev.ri at gmail.com* <lebedev.ri at gmail.com>>
> To: Zheng CZ Chen <*czhengsz at cn.ibm.com* <czhengsz at cn.ibm.com>>
> Cc: *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>
> Date: 2018/12/18 03:45 PM
> Subject: Re: [llvm-dev] should we do this time-consuming transform in
> InstCombine?
> ------------------------------
>
>
>
> On Tue, Dec 18, 2018 at 10:18 AM Zheng CZ Chen via llvm-dev
> <*llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>> wrote:
> >
> > Hi,
> Hi.
>
> > There is an opportunity in instCombine for following instruction
> pattern:
> >
> > %mul = mul nsw i32 %b, %a
> > %cmp = icmp sgt i32 %mul, -1
> > %sub = sub i32 0, %a
> > %mul2 = mul nsw i32 %sub, %b
> > %cond = select i1 %cmp, i32 %mul, i32 %mul2
> >
> > Source code for above pattern:
> > return (a*b) >=0 ? (a*b) : -a*b;
> >
> > Currently, llvm(-O3) can not recognize this as abs(a*b).
> >
> > I initially think we could do this in instCombine phase in opt.
> Below is what I think:
> >
> > %res = OP i32 %b, %a
> > %sub = sub i32 0, %b
> > %res2 = OP i32 %sub, %a
> >
> > We could do the transform:
> > %res2 = OP i32 %sub, %a ==> %res2 = sub i32 0, %res
> >
> > Then we can get the advantage:
> > 1: if %res2 is the only user of %sub, %sub can be eliminated;
> > 2: if %res2 is not the only user of %sub, we could change some heavy
> instruction like div to sub;
> > 3: expose more abs opportunity for later pass.
> >
> > But my concern is finding %res is a little compiling time-consuming.
> > At least we need MIN(user_count(%b), user_count(%a)) times to check
> if instruction with same opcode and same operands exists.
> In instcombine, no user checking is performed/allowed.
> This should match that *specific* pattern (other than verifying the
> correct equal binop types), although i have not tested it:
>
> ICmpInst::Predicate Pred;
> Value *A, *B, *Mul, *Sub, *Mul2;
> if (match(&SI,
> m_Select(m_ICmp(Pred,
> m_CombineAnd(m_BinOp(m_Value(A),
> m_Value(B)),
> m_Value(Mul)),
> m_AllOnes()),
> m_Deferred(Mul),
> m_CombineAnd(
> m_c_BinOp(m_CombineAnd(m_Sub(m_Zero(),
> m_Deferred(A)),
> m_Value(Sub)),
> m_Deferred(B)),
> m_Value(Mul2)))) &&
> Pred == ICmpInst::Predicate::ICMP_SGT) {
> }
>
> > Could you guys give some comment? Is there any better idea for this
> transform?
> >
> > Thanks.
> >
> > BRS//
> > Chen Zheng
> > Power Compiler Backend Developer
> Roman.
>
> > _______________________________________________
> > LLVM Developers mailing list
> > *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>
> > *http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev*
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> *llvm-dev at lists.llvm.org* <llvm-dev at lists.llvm.org>
> *http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev*
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181219/03daec74/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181219/03daec74/attachment.gif>
More information about the llvm-dev
mailing list