On Tue, Aug 1, 2017 at 6:00 PM, James Greenhalgh <james.greenha...@arm.com> wrote: > On Tue, Aug 01, 2017 at 11:12:12AM -0400, Eric Gallager wrote: >> On 8/1/17, Jakub Jelinek <ja...@redhat.com> wrote: >> > On Tue, Aug 01, 2017 at 07:08:41AM -0400, Eric Gallager wrote: >> >> > Heh. I suspect -Os would benefit from a separate compilation pipeline >> >> > such as -Og. Nowadays the early optimization pipeline is what you >> >> > want (mostly simple CSE & jump optimizations, focused on code >> >> > size improvements). That doesn't get you any loop optimizations but >> >> > loop optimizations always have the chance to increase code size >> >> > or register pressure. >> >> > >> >> >> >> Maybe in addition to the -Os optimization level, GCC mainline could >> >> also add the -Oz optimization level like Apple's GCC had, and clang >> >> still has? Basically -Os is -O2 with additional code size focus, >> >> whereas -Oz is -O0 with the same code size focus. Adding it to the >> >> FSF's GCC, too, could help reduce code size even further than -Os >> >> currently does. >> > >> > No, lack of optimizations certainly doesn't reduce the code size. >> > For small code, you need lots of optimizations, but preferrably code-size >> > aware ones. For RTL that is usually easier, because you can often compare >> > the sizes of the old and new sequences and choose smaller, for GIMPLE >> > optimizations it is often just a wild guess on what optimizations generally >> > result in smaller and what optimizations generally result in larger code. >> > There are too many following passes to know for sure, and finding the right >> > heuristics is hard. >> > >> > Jakub >> > >> >> Upon rereading of the relevant docs, I guess it was a mistake to >> compare -Oz to -O0. Let me quote from the apple-gcc "Optimize Options" >> page: >> >> -Oz >> (APPLE ONLY) Optimize for size, regardless of performance. -Oz >> enables the same optimization flags that -Os uses, but -Oz also >> enables other optimizations intended solely to reduce code size. >> In particular, instructions that encode into fewer bytes are >> preferred over longer instructions that execute in fewer cycles. >> -Oz on Darwin is very similar to -Os in FSF distributions of GCC. >> -Oz employs the same inlining limits and avoids string instructions >> just like -Os. >> >> Meanwhile, their description of -Os as contrasted to -Oz reads: >> >> -Os >> Optimize for size, but not at the expense of speed. -Os enables all >> -O2 optimizations that do not typically increase code size. >> However, instructions are chosen for best performance, regardless >> of size. To optimize solely for size on Darwin, use -Oz (APPLE >> ONLY). >> >> And the clang docs for -Oz say: >> >> -Oz Like -Os (and thus -O2), but reduces code size further. >> >> So -Oz does actually still optimize, so it's more like -O2 than -O0 >> after all, just even more size-focused than -Os. > > The relationship between -Os and -Oz is like the relationship between -O2 > and -O3. > > If -O3 says, try everything you can to increase performance even at the > expense of code-size and compile time, then -Oz says, try everything you > can to reduce the code size, even at the expense of performance and > compile time.
Note for GCC -Os has been this historically. I'd say that compared to other compilers -O2 is what they do at -Os -- balance speed and size with GCC being much more conservative on the size side than other compilers. Recently we've "weakened" -Os by for example allowing integer division to expand to mul/add sequences but IIRC that was based on the costs the target provides. Richard. > Thanks, > James >