Right now we have a healthy mixture of two ways to respond to -Oz and -Os in LLVM:
- Pass this info to the PassManagerBuilder and then toggle some flag to the pass to change thresholds.
- When running over IR, inspect it for the minsize or optsize attribute.
Regardless of the particulars of what these mean and/or how they relate to -O2 vs -O3 for example, I’d really like to at least get to one way of doing this.
The only way that is really compatible with LTO use cases is to use the function attributes, so I’d suggest we actively work toward that. That sound good to others? Thoughts?
If folks like this, I will attempt to update the few places where we get this wrong. I already have some patches but wanted to make sure everyone likes this direction.
Thanks for bringing this up. As I see it:
The advantage of (1) is that it allows easier exploration of IR - I can run the optimizer in -O2, optsize and minsize mode all without going back to clang.
The advantage of (2) is that it works with LTO… and I think that must trump all other concerns, as you said. In fact, the advantage of (1) I just stated could be gained by simply “opt -force-attribute=*:minsize” (do we have a wildcard match for -force-attribute? if we don’t, we should). So while unwieldy, it does work (and ideally should be documented!)
So I agree, (2) sounds best.
If we go with (2), I’m happy to work on a mechanism in the opt tool to essentially automate this process to implement ‘-Oz’ so that it won’t be any harder than it is today. But I suspect it would be better to spell the option differently to make it clear that it will transform the IR to get this, not just a mode setting. Maybe a dedicated pass that is essentially the force attribute you describe, but canned for forcing these attributes globally when not already present on functions.
I actually thought that (2) was already the accepted answer to this question. Regardless, it should be (2). -Hal