If __attribute__((optimize(...))) does not specify an optimisation level (-Ox), we act as though the prevailing -Ox level had been restated. So:
__attribute__((optimize("no-gcse"))) behaves like: __attribute__((optimize("Ox", "no-gcse"))) where Ox is the current optimisation level. This means that if you compile: void bar (int); void __attribute__((optimize("no-gcse"))) f1 (void) { bar (1); bar (2); } void f2 (void) { bar (1); bar (2); } with -O2 -fno-omit-frame-pointer, f1 will be implicitly use: __attribute__((optimize("O2", "no-gcse"))) and this implicit -O2 will override the explicit -fno-omit-frame-pointer. So f1 will be compiled without a frame pointer but f2 will be compiled with one. This behaviour isn't mentioned in the current documentation, so this is either an implementation or a documentation bug. In RichardG's opinion (and my opinion) it's an implementation bug, so I'm marking it as "c". -- Summary: Undocumented __attribute__((optimize)) behaviour when the attribute specifies no optimisation level Product: gcc Version: 4.4.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rsandifo at gcc dot gnu dot org GCC host triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38716