On 26/07/2012 14:04, Richard Guenther wrote:
On Thu, Jul 26, 2012 at 1:21 PM, David Brown <da...@westcontrol.com> wrote:
On 26/07/2012 11:12, Richard Guenther wrote:

On Wed, Jul 25, 2012 at 8:25 PM, David Brown <david.br...@hesbynett.no>
wrote:

On 25/07/12 17:30, Richard Guenther wrote:


On Wed, Jul 25, 2012 at 4:07 PM, Selvaraj, Senthil_Kumar
<senthil_kumar.selva...@atmel.com>  wrote:


Declaring a function with __attribute__((optimize("O0")) turns off
inlining for the translation unit (atleast) containing the function
(see output at the end). Is this expected behavior?



Not really.  The optimize attribute processing should only affect
flags it saves.  -f[no-]inline is not meaningful per function and we
have the noinline attribute for more proper handling.

That said, I consider the optimize attribute code seriously broken
and unmaintained (but sometimes useful for debugging - and only
that).


That's a pity.  It's understandable - changing optimisation levels on
different functions is always going to be problematic, since
inter-function
optimisations (like inlining) are going to be difficult to define.  But
sometimes it could be nice to use specific optimisations in specific
places,
such as loop unrolling in a critical function while other code is to be
optimised for code size.  Does "#pragma Gcc optimize" work more reliably?


No, it uses the same mechanism internally.

Richard.


Is it reliable to use "#pragma Gcc optimize" options at the start of the
file, as an alternative to specifying them in the command line?  For
example, a Makefile might specify "-Os" as standard options for all c files,
but one particular file might have "#pragma Gcc optimize 3" at the start.
If the line is at the start of the file, before any #includes or code, then
there would be no mixing of optimisation levels.

Behavior will not be the same for

gcc -include foo.h x.c

when you change x.c in the proposed way compared to

gcc -include foo.h x.c -O3

Fair enough - but will "gcc x.c -Os" with "#pragma Gcc optimize 3" as the first line of "x.c" do the same thing as "gcc x.c -O3" ?

I realise that we can't get everything here. C in general, and gcc in particular, is extremely flexible - there are always going to be ways to cause trouble.

But while it is always best to write source code that works correctly regardless of the optimisation levels, occasionally there is code with special requirements. It might be code that should be optimised particularly aggressively, or it might be code that should not be optimised, or have other options (such as older code that breaks strict aliasing rules). I think such requirements are best put in the C file (as pragmas or attributes) rather than in a Makefile - it binds them tighter to the code in question.

If the pragmas work as long as they come before any other code, then that gives them a useful, though limited, purpose.


And if these options are so broken, should they be marked as such in the
manual?

Probably yes.

Or they could be fixed :-)

Could the pragmas be changed (or replaced) with ones explicitly designed to override command-line options, regardless of where they appear in the order in the file? Of course, you are still going to get conflicts when someone specifies more than one c file on the command line, each of which contains such overrides - I think the reasonable thing to do this is just exit with an error message.


Thanks for your time here.

David


Reply via email to