[PATCH][AArch64] Enable sign check optimization by CSE

Jiangning Liu liujiangning1 at gmail.com
Thu Jul 24 19:05:43 PDT 2014


Hi Sergey,

Did you forget to attach your new patch?

I tried the spec benchmarks by disabling that code of inverting the
condition, and only see the following performance changes and no change for
all others.

164.gzip (ref)  +1.76%
458.sjeng (train) + 2.19%
471.omnetpp (train) -1.43%
473.astar (train) -1.51%

Hopefully we can understand why this could happen, but maybe this is just a
heuristic result depending on the real control flow and workload.

Thanks,
-Jiangning



2014-07-24 16:17 GMT+08:00 Sergey Dmitrouk <sdmitrouk at accesssoftek.com>:

> Hello Jiangning,
>
> Thanks for your comments.
>
> > 1) I expect the fix should be insideA getAArch64Cmp.
> >...
> > but essentially getAArch64Cmp missed the case of (x < 1) -> (x <= 0).
>
> It was initial placement of the fix, but the function doesn't seem to
> perform transformations like that.  It updates conditions only when
> immediate values are not legal.  There is no comment for the function,
> so I'm not sure whether such checks fit there, but I moved the change.
>
> > 2) Your comment is inconsistent with your code.
>
> Thanks, it's probably because of inverted conditions in DAGs.
>
> > So now I'm wondering how to justify this is always meaningful for
> AArch64?
>
> I wasn't sure whether it's worth such change, but as an option something
> like TargetLowering::isInversionBeneficial(SDValue Cond) can be added,
> but I don't know whether it's possible to check for conditions like
> "(a < 0 && b == c || a > 0 && b == d)" to do not block inversion for all
> cases.
>
> Attached updated patch at least to see whether the fix fits well in
> getAArch64Cmp().
>
> Regards,
> Sergey
>
> On Wed, Jul 23, 2014 at 10:05:37PM -0700, Jiangning Liu wrote:
> >    Hi Sergey,
> >    1) I expect the fix should be insideA getAArch64Cmp.
> >    2) Your comment is inconsistent with your code. Your code is to
> transform
> >    (x < 1) to be (x<=0), rather than "Turn "x > 1" condition into "x >=
> 0"".
> >    I also noticed we have the following transformation for if condition
> (x <
> >    0) in back-end,
> >    stage 1: (x < 0) -> (x >= 0), i.e. (x<0) and invert the targets.
> >    stage 2: (x >= 0) -> (x > -1). This happens in combine1.
> >    stage 3: (x > -1) -> (x >= 0) in getAArch64Cmp.
> >    For if condition (x > 0), the transformation is similar. Your patch is
> >    trying to cover this case, but essentially getAArch64Cmp missed the
> case
> >    of (x < 1) -> (x <= 0).
> >    However, as you can see the root cause of generating the comparison
> with
> >    constant 1 is stage 1. This happens
> >    insideA SelectionDAGBuilder::visitSwitchCase
> >    A  // If the lhs block is the next block, invert the condition so
> that we
> >    can
> >    A  // fall through to the lhs instead of the rhs block.
> >    A  if (CB.TrueBB == NextBlock) {
> >    A  A  std::swap(CB.TrueBB, CB.FalseBB);
> >    A  A  SDValue True = DAG.getConstant(1, Cond.getValueType());
> >    A  A  Cond = DAG.getNode(ISD::XOR, dl, Cond.getValueType(), Cond,
> True);
> >    A  }
> >    So now I'm wondering how to justify this is always meaningful for
> AArch64?
> >    Thanks,
> >    -Jiangning
> >
> >    2014-07-23 23:54 GMT+08:00 Sergey Dmitrouk <
> sdmitrouk at accesssoftek.com>:
> >
> >      Hi,
> >
> >      Basing on the following information from [this post][0] by James
> Molloy:
> >
> >      A  2. "if (a < 0 && b == c || a > 0 && b == d)" - the first
> comparison
> >      of
> >      A  'a' against zero is done twice, when the flag results of the
> first
> >      A  comparison could be used for the second comparison.
> >
> >      I've made a patch (attached) that removes this extra comparison. A
> More
> >      complex cases like comparisons with non-zero immediate values or
> with
> >      registers doesn't seem to be task for a code generator. A Comparing
> with
> >      zero is quite common, so I seems to be worth adding.
> >
> >      Please review the patch. A Couldn't find a better place to make the
> >      change, but I'll be happy to adjust the patch if anyone has better
> >      ideas.
> >
> >      Best regards,
> >      Sergey
> >
> >      0: http://article.gmane.org/gmane.comp.compilers.llvm.devel/74269
> >
> >      _______________________________________________
> >      llvm-commits mailing list
> >      llvm-commits at cs.uiuc.edu
> >      http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140725/c8cd2946/attachment.html>


More information about the llvm-commits mailing list