[LLVMdev] Documentation of fmuladd intrinsic

Justin Holewinski justin.holewinski at gmail.com
Fri Jan 11 11:47:49 PST 2013


Out of curiosity, what is the use-case for isFMAFasterThanMulAndAdd?  If a
target declares that FMA is actually slower for a given type, why not just
declare it as illegal for that type?  Wouldn't that accomplish the same
thing without another target hook?  I feel like I'm missing something here.


On Fri, Jan 11, 2013 at 2:40 PM, Hal Finkel <hfinkel at anl.gov> wrote:

> ----- Original Message -----
> > From: "Cameron McInally" <cameron.mcinally at nyu.edu>
> > To: "Andrew Booker" <andrew.booker at arm.com>
> > Cc: llvmdev at cs.uiuc.edu
> > Sent: Friday, January 11, 2013 12:37:07 PM
> > Subject: Re: [LLVMdev] Documentation of fmuladd intrinsic
> >
> >
> > On Fri, Jan 11, 2013 at 1:08 PM, Andrew Booker <
> > andrew.booker at arm.com > wrote:
> >
> >
> >
> > The fmuladd intrinsic is described as saying that a multiply and
> > addition sequence can be fused into an fma instruction "if the code
> > generator determines that the fused expression would be legal and
> > efficient". ( http://llvm.org/docs/LangRef.html#llvm-fma-intrinsic )
> >
> > I've spent a bit of time puzzling over how a code generator is
> > supposed
> > to know if it's legal to generate an fma instead of a multiply and
> > add
> > - surely that's something for the frontend to determine, based on the
> > FP_CONTRACT setting, and not something for the code generator to work
> > out?
> >
> > However, recently I came across
> > http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120528/0582
> > 22.html
> > which explains that "legal" in the above definition doesn't mean
> > legal
> > from the point of view of the source language, but simply means
> > whether
> > or not the target architecture has an fma instruction. The thread
> > also
> > talks about updating the documentation to clarify this, but that
> > doesn't seem to have happened.
> >
> > Assuming that the thread I've linked to is correct, would it be
> > possible to clarify the IR spec accordingly? I think that the current
> > use of the word "legal" is misleading.
> >
> >
> >
> >
> > Hey Andrew,
> >
> >
> > I believe that the term "legal" is associated with the Legalize
> > phase. Please see:
> >
> >
> > http://llvm.org/docs/CodeGenerator.html#selectiondag-legalize-phase
> >
> >
> > The x86 backend has a good example of this in
> > llvm/lib/Target/X86/X86ISelLowering.cpp:
> >
> >
> >
> > > if (Subtarget->hasFMA()) {
> > > // Support FMAs!
> > > setOperationAction(ISD::FMA, MVT::f64, Legal);
> > > setOperationAction(ISD::FMA, MVT::f32, Legal);
> > > }
> > > else {
> > > // We don't support FMA.
> > > setOperationAction(ISD::FMA, MVT::f64, Expand);
> > > setOperationAction(ISD::FMA, MVT::f32, Expand);
> > > }
> >
> >
>
> There are a few conditions that contribute to the decision of whether or
> not to make the fmuladd -> fma translation. The relevant code is in
> CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:
>
>   case Intrinsic::fmuladd: {
>     EVT VT = TLI.getValueType(I.getType());
>     if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
>         TLI.isOperationLegal(ISD::FMA, VT) &&
>         TLI.isFMAFasterThanMulAndAdd(VT)){
>
>        [ use FMA ]
>     } else {
>        [ use MUL + ADD ]
>     }
>
>  -Hal
>
> >
> >
> > Hope that helps,
> > Cameron
> >
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
>
> --
> Hal Finkel
> Postdoctoral Appointee
> Leadership Computing Facility
> Argonne National Laboratory
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



-- 

Thanks,

Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130111/348443a9/attachment.html>


More information about the llvm-dev mailing list