<div dir="ltr"><div dir="ltr"><div dir="ltr">On Wed, Feb 19, 2020 at 12:22 PM David Greene via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Stephen Canon <<a href="mailto:scanon@apple.com" target="_blank">scanon@apple.com</a>> writes:<br>
>> On Feb 18, 2020, at 2:01 PM, David Greene <<a href="mailto:greened@obbligato.org" target="_blank">greened@obbligato.org</a>> wrote:<br>
>> <br>
>> There are many cases where FMA is not desired and most users don't<br>
>> expect fused operations at -O0 unless they specifically ask for it.<br>
><br>
> If FMA is not desired, -ffp-contract=off or the pragma should be used<br>
> to disable it. -O0 is the wrong tool for that job.<br>
<br>
Why?  Many of our customers would be surprised to see FMAs at -O0.<br></blockquote><div><br></div><div>Jumping in with my opinion, as this thread doesn't seem to be dying of its own accord:</div><div><br></div><div>The -O0 level is supposed to be the compiler's "default" optimization level — that is, the "simplest possible" optimization level, the fastest one, the one that just flows through the compiler without taking any unnecessary detours or side quests. -O0 is the level where you get <i>the thing that just works</i>, without applying any additional post-processing to it.</div><div><br></div><div>In fact, film "post-processing" is a good way to think about optimization. -O0 codegen is like the <a href="https://en.wikipedia.org/wiki/Dailies">dailies</a> straight from the camera. Optimization options, -ffp-contract=whatever, and so on, are all inputs (from the human "director-producer") to the guy who does the post-processing, saying "take this raw footage, as it came from the camera, and— look for some extra FMAs, or lower the ones that basic codegen already put there, or whatever."</div><div><br></div><div>The innards of the compiler always look basically like this:</div><div><br></div><div>    do_some_codegen();</div><div>    if (some_option) {</div><div>        postprocess_the_codegen_to_satisfy_a_whim_of_the_director();</div><div>    }</div><div><br></div><div>The "-O0" path is <i><b>by definition</b></i> the path that does not take that `if` branch.  I don't care if the whim is "I want more FMAs" or "I want fewer FMAs" or "I want more spills to stack" or "I want fewer spills to stack" or whatever. The "-O0" path is <i><b>by definition</b></i> the path that does not cater to any whim except "I want to see the dailies as soon as possible."</div><div><br></div><div>Which is to say, Stephen Canon and Joerg Sonnenberger are correct.</div><div><br></div><div>–Arthur</div></div></div></div>