[llvm-dev] Revisiting/refining the definition of optnone with interprocedural transformations
Johannes Doerfert via llvm-dev
llvm-dev at lists.llvm.org
Thu Apr 22 17:09:46 PDT 2021
On 4/22/21 6:00 PM, paul.robinson at sony.com wrote:
> Hi Johannes,
>
> I've taken some time to try to understand your viewpoint,
> and I will give some more of the history as I remember it;
> hopefully that will help. And a suggestion at the end.
>
>> The point is, I never suggested to change the meaning of
>> `optnone` (in IR). I argue to change the requirement for
>> it to always go with `noinline`. `optnone` itself is not
>> changed, you get exactly the same behavior you got before,
>> and `noinline` is also not changed. They are simply not
>> required to go together.
> Okay.
>
> I can understand looking at the as-implemented handling of
> 'optnone' and taking that as the intended meaning. So from that
> perspective, lacking the history, it does look to you like you are
> not suggesting a change in its meaning.
>
> Actually, removing the requirement to tie them together *is*
> something that I would consider a semantic change, will require an
> update to the LangRef and verifier, and so on. This would be more
> obvious if we had originally done either of two things with the
> same net semantic effect as we have now:
> - make optnone *imply* noinline (like 'naked' does IIUC) instead
> of *requiring* it.
> - make the inliner check for optnone on the callee, instead of
> simply tying the two attributes together.
>
> I hope this helps explain why I see optnone+noinline as simply
> two parts of one unified feature.
>
> History:
>
> The meaning of 'optnone' was always intended as, don't optimize,
> in as many ways as we can manage. I'd rather have not had the
> coupling with noinline, but it was the best way forward at the
> time to achieve the effect we needed. I spent too many months of
> my life getting this accepted at all...
> Maybe my definition of optnone in the LangRef is inadequate; but
> I am quite sure I understand the original intent.
>
> Which includes this:
>
> When it comes to the interaction of optnone and inlining, there
> were of course four cases to consider: caller and callee, and each
> might or might not have optnone.
>
> 1) caller - N, callee - N
> 2) caller - N, callee - Y
> 3) caller - Y, callee - N
> 4) caller - Y, callee - Y
>
> 1) normal case. Inlining and other opts are okay.
> 2) callee is optnone, so we didn't want it inlined and optimized.
> 3) caller is optnone, so no inlining happens.
> 4) caller is optnone, so no inlining happens.
>
> Cases 3/4 are handled by checking for optnone in the inliner pass,
> just like a hundred other passes do. This is boilerplate and was
> added in bulk to all those passes. Having it all be boilerplate
> was important in getting the reviews accepted.
>
> Case 2 was handled by coupling optnone to noinline. As I said,
> this was a practical thing done at the time, not because we ever
> intended the semantics of optnone to mean anything else. It got
> the overall feature accepted, which was the key thing for Sony.
>
> So, what we implemented achieved the effect we wanted, even if
> that implementation didn't mean the new attribute *by itself* had
> exactly all the effects we wanted.
>
> Yes, decoupling optnone (as implemented) from noinline would allow
> case 2 to inline bar into foo, and optimize the result, if that
> somehow seems desirable. But, that result is very much against
> the original intent of optnone, and is why I have been giving you
> such a hard time about this.
>
> I will continue to insist that something called 'optnone' cannot
> properly fail to apply to all instances, inlined or not. But if
> we're willing to rename the attribute, that problem is solved.
>
>
> I'm assuming there would be resistance to doing either of the two
> things I mentioned at the top (make optnone *imply* noinline, or
> modify the inliner to check for optnone on the callee) as that
> doesn't seem to be the direction people are moving in.
>
> So the suggestion is:
> - reword the definition of optnone to be something that would be
> better named "nolocalopt";
> - ideally, actually rename the attribute (because I still say
> that "none" does not mean "unless we've inlined it");
> - and yes, if you must, decouple it from noinline and remove that
> paragraph from the LangRef description.
>
> Clang will still pass both IR attributes, so end users won't see
> any feature regressions. David can add 'noipa' and we can make
> Clang pass that as well.
Works for me.
~ Johannes
> --paulr
More information about the llvm-dev
mailing list