[llvm-dev] Condition code in DAGCombiner::visitFADDForFMACombine?
Nicolai Hähnle via llvm-dev
llvm-dev at lists.llvm.org
Wed Aug 22 13:33:26 PDT 2018
On 22.08.2018 17:52, Ryan Taylor wrote:
> This is probably going to effect on other backends and break llvm-lit
> for them?
Very likely, yes. Can you take a look at how big the fallout is? This
might give us a hint about what other frontends might expect, and who
needs to be involved in the discussion (if one is needed).
Cheers,
Nicolai
>
> On Wed, Aug 22, 2018 at 11:41 AM Nicolai Hähnle <nhaehnle at gmail.com
> <mailto:nhaehnle at gmail.com>> wrote:
>
> On 22.08.2018 13:29, Ryan Taylor wrote:
> > The example starts as SPIR-V with the NoContraction decoration
> flag on
> > the fmul.
> >
> > I think what you are saying seems valid in that if the user had
> put the
> > flag on the fadd instead of the fmul it would not contract and so in
> > this example the user needs to put the NoContraction on the fadd
> though
> > I'm not sure that's a good expectation of the user. On the
> surface, I
> > think that if an operation didn't have the contract flag than it
> > wouldn't be contracted, regardless of what flags any other
> operation has.
>
> Okay, I see that the SPIR-V spec specifically calls out this example.
>
> Unless there are conflicting requirements with another frontend, I'd
> say
> we should make sure LLVM is aligned with SPIR-V here. Something along
> the lines of (in LangRef):
>
> ``contract``
> Allow floating-point contraction (e.g. fusing a multiply
> followed by
> an addition into a fused multiply-and-add). This flag must be
> present
> on all affected instruction.
>
> And we should probably say the same about ``reassoc`` as well.
>
> Cheers,
> Nicolai
>
>
>
>
> >
> > On Wed, Aug 22, 2018 at 3:55 AM Nicolai Hähnle via llvm-dev
> > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> <mailto:llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>>>
> wrote:
> >
> > On 21.08.2018 16:08, Ryan Taylor via llvm-dev wrote:
> > > So I have a test case where:
> > >
> > > %20 = fmul nnan arcp float %15, %19
> > > %21 = fadd reassoc nnan arcp contract float %20, -1.000000e+00
> > >
> > > is being contracted in DAG to fmad. Is this correct since the
> > fmul has
> > > no reassoc or contract fast math flag?
> >
> > By having the reassoc and contract flags on fadd, the frontend is
> > essentially saying "different rounding on the value produced
> by the
> > fadd
> > is okay".
> >
> > So I'd say contracting this to fma is correct.
> >
> > Where does this code come from, and why do you think
> contracting to fma
> > is wrong?
> >
> > Cheers,
> > Nicolai
> >
> >
> >
> >
> > >
> > > Thanks.
> > >
> > > On Mon, Aug 20, 2018 at 12:56 PM Ryan Taylor
> <ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>
> > <mailto:ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>>
> > > <mailto:ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>
> <mailto:ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>>>> wrote:
> > >
> > > I'm curious why the condition to fuse is this:
> > >
> > > // Floating-point multiply-add with intermediate rounding.
> > > bool HasFMAD = (LegalOperations &&
> > > TLI.isOperationLegal(ISD::FMAD, VT));
> > >
> > > static bool isContractable(SDNode *N) {
> > > SDNodeFlags F = N->getFlags();
> > > return F.hasAllowContract() ||
> F.hasAllowReassociation();
> > > }
> > >
> > > bool CanFuse = Options.UnsafeFPMath || isContractable(N);
> > > bool AllowFusionGlobally = (Options.AllowFPOpFusion ==
> > > FPOpFusion::Fast || CanFuse || HasFMAD);
> > > // If the addition is not contractable, do not combine.
> > > if (!AllowFusionGlobally && !isContractable(N))
> > > return SDValue();
> > >
> > > Specifically the AllowFusionGlobally, I would have
> expected
> > > something more like:
> > >
> > > bool AllowFusionGlobally = (Options.AllowFPOpFusion ==
> > > FPOpFusion::Fast && CanFuse && HasFMAD);
> > >
> > > or at the very least:
> > >
> > > bool AllowFusionGlobally = ((Options.AllowFPOpFusion ==
> > > FPOpFusion::Fast || CanFuse) && HasFMAD);
> > >
> > > It seems that as long as the target can do fmad it
> does do fmad
> > > since HasFMAD is true.
> > >
> > > Thanks.
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > LLVM Developers mailing list
> > > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> <mailto:llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>>
> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> > >
> >
> >
> > --
> > Lerne, wie die Welt wirklich ist,
> > Aber vergiss niemals, wie sie sein sollte.
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> <mailto:llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>>
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> >
>
>
> --
> Lerne, wie die Welt wirklich ist,
> Aber vergiss niemals, wie sie sein sollte.
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the llvm-dev
mailing list