On Thu, Jul 1, 2010 at 10:29 PM, Taras Glek <tg...@mozilla.com> wrote: > On 06/30/2010 03:06 PM, Jan Hubicka wrote: >> >> If you can find actual simple examples where -Os is losing size and speed >> we can try >> to do something about them. >> > > According to our code size reports, inlining is completely screwed for C++ > wrapper classes like ones often used for smart pointers, arrays, etc. See > http://people.mozilla.com/~tglek/codesize45.txt > > Would be really nice if this could be fixed in 4.5. It's tricky for us to > switch to 4.5 otherwise. > > The following code inlines as expected under -Os in 4.4. It also inlines > properly with -O1+ in 4.5. But it generates giant bloated code under -Os in > 4.5. > > class Container { > public: > Container() { > member = new int; > } > > void cleanup() { > delete member; > member = 0; > } > > int value() { > return *member; > } > > ~Container() { > cleanup(); > } > private: > int *member; > }; > > > > int gimme() { > Container m; > return m.value(); > }
Without looking I bet the issue here is call_cost at -Os (which is 1). In the above example we are only not inlining the constructor, which is estimated as size 2 (a function call with one (constant) parameter). Inlining that enlarges the caller as we'd replace a call without an argument with one with an argument. So the inlining decision isn't too bad for -Os here (which means your testcase isn't a good representative of what is the issue). Richard.