This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: __attribute__((optimize("-O2"))) doesn't work
- From: Jeff Epler <jepler at unpythonic dot net>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 23 Dec 2014 13:50:46 -0600
- Subject: Re: __attribute__((optimize("-O2"))) doesn't work
- Authentication-results: sourceware.org; auth=none
- References: <127B0179-8F1C-4CE6-8318-33E8AA76E7A6 at rice dot edu>
I tested with debian jessie's gcc 4.9.1-19 targeting x86_64 and I agree
in general with Chaoran Yang's findings. Specifically, optimize(1)
doesn't imply -fomit-frame-pointer .. and optimize(0) doesn't impliy
-fno-omit-frame-pointer. optimize("O1"), optimize(2) and so on seem to
continue this pattern.
I disagree with Jonathan Wakely's response that only more complicated
functions should be considered: to assess whether the omit-frame-pointer
optimization is being applied, a very simple function such as 'int foo()
{ return 2; }' is quite useful.
I agree with the other commenters that it's important to follow the
documentation of __attribute__((optimize)) closely. When examples have
errors, such as saying optimize("-fomit-frame-pointer") rather than the
correct optimize("omit-frame-pointer"), or even worse when the examples
are written with "smart quotes", it's too easy to attribute what is
being seen to an error by the reporter. (however, my gcc seems to treat
these nonsense arguments to optimize() as errors so probably the OP had
them right in test code if not in the messages on this mailing list)
This may be related to bug #37565 --
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37565 -- in which gcc
doesn't properly manage the interplay between
optimize(2,"omit-frame-pointer") and -mno-accumulate-outgoing-args.
(though https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38716 reports that
an (implict!) optimize("O2") is spuriously reenabling
-fomit-frame-pointer in gcc 4.4, so perhaps this behavior has changed
over gcc's history)
As for the original situation, if -fomit-frame-pointer is important in
the generated code, it can be separately specified in optimize(). In my
testing, this seemed to work as expected.
I did most of my testing by building
void foo() {}
__attribute__((optimize(1)))
void goo() {}
__attribute__((optimize(0)))
void hoo() {}
__attribute__((optimize("omit-frame-pointer")))
void woo() {}
with commandlines similar to
gcc -Wall -O -S -o- booboo.c | grep -v '^\s*\.'
to look at uncluttered assembly.
Jeff