<html><body>
<p><font size="2" face="sans-serif">Hal,<br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">Thanks for the quick review. I don't have commit access.<br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">Olivier<br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">Sent from my iPhone<br>
</font><font size="2" face="sans-serif"><br>
</font><font size="2" face="sans-serif">> On Sep 16, 2014, at 5:41 PM, "Hal Finkel" <hfinkel@anl.gov> wrote:<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> Hi,<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> +bool PPCTargetLowering::enableAggressiveFMAFusion(EVT VT) const {<br>
</font><font size="2" face="sans-serif">> +  return VT.isFloatingPoint();<br>
</font><font size="2" face="sans-serif">> +}<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> This should never be called on anything but floating-point types (we don't have integer FMA nodes). I'd write this as:<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> bool PPCTargetLowering::enableAggressiveFMAFusion(EVT VT) const {<br>
</font><font size="2" face="sans-serif">>   assert(VT.isFloatingPoint() && "Non-floating-point FMA?");<br>
</font><font size="2" face="sans-serif">>   return true;<br>
</font><font size="2" face="sans-serif">> }<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> otherwise, LGTM. Do you have commit access?<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">>  -Hal<br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> ----- Original Message -----<br>
</font><font size="2" face="sans-serif">> > From: "Olivier H Sallenave" <ohsallen@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > To: "Hal Finkel" <hfinkel@anl.gov><br>
</font><font size="2" face="sans-serif">> > Cc: llvm-commits@cs.uiuc.edu, "Samuel F Antao" <sfantao@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > Sent: Tuesday, September 16, 2014 4:28:27 PM<br>
</font><font size="2" face="sans-serif">> > Subject: Re: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Hi Hal,<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Thanks for the advice. Attached is the suggested change.<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Cheers,<br>
</font><font size="2" face="sans-serif">> > Olivier<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > (See attached file: fma.diff)<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Inactive hide details for Hal Finkel ---09/16/2014 02:02:07 AM---Hi<br>
</font><font size="2" face="sans-serif">> > Olivier, I don't want to duplicate the DAGCombine logic in Hal<br>
</font><font size="2" face="sans-serif">> > Finkel ---09/16/2014 02:02:07 AM---Hi Olivier, I don't want to<br>
</font><font size="2" face="sans-serif">> > duplicate the DAGCombine logic in the PPC backend. Instead, please<br>
</font><font size="2" face="sans-serif">> > add a<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > From: Hal Finkel <hfinkel@anl.gov><br>
</font><font size="2" face="sans-serif">> > To: Olivier H Sallenave/Watson/IBM@IBMUS<br>
</font><font size="2" face="sans-serif">> > Cc: Samuel F Antao/Watson/IBM@IBMUS, <llvm-commits@cs.uiuc.edu><br>
</font><font size="2" face="sans-serif">> > Date: 09/16/2014 02:02 AM<br>
</font><font size="2" face="sans-serif">> > Subject: Re: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Hi Olivier,<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > I don't want to duplicate the DAGCombine logic in the PPC backend.<br>
</font><font size="2" face="sans-serif">> > Instead, please add a TLI callback to optionally enable the<br>
</font><font size="2" face="sans-serif">> > transformation in DAGCombine. Make this callback take the value type<br>
</font><font size="2" face="sans-serif">> > as a parameter, and return false for all types by default. Then<br>
</font><font size="2" face="sans-serif">> > override this callback in PPCISelLowering to return true (perhaps<br>
</font><font size="2" face="sans-serif">> > for all types). You can call it something like<br>
</font><font size="2" face="sans-serif">> > enableAggressiveFMAFormation, or enablePartialReplacementWithFMAs,<br>
</font><font size="2" face="sans-serif">> > etc.<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > Thanks again,<br>
</font><font size="2" face="sans-serif">> > Hal<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > ----- Original Message -----<br>
</font><font size="2" face="sans-serif">> > > From: "Olivier H Sallenave" <ohsallen@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > > To: llvm-commits@cs.uiuc.edu<br>
</font><font size="2" face="sans-serif">> > > Cc: "Hal Finkel" <hfinkel@anl.gov>, "Samuel F Antao"<br>
</font><font size="2" face="sans-serif">> > > <sfantao@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > > Sent: Wednesday, September 10, 2014 10:41:01 AM<br>
</font><font size="2" face="sans-serif">> > > Subject: Fw: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Hi,<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > We should indeed check that the number of cycles has been reduced<br>
</font><font size="2" face="sans-serif">> > > (through TTI::getArithmeticInstrCost). However, AArch64 doesn't<br>
</font><font size="2" face="sans-serif">> > > override the cost of FMA, FADD and FMUL, therefore they all cost 2<br>
</font><font size="2" face="sans-serif">> > > by default.<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Instead, here is a patch specific to the PPC backend. I followed<br>
</font><font size="2" face="sans-serif">> > > Kevin's proposal to always combine, which should be fine for this<br>
</font><font size="2" face="sans-serif">> > > target.<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Olivier<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > (See attached file: fma-ppc.diff)<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > ----- Forwarded by Olivier H Sallenave/Watson/IBM on 09/10/2014<br>
</font><font size="2" face="sans-serif">> > > 11:26<br>
</font><font size="2" face="sans-serif">> > > AM -----<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > From: Olivier H Sallenave/Watson/IBM<br>
</font><font size="2" face="sans-serif">> > > To: Hal Finkel <hfinkel@anl.gov><br>
</font><font size="2" face="sans-serif">> > > Cc: llvm-commits@cs.uiuc.edu<br>
</font><font size="2" face="sans-serif">> > > Date: 09/04/2014 05:26 PM<br>
</font><font size="2" face="sans-serif">> > > Subject: Re: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Hi Hal,<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Thanks for your feedback. Attached is the patch with the<br>
</font><font size="2" face="sans-serif">> > > corrections<br>
</font><font size="2" face="sans-serif">> > > and the regression test.<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Regarding the recursive call, I believe it is fine since it's<br>
</font><font size="2" face="sans-serif">> > > guarded<br>
</font><font size="2" face="sans-serif">> > > by some conditions which ensure it can only take an FNEG node as<br>
</font><font size="2" face="sans-serif">> > > parameter — therefore the depth of the recursion cannot be greater<br>
</font><font size="2" face="sans-serif">> > > than 1. If you still don't like it, we can replace the recursive<br>
</font><font size="2" face="sans-serif">> > > call with an iteration over the uses of the FNEG node.<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > More importantly, I found out that the following tests now fail:<br>
</font><font size="2" face="sans-serif">> > > CodeGen/AArch64/fp-dp3.ll<br>
</font><font size="2" face="sans-serif">> > > CodeGen/AArch64/neon-fma.ll<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > The failing tests are basically the same, and check explicitly that<br>
</font><font size="2" face="sans-serif">> > > FMUL isn't combined with two distinct FADD (see below). I am<br>
</font><font size="2" face="sans-serif">> > > wondering why ARM doesn't want to combine here. It seems that FMUL<br>
</font><font size="2" face="sans-serif">> > > and FMADD take 2 cycles, whereas FADD takes 1 cycle. Could that be<br>
</font><font size="2" face="sans-serif">> > > the reason? If so, maybe we could check the latency of the<br>
</font><font size="2" face="sans-serif">> > > instructions we combine?<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > ; Another set of tests that check for multiply single use<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > define float @test_fmadd_unfused_su(float %a, float %b, float %c) {<br>
</font><font size="2" face="sans-serif">> > > ; CHECK-LABEL: test_fmadd_unfused_su:<br>
</font><font size="2" face="sans-serif">> > > %prod = fmul float %b, %c<br>
</font><font size="2" face="sans-serif">> > > %sum = fadd float %a, %prod<br>
</font><font size="2" face="sans-serif">> > > %res = fadd float %sum, %prod<br>
</font><font size="2" face="sans-serif">> > > ; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}},<br>
</font><font size="2" face="sans-serif">> > > {{s[0-9]+}}<br>
</font><font size="2" face="sans-serif">> > > ; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}<br>
</font><font size="2" face="sans-serif">> > > ; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}<br>
</font><font size="2" face="sans-serif">> > > ; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}<br>
</font><font size="2" face="sans-serif">> > > ret float %res<br>
</font><font size="2" face="sans-serif">> > > }<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Thanks very much for your help,<br>
</font><font size="2" face="sans-serif">> > > Olivier<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > (See attached file: fold-fma.diff)<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Inactive hide details for Hal Finkel ---09/03/2014 03:29:08 PM---Hi<br>
</font><font size="2" face="sans-serif">> > > Olivier, Thanks for working on this. A few comments:Hal Finkel<br>
</font><font size="2" face="sans-serif">> > > ---09/03/2014 03:29:08 PM---Hi Olivier, Thanks for working on this.<br>
</font><font size="2" face="sans-serif">> > > A few comments:<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > From: Hal Finkel <hfinkel@anl.gov><br>
</font><font size="2" face="sans-serif">> > > To: Olivier H Sallenave/Watson/IBM@IBMUS<br>
</font><font size="2" face="sans-serif">> > > Cc: <llvm-commits@cs.uiuc.edu><br>
</font><font size="2" face="sans-serif">> > > Date: 09/03/2014 03:29 PM<br>
</font><font size="2" face="sans-serif">> > > Subject: Re: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Hi Olivier,<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Thanks for working on this. A few comments:<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > +// operation. This is used to ensure that combining into FMA will<br>
</font><font size="2" face="sans-serif">> > > actually<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > into FMA -> into an FMA<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > + if (N->getOpcode() != ISD::FMUL &&<br>
</font><font size="2" face="sans-serif">> > > + N->getOpcode() != ISD::FNEG)<br>
</font><font size="2" face="sans-serif">> > > + return false;<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > These conditions guard every call to the function, so this can be<br>
</font><font size="2" face="sans-serif">> > > an<br>
</font><font size="2" face="sans-serif">> > > assert; something like this:<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > assert((N->getOpcode() == ISD::FMUL || N->getOpcode() == ISD::FNEG)<br>
</font><font size="2" face="sans-serif">> > > &&<br>
</font><font size="2" face="sans-serif">> > > "Expecting fmul or fneg node");<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > + else if (!isAlwaysFoldedIntoFMA(*UI))<br>
</font><font size="2" face="sans-serif">> > > + return false;<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Recursion here seems overly-general. Is that the best way to do it?<br>
</font><font size="2" face="sans-serif">> > > Should you have a depth limit?<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > And finally, you'll need an LLVM IR-level CodeGen regression test.<br>
</font><font size="2" face="sans-serif">> > > Look in test/CodeGen/PowerPC or test/CodeGen/X86 (it should be<br>
</font><font size="2" face="sans-serif">> > > something like test/CodeGen/PowerPC/fma.ll).<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > Thanks,<br>
</font><font size="2" face="sans-serif">> > > Hal<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > ----- Original Message -----<br>
</font><font size="2" face="sans-serif">> > > > From: "Olivier H Sallenave" <ohsallen@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > > > To: llvm-commits@cs.uiuc.edu<br>
</font><font size="2" face="sans-serif">> > > > Sent: Wednesday, September 3, 2014 11:21:53 AM<br>
</font><font size="2" face="sans-serif">> > > > Subject: Improve FMA folding<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > Hi,<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > Here is a patch to improve FMA folding in DAGCombiner.cpp.<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > Previously, when looking at a FMUL and a FADD, it would combine<br>
</font><font size="2" face="sans-serif">> > > > them<br>
</font><font size="2" face="sans-serif">> > > > into FMA if the FMUL is only used by the FADD. This was to ensure<br>
</font><font size="2" face="sans-serif">> > > > that the FMUL will be removed, meaning that the number of<br>
</font><font size="2" face="sans-serif">> > > > instructions will actually be reduced. However, if the FMUL has<br>
</font><font size="2" face="sans-serif">> > > > many<br>
</font><font size="2" face="sans-serif">> > > > uses but can be combined with each one of them (i.e. they are<br>
</font><font size="2" face="sans-serif">> > > > either<br>
</font><font size="2" face="sans-serif">> > > > FADD or FSUB), it should still be combined. Attached is a patch<br>
</font><font size="2" face="sans-serif">> > > > which checks all uses of the FMUL.<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > Olivier<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > (See attached file: fma.diff) (See attached file: test-fma.c)<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > ----- Forwarded by Olivier H Sallenave/Watson/IBM on 09/03/2014<br>
</font><font size="2" face="sans-serif">> > > > 12:08<br>
</font><font size="2" face="sans-serif">> > > > PM -----<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > From: Hal Finkel <hfinkel@anl.gov><br>
</font><font size="2" face="sans-serif">> > > > To: Kevin K O'Brien/Watson/IBM@IBMUS<br>
</font><font size="2" face="sans-serif">> > > > Cc: Samuel F Antao/Watson/IBM@IBMUS, <llvmdev@cs.uiuc.edu>,<br>
</font><font size="2" face="sans-serif">> > > > Olivier<br>
</font><font size="2" face="sans-serif">> > > > H<br>
</font><font size="2" face="sans-serif">> > > > Sallenave/Watson/IBM@IBMUS<br>
</font><font size="2" face="sans-serif">> > > > Date: 08/26/2014 11:33 AM<br>
</font><font size="2" face="sans-serif">> > > > S</font><font size="2" face="sans-serif">ubject: Re: [LLVMdev] Multiply-add combining<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > Kevin, Olivier,<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > The target independent heuristic could certainly check all uses,<br>
</font><font size="2" face="sans-serif">> > > > patches welcome. We could also consider each case separately, as<br>
</font><font size="2" face="sans-serif">> > > > Kevin suggests, but that might not be optimal on targets with<br>
</font><font size="2" face="sans-serif">> > > > only<br>
</font><font size="2" face="sans-serif">> > > > one floating-point pipeline, so we'd need to make it opt-in. You<br>
</font><font size="2" face="sans-serif">> > > > should also look at the MachineCombiner Pass (added in r214832,<br>
</font><font size="2" face="sans-serif">> > > > currently only used by the ARM backend I think) the tries to<br>
</font><font size="2" face="sans-serif">> > > > solve<br>
</font><font size="2" face="sans-serif">> > > > this problem in a more-sophisticated way.<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > -Hal<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > ----- Original Message -----<br>
</font><font size="2" face="sans-serif">> > > > > From: "Kevin K O'Brien" <caomhin@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > > > > To: "Olivier H Sallenave" <ohsallen@us.ibm.com><br>
</font><font size="2" face="sans-serif">> > > > > Cc: "Samuel F Antao" <sfantao@us.ibm.com>, llvmdev@cs.uiuc.edu<br>
</font><font size="2" face="sans-serif">> > > > > Sent: Tuesday, August 26, 2014 10:16:23 AM<br>
</font><font size="2" face="sans-serif">> > > > > Subject: Re: [LLVMdev] Multiply-add combining<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Hi Olivier,<br>
</font><font size="2" face="sans-serif">> > > > > I think we discussed this last Thursday? My feeling is that<br>
</font><font size="2" face="sans-serif">> > > > > each<br>
</font><font size="2" face="sans-serif">> > > > > use<br>
</font><font size="2" face="sans-serif">> > > > > of the multiply can be considered separately. If it can be<br>
</font><font size="2" face="sans-serif">> > > > > combined,<br>
</font><font size="2" face="sans-serif">> > > > > then we should do so. The multiply should be left in place and<br>
</font><font size="2" face="sans-serif">> > > > > removed by a dead code elimination pass sometime later. This is<br>
</font><font size="2" face="sans-serif">> > > > > what<br>
</font><font size="2" face="sans-serif">> > > > > TOBEY does. If you want me to explain the XL method in more<br>
</font><font size="2" face="sans-serif">> > > > > detail,<br>
</font><font size="2" face="sans-serif">> > > > > come talk to me.<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Kevin<br>
</font><font size="2" face="sans-serif">> > > > > ----------------------------------------------<br>
</font><font size="2" face="sans-serif">> > > > > Kevin O'Brien<br>
</font><font size="2" face="sans-serif">> > > > > Manager, Advanced Compiler Technology<br>
</font><font size="2" face="sans-serif">> > > > > IBM T.J Watson Research Center, Yorktown Heights, NY<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Inactive hide details for Olivier H Sallenave---08/26/2014<br>
</font><font size="2" face="sans-serif">> > > > > 11:12:04<br>
</font><font size="2" face="sans-serif">> > > > > AM---Hi, I tried to compile the following using<br>
</font><font size="2" face="sans-serif">> > > > > -ffp-contraOlivier<br>
</font><font size="2" face="sans-serif">> > > > > H<br>
</font><font size="2" face="sans-serif">> > > > > Sallenave---08/26/2014 11:12:04 AM---Hi, I tried to compile the<br>
</font><font size="2" face="sans-serif">> > > > > following using -ffp-contract=fast:<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > From:<br>
</font><font size="2" face="sans-serif">> > > > > Olivier H Sallenave/Watson/IBM<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > To:<br>
</font><font size="2" face="sans-serif">> > > > > llvmdev@cs.uiuc.edu,<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Cc:<br>
</font><font size="2" face="sans-serif">> > > > > Samuel F Antao/Watson/IBM@IBMUS, Kevin K<br>
</font><font size="2" face="sans-serif">> > > > > O'Brien/Watson/IBM@IBMUS<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Date:<br>
</font><font size="2" face="sans-serif">> > > > > 08/26/2014 11:12 AM<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Subject:<br>
</font><font size="2" face="sans-serif">> > > > > Multiply-add combining<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Hi,<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > I tried to compile the following using -ffp-contract=fast:<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > %mul = fmul double %sub5, %x<br>
</font><font size="2" face="sans-serif">> > > > > %add = fadd double %add6, %mul<br>
</font><font size="2" face="sans-serif">> > > > > %sub = fsub double %sub5, %mul<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > I expected fadd and fsub to be contracted with fmul, which<br>
</font><font size="2" face="sans-serif">> > > > > didn't<br>
</font><font size="2" face="sans-serif">> > > > > happen.<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > When looking in DAGCombiner.cpp, it appears the result of the<br>
</font><font size="2" face="sans-serif">> > > > > fmul<br>
</font><font size="2" face="sans-serif">> > > > > needs to be used only once, which isn't the case here as it is<br>
</font><font size="2" face="sans-serif">> > > > > used<br>
</font><font size="2" face="sans-serif">> > > > > by both the fadd and the fsub:<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > // fold (fadd (fmul x, y), z) -> (fma x, y, z)<br>
</font><font size="2" face="sans-serif">> > > > > if (N0.getOpcode() == ISD::FMUL && N0.hasOneUse())<br>
</font><font size="2" face="sans-serif">> > > > > return DAG.getNode(ISD::FMA, SDLoc(N), VT, N0.getOperand(0),<br>
</font><font size="2" face="sans-serif">> > > > > N0.getOperand(1), N1);<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > This heuristic looks a little conservative, could we instead<br>
</font><font size="2" face="sans-serif">> > > > > check<br>
</font><font size="2" face="sans-serif">> > > > > that every instruction using the result of the fmul are<br>
</font><font size="2" face="sans-serif">> > > > > combinable<br>
</font><font size="2" face="sans-serif">> > > > > (i.e., they are either fadd or fsub)?<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > Thanks in advance,<br>
</font><font size="2" face="sans-serif">> > > > > Olivier<br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > > > _______________________________________________<br>
</font><font size="2" face="sans-serif">> > > > > LLVM Developers mailing list<br>
</font><font size="2" face="sans-serif">> > > > > LLVMdev@cs.uiuc.edu <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><br>
</font><font size="2" face="sans-serif">> > > > > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</font><font size="2" face="sans-serif">> > > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > --<br>
</font><font size="2" face="sans-serif">> > > > Hal Finkel<br>
</font><font size="2" face="sans-serif">> > > > Assistant Computational Scientist<br>
</font><font size="2" face="sans-serif">> > > > Leadership Computing Facility<br>
</font><font size="2" face="sans-serif">> > > > Argonne National Laboratory<br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > > > _______________________________________________<br>
</font><font size="2" face="sans-serif">> > > > llvm-commits mailing list<br>
</font><font size="2" face="sans-serif">> > > > llvm-commits@cs.uiuc.edu<br>
</font><font size="2" face="sans-serif">> > > > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</font><font size="2" face="sans-serif">> > > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > > --<br>
</font><font size="2" face="sans-serif">> > > Hal Finkel<br>
</font><font size="2" face="sans-serif">> > > Assistant Computational Scientist<br>
</font><font size="2" face="sans-serif">> > > Leadership Computing Facility<br>
</font><font size="2" face="sans-serif">> > > Argonne National Laboratory<br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> > ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> > --<br>
</font><font size="2" face="sans-serif">> > Hal Finkel<br>
</font><font size="2" face="sans-serif">> > Assistant Computational Scientist<br>
</font><font size="2" face="sans-serif">> > Leadership Computing Facility<br>
</font><font size="2" face="sans-serif">> > Argonne National Laboratory<br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> ><br>
</font><font size="2" face="sans-serif">> <br>
</font><font size="2" face="sans-serif">> --<br>
</font><font size="2" face="sans-serif">> Hal Finkel<br>
</font><font size="2" face="sans-serif">> Assistant Computational Scientist<br>
</font><font size="2" face="sans-serif">> Leadership Computing Facility<br>
</font><font size="2" face="sans-serif">> Argonne National Laboratory<br>
</font><font size="2" face="sans-serif">> <br>
</font></body></html>