<div dir="ltr">So I have a test case where:<div><br></div><div><div>%20 = fmul nnan arcp float %15, %19</div><div>%21 = fadd reassoc nnan arcp contract float %20, -1.000000e+00</div></div><div><br></div><div>is being contracted in DAG to fmad. Is this correct since the fmul has no reassoc or contract fast math flag?</div><div><br></div><div>Thanks.</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 20, 2018 at 12:56 PM Ryan Taylor <<a href="mailto:ryta1203@gmail.com">ryta1203@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><span style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">I'm curious why the condition to fuse is this:</span></div><div><span style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">// Floating-point multiply-add with intermediate rounding.</span><br></div><div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">  bool HasFMAD = (LegalOperations && TLI.isOperationLegal(ISD::FMAD, VT));</div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px"><br></div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">static bool isContractable(SDNode *N) {</div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">  SDNodeFlags F = N->getFlags();</div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">  return F.hasAllowContract() || F.hasAllowReassociation();</div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px">}</div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px"><br></div><div style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif;font-size:16px"><div>bool CanFuse = Options.UnsafeFPMath || isContractable(N);</div><div>bool AllowFusionGlobally = (Options.AllowFPOpFusion == FPOpFusion::Fast || CanFuse || HasFMAD);</div><div>// If the addition is not contractable, do not combine.</div><div>if (!AllowFusionGlobally && !isContractable(N))</div><div>    return SDValue();</div><div><br></div><div>Specifically the AllowFusionGlobally, I would have expected something more like:</div><div><br></div><div><div>bool AllowFusionGlobally = (Options.AllowFPOpFusion == FPOpFusion::Fast && CanFuse && HasFMAD);</div></div><div><br></div><div>or at the very least:</div><div><br></div><div><div>bool AllowFusionGlobally = ((Options.AllowFPOpFusion == FPOpFusion::Fast || CanFuse) && HasFMAD);</div></div><div><br></div><div>It seems that as long as the target can do fmad it does do fmad since HasFMAD is true.</div><div><br></div><div>Thanks.</div><div><br></div><div><br></div><div><br></div></div></div></div>
</blockquote></div>