<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>