On Fri, Jan 11, 2013 at 1:08 PM, Andrew Booker <span dir="ltr"><<a href="mailto:andrew.booker@arm.com" target="_blank">andrew.booker@arm.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The fmuladd intrinsic is described as saying that a multiply and<br>
addition sequence can be fused into an fma instruction "if the code<br>
generator determines that the fused expression would be legal and<br>
efficient". (<a href="http://llvm.org/docs/LangRef.html#llvm-fma-intrinsic" target="_blank">http://llvm.org/docs/LangRef.html#llvm-fma-intrinsic</a>)<br>
<br>
I've spent a bit of time puzzling over how a code generator is supposed<br>
to know if it's legal to generate an fma instead of a multiply and add<br>
- surely that's something for the frontend to determine, based on the<br>
FP_CONTRACT setting, and not something for the code generator to work<br>
out?<br>
<br>
However, recently I came across<br>
<a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120528/0582
22.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120528/0582<br>
22.html</a><br>
which explains that "legal" in the above definition doesn't mean legal<br>
from the point of view of the source language, but simply means whether<br>
or not the target architecture has an fma instruction. The thread also<br>
talks about updating the documentation to clarify this, but that<br>
doesn't seem to have happened.<br>
<br>
Assuming that the thread I've linked to is correct, would it be<br>
possible to clarify the IR spec accordingly? I think that the current<br>
use of the word "legal" is misleading.<br><br></blockquote><div><br></div><div>Hey Andrew,</div><div><br></div><div>I believe that the term "legal" is associated with the Legalize phase. Please see:</div>
<div><br></div><div><a href="http://llvm.org/docs/CodeGenerator.html#selectiondag-legalize-phase">http://llvm.org/docs/CodeGenerator.html#selectiondag-legalize-phase</a></div><div><br></div><div>The x86 backend has a good example of this in llvm/lib/Target/X86/X86ISelLowering.cpp:</div>
<div><br></div><div><div>>  if (Subtarget->hasFMA()) {</div><div>>    // Support FMAs!</div><div>>    setOperationAction(ISD::FMA, MVT::f64, Legal);</div><div>>    setOperationAction(ISD::FMA, MVT::f32, Legal);</div>
<div>>  }</div><div>>  else {</div><div>>    // We don't support FMA.</div><div>>    setOperationAction(ISD::FMA, MVT::f64, Expand);</div><div>>    setOperationAction(ISD::FMA, MVT::f32, Expand);</div><div>
>  }</div></div><div><br></div><div><br></div><div>Hope that helps,</div><div>Cameron</div><div><br></div></div>