diff mbox series

Set default to -fomit-frame-pointer

Message ID DB6PR0801MB2053AA4635AFA1F43ED4C8F2835D0@DB6PR0801MB2053.eurprd08.prod.outlook.com
State New
Headers show
Series Set default to -fomit-frame-pointer | expand

Commit Message

Wilco Dijkstra Nov. 3, 2017, 4:54 p.m. UTC
Almost all targets add an explict -fomit-frame-pointer in the target specific
options.  Rather than doing this in a target-specific way, do this in the
generic options so it works identically across all targets.  In many cases the
target no longer needs to define TARGET_OPTION_OPTIMIZATION_TABLE, reducing
the amount of target code.

Verified all targets built by buildmanyglibcs script do still build.

OK for commit?


ChangeLog:
2017-11-03  Wilco Dijkstra  <wdijkstr@arm.com>

	* opts.c (default_options_table): Add OPT_fomit_frame_pointer entry.
	* common/config/alpha/alpha-common.c (TARGET_OPTION_OPTIMIZATION_TABLE):
 	Remove OPT_fomit_frame_pointer entry.
	* common/config/arc/arc-common.c: Likewise. 	
	* common/config/arm/arm-common.c: Likewise. 	
	* common/config/avr/avr-common.c: Likewise. 	
	* common/config/c6x/c6x-common.c: Likewise. 	
	* common/config/cr16/cr16-common.c: Likewise. 	
	* common/config/cris/cris-common.c: Likewise. 	
	* common/config/epiphany/epiphany-common.c: Likewise. 	
	* common/config/fr30/fr30-common.c: Likewise. 	
	* common/config/frv/frv-common.c: Likewise. 	
	* common/config/ia64/ia64-common.c: Likewise. 	
	* common/config/iq2000/iq2000-common.c: Likewise. 	
	* common/config/lm32/lm32-common.c: Likewise. 	
	* common/config/m32r/m32r-common.c: Likewise. 	
	* common/config/mcore/mcore-common.c: Likewise. 	
	* common/config/microblaze/microblaze-common.c: Likewise. 	
	* common/config/mips/mips-common.c: Likewise. 	
	* common/config/mmix/mmix-common.c: Likewise. 	
	* common/config/mn10300/mn10300-common.c: Likewise.
	* common/config/nios2/nios2-common.c: Likewise. 	
	* common/config/pa/pa-common.c: Likewise. 	
	* common/config/pdp11/pdp11-common.c: Likewise. 	
	* common/config/powerpcspe/powerpcspe-common.c: Likewise. 	
	* common/config/riscv/riscv-common.c: Likewise. 	
	* common/config/rs6000/rs6000-common.c: Likewise. 	
	* common/config/rx/rx-common.c: Likewise. 	
	* common/config/s390/s390-common.c: Likewise. 	
	* common/config/sh/sh-common.c: Likewise. 	
	* common/config/sparc/sparc-common.c: Likewise. 	
	* common/config/tilegx/tilegx-common.c: Likewise. 	
	* common/config/tilepro/tilepro-common.c: Likewise. 	
	* common/config/v850/v850-common.c: Likewise. 	
	* common/config/visium/visium-common.c: Likewise. 	
	* common/config/xstormy16/xstormy16-common.c: Likewise. 	
	* common/config/xtensa/xtensa-common.c: Likewise.

    doc/
	* invoke.texi (-fomit-frame-pointer): Update documentation.

--

Comments

Joseph Myers Nov. 3, 2017, 6:04 p.m. UTC | #1
On Fri, 3 Nov 2017, Wilco Dijkstra wrote:

> Almost all targets add an explict -fomit-frame-pointer in the target specific
> options.  Rather than doing this in a target-specific way, do this in the

Which targets do not?  You should explicitly list them and CC their 
maintainers and seek confirmation that such a change is appropriate for 
them.

The addition of -fomit-frame-pointer through this mechanism was a 
replacement for the old target macro CAN_DEBUG_WITHOUT_FP.  It may now be 
the cases that with DWARF debug info, having or not having a frame pointer 
is not particularly relevant to debugging.  But since there are other 
reasons people may want a frame pointer (e.g. light-weight backtraces that 
don't depend on debug / unwind info), it's at least possible there are 
architecture-specific choices regarding keeping frame pointers involved 
here.
Sandra Loosemore Nov. 3, 2017, 7:15 p.m. UTC | #2
On 11/03/2017 10:54 AM, Wilco Dijkstra wrote:
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 71b2445f70fd5b832c68c08e69e71d8ecad37a4a..1c56f4b12495fe97c604200ef245c9fa02684b0f 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -7436,16 +7436,17 @@ machine-description macro @code{FRAME_POINTER_REQUIRED} controls
>   whether a target machine supports this flag.  @xref{Registers,,Register
>   Usage, gccint, GNU Compiler Collection (GCC) Internals}.
>
> -The default setting (when not optimizing for
> -size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is
> -@option{-fomit-frame-pointer}.  You can configure GCC with the
> -@option{--enable-frame-pointer} configure option to change the default.
> +The default setting is @option{-fomit-frame-pointer}.  You can configure GCC
> +with the @option{--enable-frame-pointer} configure option to change the default.

I'd prefer that you remove the reference to configure options entirely 
here.  Nowadays most GCC users install a package provided by their OS 
distribution, Linaro, etc, rather than trying to build GCC from scratch.

>   Note that @option{-fno-omit-frame-pointer} doesn't force a new stack
>   frame for all functions if it isn't otherwise needed, and hence doesn't
> -guarantee a new frame pointer for all functions.
> +guarantee a new frame pointer for all functions.  Several targets always omit
> +the frame pointer in leaf functions.
> +
> +Enabled at levels @option{-O}, @option{-O1}, @option{-O2}, @option{-O3},
> +@option{-Os} and @option{-Og}.

This last sentence makes no sense.  If the option is now enabled by 
default, then the optimization level is irrelevant.

-Sandra
Wilco Dijkstra Nov. 8, 2017, 5:47 p.m. UTC | #3
Joseph Myers wrote:
> On Fri, 3 Nov 2017, Wilco Dijkstra wrote:
>
> > Almost all targets add an explict -fomit-frame-pointer in the target specific
> > options.  Rather than doing this in a target-specific way, do this in the
>
> Which targets do not?  You should explicitly list them and CC their 
> maintainers and seek confirmation that such a change is appropriate for 
> them.

The targets that don't explicitly enable -fomit-frame-pointer in the target
options or force it internally are bfin, ft32, h8300, m68k - I've CCd the
maintainers (it seems there is no-one for h8300).

> The addition of -fomit-frame-pointer through this mechanism was a 
> replacement for the old target macro CAN_DEBUG_WITHOUT_FP.  It may now be 
> the cases that with DWARF debug info, having or not having a frame pointer 
> is not particularly relevant to debugging.  But since there are other 
> reasons people may want a frame pointer (e.g. light-weight backtraces that 
> don't depend on debug / unwind info), it's at least possible there are 
> architecture-specific choices regarding keeping frame pointers involved 
> here.

I believe in those cases targets already force the frame pointer as required,
for example msp430 sets the frame pointer if unwind tables are emitted
irrespectively of the command-line or default setting. Various other targets
don't even use frame_pointer_needed and just do their own thing.

Wilco
Jeff Law Nov. 8, 2017, 5:58 p.m. UTC | #4
On 11/08/2017 10:47 AM, Wilco Dijkstra wrote:
> Joseph Myers wrote:
>> On Fri, 3 Nov 2017, Wilco Dijkstra wrote:
>>
>>> Almost all targets add an explict -fomit-frame-pointer in the target specific
>>> options.  Rather than doing this in a target-specific way, do this in the
>>
>> Which targets do not?  You should explicitly list them and CC their 
>> maintainers and seek confirmation that such a change is appropriate for 
>> them.
> 
> The targets that don't explicitly enable -fomit-frame-pointer in the target
> options or force it internally are bfin, ft32, h8300, m68k - I've CCd the
> maintainers (it seems there is no-one for h8300).
Which means it's probably myself or Alex for the H8 :(  Some things you
can never manage to get rid of.

I'd actually prefer to deprecate the H8 and M68k.  But assuming that's
not going to happen in the immediate future I think dropping frame
pointers on those targets is appropriate as long as we're generating
dwarf frame info.

For deeply embedded targets that don't want the overhead of dwarf, well,
IMHO, they can add -fno-omit-frame-pointer explicitly :-)


> 
>> The addition of -fomit-frame-pointer through this mechanism was a 
>> replacement for the old target macro CAN_DEBUG_WITHOUT_FP.  It may now be 
>> the cases that with DWARF debug info, having or not having a frame pointer 
>> is not particularly relevant to debugging.  But since there are other 
>> reasons people may want a frame pointer (e.g. light-weight backtraces that 
>> don't depend on debug / unwind info), it's at least possible there are 
>> architecture-specific choices regarding keeping frame pointers involved 
>> here.
> 
> I believe in those cases targets already force the frame pointer as required,
> for example msp430 sets the frame pointer if unwind tables are emitted
> irrespectively of the command-line or default setting. Various other targets
> don't even use frame_pointer_needed and just do their own thing.
I've had the "pleasure" of going round and round on this repeatedly
through the years with the kernel teams on this.  Essentially they
didn't want to embed the dwarf2 unwinder in the kernel or have all those
pages of unwind data.  Instead they strongly preferred to have a frame
pointer to facilitate easy and fast unwinding.

So  my concern is to make sure the kernel folks, particularly in the
ia32 world aren't going to get hosed by this change.  If we're changing
the default it needs to be signaled to them so that they can ensure that
if they want frame pointers that they still get them.

jeff
Wilco Dijkstra Nov. 8, 2017, 6:16 p.m. UTC | #5
Jeff Law wrote:

> I'd actually prefer to deprecate the H8 and M68k.  But assuming that's
> not going to happen in the immediate future I think dropping frame
> pointers on those targets is appropriate as long as we're generating
> dwarf frame info.

Is there a way to check a target does not generate dwarf? I thought that
was the default.

> > I believe in those cases targets already force the frame pointer as required,
> > for example msp430 sets the frame pointer if unwind tables are emitted
> > irrespectively of the command-line or default setting. Various other targets
> > don't even use frame_pointer_needed and just do their own thing.
> I've had the "pleasure" of going round and round on this repeatedly
> through the years with the kernel teams on this.  Essentially they
> didn't want to embed the dwarf2 unwinder in the kernel or have all those
> pages of unwind data.  Instead they strongly preferred to have a frame
> pointer to facilitate easy and fast unwinding.

A frame pointer does not facilitate unwinding, it can give a backtrace at best.

But indeed, frame pointers, unwinding and stack chains are often confused
despite being completely orthogonal concepts...

> So  my concern is to make sure the kernel folks, particularly in the
> ia32 world aren't going to get hosed by this change.  If we're changing
> the default it needs to be signaled to them so that they can ensure that
> if they want frame pointers that they still get them.

x86/x64 is not affected since it already omits the frame pointer by default (like
almost all targets in a target specific way). This patch is about making that
the global default precisely because pretty much every target already has it
as the default.

Wilco
Andreas Schwab Nov. 8, 2017, 8:19 p.m. UTC | #6
On Nov 08 2017, Wilco Dijkstra <Wilco.Dijkstra@arm.com> wrote:

> Joseph Myers wrote:
>> On Fri, 3 Nov 2017, Wilco Dijkstra wrote:
>>
>> > Almost all targets add an explict -fomit-frame-pointer in the target specific
>> > options.  Rather than doing this in a target-specific way, do this in the
>>
>> Which targets do not?  You should explicitly list them and CC their 
>> maintainers and seek confirmation that such a change is appropriate for 
>> them.
>
> The targets that don't explicitly enable -fomit-frame-pointer in the target
> options or force it internally are bfin, ft32, h8300, m68k - I've CCd the
> maintainers (it seems there is no-one for h8300).

For m68k, adding -fomit-frame-pointer by default is ok.

Andreas.
Jeff Law Nov. 8, 2017, 11:20 p.m. UTC | #7
On 11/08/2017 11:16 AM, Wilco Dijkstra wrote:
> Jeff Law wrote:
> 
>> I'd actually prefer to deprecate the H8 and M68k.  But assuming that's
>> not going to happen in the immediate future I think dropping frame
>> pointers on those targets is appropriate as long as we're generating
>> dwarf frame info.
> 
> Is there a way to check a target does not generate dwarf? I thought that
> was the default.
Hmm, looks like H8 is ELF only at this point and unconditionally turns
on dwarf2 debug records and has bits to enable dwarf2 CFI records.

I suspect -gstabs would likely turn all that off, but well, the more I
think about it, I don't care :-)


> 
>>> I believe in those cases targets already force the frame pointer as required,
>>> for example msp430 sets the frame pointer if unwind tables are emitted
>>> irrespectively of the command-line or default setting. Various other targets
>>> don't even use frame_pointer_needed and just do their own thing.
>> I've had the "pleasure" of going round and round on this repeatedly
>> through the years with the kernel teams on this.  Essentially they
>> didn't want to embed the dwarf2 unwinder in the kernel or have all those
>> pages of unwind data.  Instead they strongly preferred to have a frame
>> pointer to facilitate easy and fast unwinding.
> 
> A frame pointer does not facilitate unwinding, it can give a backtrace at best.
Sorry.  I was being imprecise in my choice of words.   A backtrace is
what the kernel guys need for various reasons.  In some cases the
backtrace is generated at interrupt time (handling of profiling events),
so it can't depend on the dwarf interpreter or the dwarf tables.

>> So  my concern is to make sure the kernel folks, particularly in the
>> ia32 world aren't going to get hosed by this change.  If we're changing
>> the default it needs to be signaled to them so that they can ensure that
>> if they want frame pointers that they still get them.
> 
> x86/x64 is not affected since it already omits the frame pointer by default (like
> almost all targets in a target specific way). This patch is about making that
> the global default precisely because pretty much every target already has it
> as the default.
Yea, I guess we fixed 32bit x86 eons ago.

So I think the final conclusion is to go with your change.  If there's
any fallout on h8 or m68k we'll deal with it.

Jeff
James Bowman Nov. 11, 2017, 2:06 a.m. UTC | #8
Andreas Schwab wrote:
>> Joseph Myers wrote:
>>> On Fri, 3 Nov 2017, Wilco Dijkstra wrote:
>>>
>>> > Almost all targets add an explict -fomit-frame-pointer in the target specific
>>> > options.  Rather than doing this in a target-specific way, do this in the
>>>
>>> Which targets do not?  You should explicitly list them and CC their
>>> maintainers and seek confirmation that such a change is appropriate for
>>> them.
>>
>> The targets that don't explicitly enable -fomit-frame-pointer in the target
>> options or force it internally are bfin, ft32, h8300, m68k - I've CCd the
>> maintainers (it seems there is no-one for h8300).
>
>For m68k, adding -fomit-frame-pointer by default is ok.

For ft32, adding -fomit-frame-pointer by default is ok.

James.
Wilco Dijkstra Nov. 15, 2017, 5:38 p.m. UTC | #9
Sandra Loosemore wrote:

> I'd prefer that you remove the reference to configure options entirely 
> here.  Nowadays most GCC users install a package provided by their OS 
> distribution, Linaro, etc, rather than trying to build GCC from scratch.

OK, I've removed that reference. Similarly the FRAME_POINTER_REQUIRED
bit as that statement is not only irrelevant but also completely incorrect.

> > +Enabled at levels @option{-O}, @option{-O1}, @option{-O2}, @option{-O3},
> > +@option{-Os} and @option{-Og}.
>
> This last sentence makes no sense.  If the option is now enabled by 
> default, then the optimization level is irrelevant.

It's enabled from -O onwards, so I've changed it to the standard form used
elsewhere and updated the table for -O:

+Enabled by default at @option{-O} and higher.

Here is the cleaned up and simplified version:


diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 2ef88e081f982f5619132cc33ce23c3fb542ae11..158c9ae3f1297a1265fc974cd3e6825d8f5be096 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -7258,6 +7258,7 @@ compilation time.
 -fipa-reference @gol
 -fmerge-constants @gol
 -fmove-loop-invariants @gol
+-fomit-frame-pointer @gol
 -freorder-blocks @gol
 -fshrink-wrap @gol
 -fshrink-wrap-separate @gol
@@ -7282,9 +7283,6 @@ compilation time.
 -ftree-ter @gol
 -funit-at-a-time}
 
-@option{-O} also turns on @option{-fomit-frame-pointer} on machines
-where doing so does not interfere with debugging.
-
 @item -O2
 @opindex O2
 Optimize even more.  GCC performs nearly all supported optimizations
@@ -7436,29 +7434,18 @@ The default is @option{-ffp-contract=fast}.
 
 @item -fomit-frame-pointer
 @opindex fomit-frame-pointer
-Don't keep the frame pointer in a register for functions that
-don't need one.  This avoids the instructions to save, set up and
-restore frame pointers; it also makes an extra register available
-in many functions.  @strong{It also makes debugging impossible on
-some machines.}
-
-On some machines, such as the VAX, this flag has no effect, because
-the standard calling sequence automatically handles the frame pointer
-and nothing is saved by pretending it doesn't exist.  The
-machine-description macro @code{FRAME_POINTER_REQUIRED} controls
-whether a target machine supports this flag.  @xref{Registers,,Register
-Usage, gccint, GNU Compiler Collection (GCC) Internals}.
-
-The default setting (when not optimizing for
-size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is
-@option{-fomit-frame-pointer}.  You can configure GCC with the
-@option{--enable-frame-pointer} configure option to change the default.
-
-Note that @option{-fno-omit-frame-pointer} doesn't force a new stack
-frame for all functions if it isn't otherwise needed, and hence doesn't
-guarantee a new frame pointer for all functions.
+Omit the frame pointer in functions that don't need one.  This avoids the
+instructions to save, set up and restore the frame pointer; on many targets
+it also makes an extra register available.
 
-Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
+On some targets this flag has no effect because the standard calling sequence
+always uses a frame pointer, so it cannot be omitted.
+
+Note that @option{-fno-omit-frame-pointer} doesn't guarantee the frame pointer
+is used in all functions.  Several targets always omit the frame pointer in
+leaf functions.
+
+Enabled by default at @option{-O} and higher.
 
 @item -foptimize-sibling-calls
 @opindex foptimize-sibling-calls
@@ -16753,9 +16740,7 @@ Certain other options, such as @option{-mid-shared-library} and
 @opindex momit-leaf-frame-pointer
 Don't keep the frame pointer in a register for leaf functions.  This
 avoids the instructions to save, set up and restore frame pointers and
-makes an extra register available in leaf functions.  The option
-@option{-fomit-frame-pointer} removes the frame pointer for all functions,
-which might make debugging harder.
+makes an extra register available in leaf functions.
 
 @item -mspecld-anomaly
 @opindex mspecld-anomaly
Sandra Loosemore Nov. 15, 2017, 11:22 p.m. UTC | #10
On 11/15/2017 10:38 AM, Wilco Dijkstra wrote:
> Sandra Loosemore wrote:
> 
>> I'd prefer that you remove the reference to configure options entirely
>> here.  Nowadays most GCC users install a package provided by their OS
>> distribution, Linaro, etc, rather than trying to build GCC from scratch.
> 
> OK, I've removed that reference. Similarly the FRAME_POINTER_REQUIRED
> bit as that statement is not only irrelevant but also completely incorrect.
> 
>>> +Enabled at levels @option{-O}, @option{-O1}, @option{-O2}, @option{-O3},
>>> +@option{-Os} and @option{-Og}.
>>
>> This last sentence makes no sense.  If the option is now enabled by
>> default, then the optimization level is irrelevant.
> 
> It's enabled from -O onwards, so I've changed it to the standard form used
> elsewhere and updated the table for -O:
> 
> +Enabled by default at @option{-O} and higher.
> 
> Here is the cleaned up and simplified version:
> 
> [snip]

Thanks, this patch is OK with me.

-Sandra
Ramana Radhakrishnan Nov. 17, 2017, 10:19 p.m. UTC | #11
On 3 Nov 2017 16:55, "Wilco Dijkstra" <Wilco.Dijkstra@arm.com> wrote:

Almost all targets add an explict -fomit-frame-pointer in the target
specific
options.  Rather than doing this in a target-specific way, do this in the
generic options so it works identically across all targets.  In many cases
the
target no longer needs to define TARGET_OPTION_OPTIMIZATION_TABLE, reducing
the amount of target code.

Verified all targets built by buildmanyglibcs script do still build.

OK for commit?


ChangeLog:
2017-11-03  Wilco Dijkstra  <wdijkstr@arm.com>

        * opts.c (default_options_table): Add OPT_fomit_frame_pointer entry.





Err ...
 Doesn't this mean that targets that default to fno-omit-frame-poinyer need
to.continue to do so.?


Have you not changed the default on aarch64 without asking the maintainers
first for approval ?

Or am I missing something ?


Ramana

        * common/config/alpha/alpha-common.c (TARGET_OPTION_OPTIMIZATION_
TABLE):
        Remove OPT_fomit_frame_pointer entry.
        * common/config/arc/arc-common.c: Likewise.
        * common/config/arm/arm-common.c: Likewise.
        * common/config/avr/avr-common.c: Likewise.
        * common/config/c6x/c6x-common.c: Likewise.
        * common/config/cr16/cr16-common.c: Likewise.
        * common/config/cris/cris-common.c: Likewise.
        * common/config/epiphany/epiphany-common.c: Likewise.
        * common/config/fr30/fr30-common.c: Likewise.
        * common/config/frv/frv-common.c: Likewise.
        * common/config/ia64/ia64-common.c: Likewise.
        * common/config/iq2000/iq2000-common.c: Likewise.
        * common/config/lm32/lm32-common.c: Likewise.
        * common/config/m32r/m32r-common.c: Likewise.
        * common/config/mcore/mcore-common.c: Likewise.
        * common/config/microblaze/microblaze-common.c: Likewise.
        * common/config/mips/mips-common.c: Likewise.
        * common/config/mmix/mmix-common.c: Likewise.
        * common/config/mn10300/mn10300-common.c: Likewise.
        * common/config/nios2/nios2-common.c: Likewise.
        * common/config/pa/pa-common.c: Likewise.
        * common/config/pdp11/pdp11-common.c: Likewise.
        * common/config/powerpcspe/powerpcspe-common.c: Likewise.
        * common/config/riscv/riscv-common.c: Likewise.
        * common/config/rs6000/rs6000-common.c: Likewise.
        * common/config/rx/rx-common.c: Likewise.
        * common/config/s390/s390-common.c: Likewise.
        * common/config/sh/sh-common.c: Likewise.
        * common/config/sparc/sparc-common.c: Likewise.
        * common/config/tilegx/tilegx-common.c: Likewise.
        * common/config/tilepro/tilepro-common.c: Likewise.
        * common/config/v850/v850-common.c: Likewise.
        * common/config/visium/visium-common.c: Likewise.
        * common/config/xstormy16/xstormy16-common.c: Likewise.
        * common/config/xtensa/xtensa-common.c: Likewise.

    doc/
        * invoke.texi (-fomit-frame-pointer): Update documentation.

--
diff --git a/gcc/common/config/alpha/alpha-common.c
b/gcc/common/config/alpha/alpha-common.c
index be42282270bbc22e31e39bfb5307d7b4d82a84b9..
3a7d28d16225478e2fdae42c5610e55dc0b68c6f 100644
--- a/gcc/common/config/alpha/alpha-common.c
+++ b/gcc/common/config/alpha/alpha-common.c
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options alpha_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable redundant extension instructions removal at -O2 and higher.
*/
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/arc/arc-common.c b/gcc/common/config/arc/arc-
common.c
index 82e0dd383c9d627d39cc8cf904ef3c17a80f3da9..
c437313ba4192b1d6c79b047b40b02e5b7a4facb 100644
--- a/gcc/common/config/arc/arc-common.c
+++ b/gcc/common/config/arc/arc-common.c
@@ -47,7 +47,6 @@ arc_option_init_struct (struct gcc_options *opts)
 static const struct default_options arc_option_optimization_table[] =
   {
     { OPT_LEVELS_SIZE, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_mRcq, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_mRcw, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_msize_level_, NULL, 1 },
diff --git a/gcc/common/config/arm/arm-common.c b/gcc/common/config/arm/arm-
common.c
index 1588ca86e9b06282ed4358e072bc2b0224a11483..
5ae20fea916a636d078b9e1aa2b4e866b9da1259 100644
--- a/gcc/common/config/arm/arm-common.c
+++ b/gcc/common/config/arm/arm-common.c
@@ -36,7 +36,6 @@ static const struct default_options
arm_option_optimization_table[] =
   {
     /* Enable section anchors by default at -O1 or higher.  */
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/avr/avr-common.c b/gcc/common/config/avr/avr-
common.c
index 4bee9d670d9565f58da527c8604191e480df667a..
9bf0e0d0932b1da4ec2a91a980f87d9654f6072b 100644
--- a/gcc/common/config/avr/avr-common.c
+++ b/gcc/common/config/avr/avr-common.c
@@ -27,7 +27,6 @@
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options avr_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     // The only effect of -fcaller-saves might be that it triggers
     // a frame without need when it tries to be smart around calls.
     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
diff --git a/gcc/common/config/c6x/c6x-common.c b/gcc/common/config/c6x/c6x-
common.c
index 3de96a034f099de6af935392d0a829c21bd63fcc..
ec698a82e18e67785539da5c4359c60f1621d90e 100644
--- a/gcc/common/config/c6x/c6x-common.c
+++ b/gcc/common/config/c6x/c6x-common.c
@@ -32,7 +32,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement overriding of the optimization options.  */
 static const struct default_options c6x_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_frename_registers, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fmodulo_sched, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_freciprocal_math, NULL, 1 },
diff --git a/gcc/common/config/cr16/cr16-common.c
b/gcc/common/config/cr16/cr16-common.c
index 620a812eacf3369c7b0766db4f8176c45baced66..
a106fcbfde0c02497450e659bc8afb14109b2b21 100644
--- a/gcc/common/config/cr16/cr16-common.c
+++ b/gcc/common/config/cr16/cr16-common.c
@@ -24,14 +24,4 @@
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options cr16_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE cr16_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/cris/cris-common.c
b/gcc/common/config/cris/cris-common.c
index 94a3fcf87928b7caf841a23d622d7f23d934e58e..
79f976d07210cb719d7e0f998b1a08ba5e39a9e6 100644
--- a/gcc/common/config/cris/cris-common.c
+++ b/gcc/common/config/cris/cris-common.c
@@ -26,14 +26,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options cris_option_optimization_table[] =
-  {
-    { OPT_LEVELS_2_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* TARGET_HANDLE_OPTION worker.  We just store the values into local
    variables here.  Checks for correct semantics are in
    cris_option_override.  */
@@ -98,7 +90,5 @@ cris_handle_option (struct gcc_options *opts,
 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT |
CRIS_SUBTARGET_DEFAULT)
 #undef TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION cris_handle_option
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE cris_option_optimization_table

 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/epiphany/epiphany-common.c
b/gcc/common/config/epiphany/epiphany-common.c
index ced64cd4e5ad2e17b737eb7b382be78ffa5c077e..
f837a6293b3dcea2b7b45b5c79c0a12f5d1c7ccd 100644
--- a/gcc/common/config/epiphany/epiphany-common.c
+++ b/gcc/common/config/epiphany/epiphany-common.c
@@ -38,7 +38,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options epiphany_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable section anchors by default at -O1 or higher.  */
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/fr30/fr30-common.c
b/gcc/common/config/fr30/fr30-common.c
index 9388cca1a7c57ca89318ab86576f2405d27838ba..
1dd001ecf7e410d9939960355bde40bada739db6 100644
--- a/gcc/common/config/fr30/fr30-common.c
+++ b/gcc/common/config/fr30/fr30-common.c
@@ -24,17 +24,7 @@
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options fr30_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info

-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE fr30_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/frv/frv-common.c b/gcc/common/config/frv/frv-
common.c
index 9c2399ba6834b22d74f43856b8178ca04acb3588..
77062bbf2f4b6d3463181303fc2643c804add98c 100644
--- a/gcc/common/config/frv/frv-common.c
+++ b/gcc/common/config/frv/frv-common.c
@@ -32,13 +32,6 @@ along with GCC; see the file COPYING3.  If not see
 #define MASK_DEFAULT_ALLOC_CC  0
 #endif

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options frv_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS            \
   (MASK_DEFAULT_ALLOC_CC                       \
@@ -48,7 +41,5 @@ static const struct default_options
frv_option_optimization_table[] =
    | MASK_VLIW_BRANCH                          \
    | MASK_MULTI_CE                             \
    | MASK_NESTED_CE)
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE frv_option_optimization_table

 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/ia64/ia64-common.c
b/gcc/common/config/ia64/ia64-common.c
index 86e54e392ba8f9a313b2b1cd72294bf00baefd47..
ab8c33b577ff83ae82cb847929baedd6aa92ecc4 100644
--- a/gcc/common/config/ia64/ia64-common.c
+++ b/gcc/common/config/ia64/ia64-common.c
@@ -33,7 +33,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement overriding of the optimization options.  */
 static const struct default_options ia64_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
     SUBTARGET_OPTIMIZATION_OPTIONS,
 #endif
diff --git a/gcc/common/config/iq2000/iq2000-common.c
b/gcc/common/config/iq2000/iq2000-common.c
index 9f36ddcbbb52482ef5ee6262f3bfcc6863fc2bcc..
04f9f670133cd10c7a0e9353e98cc0839c0b189a 100644
--- a/gcc/common/config/iq2000/iq2000-common.c
+++ b/gcc/common/config/iq2000/iq2000-common.c
@@ -24,14 +24,4 @@ along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options iq2000_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE iq2000_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/lm32/lm32-common.c
b/gcc/common/config/lm32/lm32-common.c
index 969fce25841edfc5eda06cf0a43667b24246911b..
7bd0ab072ddbb25b70e4993cb483503f0ee29926 100644
--- a/gcc/common/config/lm32/lm32-common.c
+++ b/gcc/common/config/lm32/lm32-common.c
@@ -25,16 +25,6 @@
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options lm32_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE lm32_option_optimization_table
-
 #undef TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info

diff --git a/gcc/common/config/m32r/m32r-common.c
b/gcc/common/config/m32r/m32r-common.c
index d2add8dd5e56bd6c736f9220ea0578ac23c79f77..
b56dbb8311c6c6fdd3e44b1bff110937ac66422f 100644
--- a/gcc/common/config/m32r/m32r-common.c
+++ b/gcc/common/config/m32r/m32r-common.c
@@ -26,12 +26,6 @@
 #include "opts.h"
 #include "flags.h"

-static const struct default_options m32r_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */

 static bool
@@ -65,8 +59,6 @@ m32r_handle_option (struct gcc_options *opts,
 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_CPU_DEFAULT
 #undef  TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION m32r_handle_option
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE m32r_option_optimization_table

 #undef  TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO              sjlj_except_unwind_info
diff --git a/gcc/common/config/mcore/mcore-common.c
b/gcc/common/config/mcore/mcore-common.c
index 03f70a95d31b0e609e93492dc4c16b16e12c16ee..
77958bb88ed643c757e4285c47c71bef81ed9870 100644
--- a/gcc/common/config/mcore/mcore-common.c
+++ b/gcc/common/config/mcore/mcore-common.c
@@ -33,7 +33,6 @@
 static const struct default_options mcore_option_optimization_table[] =
   {
     { OPT_LEVELS_1_PLUS, OPT_ffunction_cse, NULL, 0 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
     { OPT_LEVELS_ALL, OPT_fschedule_insns2, NULL, 0 },
diff --git a/gcc/common/config/microblaze/microblaze-common.c
b/gcc/common/config/microblaze/microblaze-common.c
index 49756633056f0d6080b32d4621a48426a841b09f..
448a7acd539a73986c0541ef3e915fe457f37401 100644
--- a/gcc/common/config/microblaze/microblaze-common.c
+++ b/gcc/common/config/microblaze/microblaze-common.c
@@ -24,17 +24,7 @@
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options microblaze_option_optimization_table[]
=
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS    TARGET_DEFAULT

-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE microblaze_option_
optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/mips/mips-common.c
b/gcc/common/config/mips/mips-common.c
index 525af741d58c7b46de93cce0e5e8d4447a7a55dd..
07ba06049cb43c0167363f4e371d0f5e7769b264 100644
--- a/gcc/common/config/mips/mips-common.c
+++ b/gcc/common/config/mips/mips-common.c
@@ -56,16 +56,6 @@ mips_handle_option (struct gcc_options *opts,
     }
 }

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options mips_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE mips_option_optimization_table
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS            \
   (TARGET_DEFAULT                              \
diff --git a/gcc/common/config/mmix/mmix-common.c
b/gcc/common/config/mmix/mmix-common.c
index dd281394c0b4221f8c1f630a43c00127588d1508..
f73ad980cd36718d9689f42dbd11f0afb4096244 100644
--- a/gcc/common/config/mmix/mmix-common.c
+++ b/gcc/common/config/mmix/mmix-common.c
@@ -24,18 +24,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options mmix_option_optimization_table[] =
-  {
-    { OPT_LEVELS_2_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT

-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE mmix_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/mn10300/mn10300-common.c
b/gcc/common/config/mn10300/mn10300-common.c
index e2df672ef665541653d694918020fdad0a995d17..
74fa463d8d01844201aa8d832e32c6b4b1c1ea47 100644
--- a/gcc/common/config/mn10300/mn10300-common.c
+++ b/gcc/common/config/mn10300/mn10300-common.c
@@ -29,7 +29,6 @@
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options mn10300_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* The STC algorithm produces the smallest code at -Os.  */
     { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_algorithm_, NULL,
       REORDER_BLOCKS_ALGORITHM_STC },
diff --git a/gcc/common/config/nios2/nios2-common.c
b/gcc/common/config/nios2/nios2-common.c
index 1366b1fffeaf2c7e0fe355c6d270ca31044b476d..
36750ad1d3b91e64f4af519d7796caae6d146d76 100644
--- a/gcc/common/config/nios2/nios2-common.c
+++ b/gcc/common/config/nios2/nios2-common.c
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options nios2_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_mfast_sw_div, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/pa/pa-common.c b/gcc/common/config/pa/pa-
common.c
index 13cc32b20c519c94a9fc01a9e9406226dff6a3af..
ea943b9e04786ff31172f9533a7f157273f9602c 100644
--- a/gcc/common/config/pa/pa-common.c
+++ b/gcc/common/config/pa/pa-common.c
@@ -26,13 +26,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options pa_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */

 static bool
@@ -68,8 +61,6 @@ pa_handle_option (struct gcc_options *opts,
     }
 }

-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE pa_option_optimization_table
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | TARGET_CPU_DEFAULT)
 #undef TARGET_HANDLE_OPTION
diff --git a/gcc/common/config/pdp11/pdp11-common.c
b/gcc/common/config/pdp11/pdp11-common.c
index 47512ef0071d18b5d7b177688ebb31849635b163..
6c3044f042c5cd24cfee6b4f11088c0735d7360c 100644
--- a/gcc/common/config/pdp11/pdp11-common.c
+++ b/gcc/common/config/pdp11/pdp11-common.c
@@ -26,14 +26,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options pdp11_option_optimization_table[] =
-  {
-    { OPT_LEVELS_3_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */

 static bool
@@ -70,8 +62,6 @@ pdp11_option_init_struct (struct gcc_options *opts)
   (MASK_FPU | MASK_45 | TARGET_UNIX_ASM_DEFAULT)
 #undef TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION pdp11_handle_option
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE pdp11_option_optimization_table
 #undef TARGET_OPTION_INIT_STRUCT
 #define TARGET_OPTION_INIT_STRUCT pdp11_option_init_struct

diff --git a/gcc/common/config/powerpcspe/powerpcspe-common.c
b/gcc/common/config/powerpcspe/powerpcspe-common.c
index 3c0106ae555d80ded696a735d7213ef1e8588f4b..
0458c4070861e4cd761bdd2fd6b13b2721933e11 100644
--- a/gcc/common/config/powerpcspe/powerpcspe-common.c
+++ b/gcc/common/config/powerpcspe/powerpcspe-common.c
@@ -31,7 +31,6 @@
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options rs6000_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable -fsched-pressure for first pass instruction scheduling.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/riscv/riscv-common.c
b/gcc/common/config/riscv/riscv-common.c
index 50f1485f87a406dcf4ecf5571145980e965ce309..
0408cb384cd8875419d9c287d52b1b8d9f3548d7 100644
--- a/gcc/common/config/riscv/riscv-common.c
+++ b/gcc/common/config/riscv/riscv-common.c
@@ -117,7 +117,6 @@ riscv_handle_option (struct gcc_options *opts,
 static const struct default_options riscv_option_optimization_table[] =
   {
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/rs6000/rs6000-common.c
b/gcc/common/config/rs6000/rs6000-common.c
index 07537543ddcc40d1ab820ccd9671224129d83241..
915c4694fe5108f1dfc154cfb44f3d51caf2a340 100644
--- a/gcc/common/config/rs6000/rs6000-common.c
+++ b/gcc/common/config/rs6000/rs6000-common.c
@@ -31,7 +31,6 @@
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options rs6000_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable -fsched-pressure for first pass instruction scheduling.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/rx/rx-common.c b/gcc/common/config/rx/rx-
common.c
index 961d05af1e3b4a3b3918037297b129575916e5eb..
ef6f82302a3c0101fff91ca14d5062e465b3a5b6 100644
--- a/gcc/common/config/rx/rx-common.c
+++ b/gcc/common/config/rx/rx-common.c
@@ -70,19 +70,9 @@ rx_handle_option (struct gcc_options *opts,
   return true;
 }

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options rx_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef  TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION                   rx_handle_option

-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE       rx_option_optimization_table
-
 #undef  TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO              sjlj_except_unwind_info

diff --git a/gcc/common/config/s390/s390-common.c
b/gcc/common/config/s390/s390-common.c
index 10418a36c20b8f2b8301e71c18b9d660676e1f0e..
b53ea6e30a969e7b32d1f15c01c5ec62717b1d95 100644
--- a/gcc/common/config/s390/s390-common.c
+++ b/gcc/common/config/s390/s390-common.c
@@ -56,8 +56,6 @@ EXPORTED_CONST int processor_flags_table[] =

 static const struct default_options s390_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-
     /* Enable -fsched-pressure by default when optimizing.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },

diff --git a/gcc/common/config/sh/sh-common.c b/gcc/common/config/sh/sh-
common.c
index e9903cc9c4e92a237f0ac2c2a3c2e33480a3d9e8..
395da07bd7d301037e18c6d8530f75d916c9fbac 100644
--- a/gcc/common/config/sh/sh-common.c
+++ b/gcc/common/config/sh/sh-common.c
@@ -30,7 +30,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Set default optimization options.  */
 static const struct default_options sh_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_SIZE, OPT_mdiv_, SH_DIV_STR_FOR_SIZE, 1 },
     { OPT_LEVELS_0_ONLY, OPT_mdiv_, "", 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/sparc/sparc-common.c
b/gcc/common/config/sparc/sparc-common.c
index 0d196697cc288cf082d93ae080c49e6e74929c2e..
87fcac49486d947f2c32d4416475acb3df81c172 100644
--- a/gcc/common/config/sparc/sparc-common.c
+++ b/gcc/common/config/sparc/sparc-common.c
@@ -27,7 +27,6 @@ along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options sparc_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable redundant extension instructions removal at -O2 and higher.
*/
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/tilegx/tilegx-common.c
b/gcc/common/config/tilegx/tilegx-common.c
index 96d5b25464f640ae50564ce0d42f063122993e63..
7fca8bb08f1258080db8ce51f8f84b74d2796d8d 100644
--- a/gcc/common/config/tilegx/tilegx-common.c
+++ b/gcc/common/config/tilegx/tilegx-common.c
@@ -29,7 +29,6 @@
 #include "flags.h"

 static const struct default_options tilegx_option_optimization_table[] = {
-  {OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1},
   /* Scheduling and bundling are super important for our architecture, so
      enable them at -O1. */
   {OPT_LEVELS_1_PLUS, OPT_fschedule_insns, NULL, 1},
diff --git a/gcc/common/config/tilepro/tilepro-common.c
b/gcc/common/config/tilepro/tilepro-common.c
index 50ac7a9404b00cedde94b649e8f10d739a005d14..
9dddf6528e56894a3e86a67e7c42a9a1f68d6f0c 100644
--- a/gcc/common/config/tilepro/tilepro-common.c
+++ b/gcc/common/config/tilepro/tilepro-common.c
@@ -29,7 +29,6 @@
 #include "flags.h"

 static const struct default_options tilepro_option_optimization_table[] = {
-  {OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1},
   /* Scheduling and bundling are super important for our architecture, so
      enable them at -O1. */
   {OPT_LEVELS_1_PLUS, OPT_fschedule_insns, NULL, 1},
diff --git a/gcc/common/config/v850/v850-common.c
b/gcc/common/config/v850/v850-common.c
index 032ef888966e5319460cde07bf0a6caabbd8cb14..
b30f9cb0b673ef1621d2538b1ac82bece1547042 100644
--- a/gcc/common/config/v850/v850-common.c
+++ b/gcc/common/config/v850/v850-common.c
@@ -111,7 +111,6 @@ v850_handle_option (struct gcc_options *opts,

 static const struct default_options v850_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Note - we no longer enable MASK_EP when optimizing.  This is
        because of a hardware bug which stops the SLD and SST instructions
        from correctly detecting some hazards.  If the user is sure that
diff --git a/gcc/common/config/visium/visium-common.c
b/gcc/common/config/visium/visium-common.c
index 6a29a243b325da1e66c963a773be3cbd2dfe66df..
7d7c647c03b0c1d74515df999c5b6cff939aaa7d 100644
--- a/gcc/common/config/visium/visium-common.c
+++ b/gcc/common/config/visium/visium-common.c
@@ -25,14 +25,4 @@ along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Set default optimization options.  */
-static const struct default_options visium_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE visium_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/xstormy16/xstormy16-common.c
b/gcc/common/config/xstormy16/xstormy16-common.c
index 6e70d94cf735a7943670e24d6769a2b30463b68a..
eb24c6fbdd57d208b5a96bc7ab78279eaad6a8bd 100644
--- a/gcc/common/config/xstormy16/xstormy16-common.c
+++ b/gcc/common/config/xstormy16/xstormy16-common.c
@@ -24,14 +24,4 @@
 #include "common/common-target.h"
 #include "common/common-target-def.h"

-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options xstorym16_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE xstorym16_option_optimization_
table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/xtensa/xtensa-common.c
b/gcc/common/config/xtensa/xtensa-common.c
index 24521ec9787a43e115c021ff9b39a6a1ac142e42..
53ad976b5000dd23e33a0b7682fb7b08984f4d36 100644
--- a/gcc/common/config/xtensa/xtensa-common.c
+++ b/gcc/common/config/xtensa/xtensa-common.c
@@ -28,7 +28,6 @@ along with GCC; see the file COPYING3.  If not see

 static const struct default_options xtensa_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Reordering blocks for Xtensa is not a good idea unless the
        compiler understands the range of conditional branches.
        Currently all branch relaxation for Xtensa is handled in the
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 71b2445f70fd5b832c68c08e69e71d8ecad37a4a..
1c56f4b12495fe97c604200ef245c9fa02684b0f 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -7436,16 +7436,17 @@ machine-description macro
@code{FRAME_POINTER_REQUIRED} controls
 whether a target machine supports this flag.  @xref{Registers,,Register
 Usage, gccint, GNU Compiler Collection (GCC) Internals}.

-The default setting (when not optimizing for
-size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is
-@option{-fomit-frame-pointer}.  You can configure GCC with the
-@option{--enable-frame-pointer} configure option to change the default.
+The default setting is @option{-fomit-frame-pointer}.  You can configure
GCC
+with the @option{--enable-frame-pointer} configure option to change the
default.

 Note that @option{-fno-omit-frame-pointer} doesn't force a new stack
 frame for all functions if it isn't otherwise needed, and hence doesn't
-guarantee a new frame pointer for all functions.
+guarantee a new frame pointer for all functions.  Several targets always
omit
+the frame pointer in leaf functions.
+
+Enabled at levels @option{-O}, @option{-O1}, @option{-O2}, @option{-O3},
+@option{-Os} and @option{-Og}.

-Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.

 @item -foptimize-sibling-calls
 @opindex foptimize-sibling-calls
diff --git a/gcc/opts.c b/gcc/opts.c
index ee95c84cdef93b568aee0c0ee185332cc89870f6..
6600a5afd488e89262e6327f7370057c7ae234ba 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -476,6 +476,7 @@ static const struct default_options
default_options_table[] =
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
+    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },

     /* -O2 optimizations.  */
     { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },
diff mbox series

Patch

diff --git a/gcc/common/config/alpha/alpha-common.c b/gcc/common/config/alpha/alpha-common.c
index be42282270bbc22e31e39bfb5307d7b4d82a84b9..3a7d28d16225478e2fdae42c5610e55dc0b68c6f 100644
--- a/gcc/common/config/alpha/alpha-common.c
+++ b/gcc/common/config/alpha/alpha-common.c
@@ -30,7 +30,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options alpha_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable redundant extension instructions removal at -O2 and higher.  */
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/arc/arc-common.c b/gcc/common/config/arc/arc-common.c
index 82e0dd383c9d627d39cc8cf904ef3c17a80f3da9..c437313ba4192b1d6c79b047b40b02e5b7a4facb 100644
--- a/gcc/common/config/arc/arc-common.c
+++ b/gcc/common/config/arc/arc-common.c
@@ -47,7 +47,6 @@  arc_option_init_struct (struct gcc_options *opts)
 static const struct default_options arc_option_optimization_table[] =
   {
     { OPT_LEVELS_SIZE, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_mRcq, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_mRcw, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_msize_level_, NULL, 1 },
diff --git a/gcc/common/config/arm/arm-common.c b/gcc/common/config/arm/arm-common.c
index 1588ca86e9b06282ed4358e072bc2b0224a11483..5ae20fea916a636d078b9e1aa2b4e866b9da1259 100644
--- a/gcc/common/config/arm/arm-common.c
+++ b/gcc/common/config/arm/arm-common.c
@@ -36,7 +36,6 @@  static const struct default_options arm_option_optimization_table[] =
   {
     /* Enable section anchors by default at -O1 or higher.  */
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/avr/avr-common.c b/gcc/common/config/avr/avr-common.c
index 4bee9d670d9565f58da527c8604191e480df667a..9bf0e0d0932b1da4ec2a91a980f87d9654f6072b 100644
--- a/gcc/common/config/avr/avr-common.c
+++ b/gcc/common/config/avr/avr-common.c
@@ -27,7 +27,6 @@ 
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options avr_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     // The only effect of -fcaller-saves might be that it triggers
     // a frame without need when it tries to be smart around calls.
     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
diff --git a/gcc/common/config/c6x/c6x-common.c b/gcc/common/config/c6x/c6x-common.c
index 3de96a034f099de6af935392d0a829c21bd63fcc..ec698a82e18e67785539da5c4359c60f1621d90e 100644
--- a/gcc/common/config/c6x/c6x-common.c
+++ b/gcc/common/config/c6x/c6x-common.c
@@ -32,7 +32,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement overriding of the optimization options.  */
 static const struct default_options c6x_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_frename_registers, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fmodulo_sched, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_freciprocal_math, NULL, 1 },
diff --git a/gcc/common/config/cr16/cr16-common.c b/gcc/common/config/cr16/cr16-common.c
index 620a812eacf3369c7b0766db4f8176c45baced66..a106fcbfde0c02497450e659bc8afb14109b2b21 100644
--- a/gcc/common/config/cr16/cr16-common.c
+++ b/gcc/common/config/cr16/cr16-common.c
@@ -24,14 +24,4 @@ 
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options cr16_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE cr16_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/cris/cris-common.c b/gcc/common/config/cris/cris-common.c
index 94a3fcf87928b7caf841a23d622d7f23d934e58e..79f976d07210cb719d7e0f998b1a08ba5e39a9e6 100644
--- a/gcc/common/config/cris/cris-common.c
+++ b/gcc/common/config/cris/cris-common.c
@@ -26,14 +26,6 @@  along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options cris_option_optimization_table[] =
-  {
-    { OPT_LEVELS_2_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* TARGET_HANDLE_OPTION worker.  We just store the values into local
    variables here.  Checks for correct semantics are in
    cris_option_override.  */
@@ -98,7 +90,5 @@  cris_handle_option (struct gcc_options *opts,
 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | CRIS_SUBTARGET_DEFAULT)
 #undef TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION cris_handle_option
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE cris_option_optimization_table
 
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/epiphany/epiphany-common.c b/gcc/common/config/epiphany/epiphany-common.c
index ced64cd4e5ad2e17b737eb7b382be78ffa5c077e..f837a6293b3dcea2b7b45b5c79c0a12f5d1c7ccd 100644
--- a/gcc/common/config/epiphany/epiphany-common.c
+++ b/gcc/common/config/epiphany/epiphany-common.c
@@ -38,7 +38,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options epiphany_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable section anchors by default at -O1 or higher.  */
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/fr30/fr30-common.c b/gcc/common/config/fr30/fr30-common.c
index 9388cca1a7c57ca89318ab86576f2405d27838ba..1dd001ecf7e410d9939960355bde40bada739db6 100644
--- a/gcc/common/config/fr30/fr30-common.c
+++ b/gcc/common/config/fr30/fr30-common.c
@@ -24,17 +24,7 @@ 
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options fr30_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info
 
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE fr30_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/frv/frv-common.c b/gcc/common/config/frv/frv-common.c
index 9c2399ba6834b22d74f43856b8178ca04acb3588..77062bbf2f4b6d3463181303fc2643c804add98c 100644
--- a/gcc/common/config/frv/frv-common.c
+++ b/gcc/common/config/frv/frv-common.c
@@ -32,13 +32,6 @@  along with GCC; see the file COPYING3.  If not see
 #define MASK_DEFAULT_ALLOC_CC	0
 #endif
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options frv_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS		\
   (MASK_DEFAULT_ALLOC_CC			\
@@ -48,7 +41,5 @@  static const struct default_options frv_option_optimization_table[] =
    | MASK_VLIW_BRANCH				\
    | MASK_MULTI_CE				\
    | MASK_NESTED_CE)
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE frv_option_optimization_table
 
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/ia64/ia64-common.c b/gcc/common/config/ia64/ia64-common.c
index 86e54e392ba8f9a313b2b1cd72294bf00baefd47..ab8c33b577ff83ae82cb847929baedd6aa92ecc4 100644
--- a/gcc/common/config/ia64/ia64-common.c
+++ b/gcc/common/config/ia64/ia64-common.c
@@ -33,7 +33,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement overriding of the optimization options.  */
 static const struct default_options ia64_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
     SUBTARGET_OPTIMIZATION_OPTIONS,
 #endif
diff --git a/gcc/common/config/iq2000/iq2000-common.c b/gcc/common/config/iq2000/iq2000-common.c
index 9f36ddcbbb52482ef5ee6262f3bfcc6863fc2bcc..04f9f670133cd10c7a0e9353e98cc0839c0b189a 100644
--- a/gcc/common/config/iq2000/iq2000-common.c
+++ b/gcc/common/config/iq2000/iq2000-common.c
@@ -24,14 +24,4 @@  along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options iq2000_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE iq2000_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/lm32/lm32-common.c b/gcc/common/config/lm32/lm32-common.c
index 969fce25841edfc5eda06cf0a43667b24246911b..7bd0ab072ddbb25b70e4993cb483503f0ee29926 100644
--- a/gcc/common/config/lm32/lm32-common.c
+++ b/gcc/common/config/lm32/lm32-common.c
@@ -25,16 +25,6 @@ 
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options lm32_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE lm32_option_optimization_table
-
 #undef TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info
 
diff --git a/gcc/common/config/m32r/m32r-common.c b/gcc/common/config/m32r/m32r-common.c
index d2add8dd5e56bd6c736f9220ea0578ac23c79f77..b56dbb8311c6c6fdd3e44b1bff110937ac66422f 100644
--- a/gcc/common/config/m32r/m32r-common.c
+++ b/gcc/common/config/m32r/m32r-common.c
@@ -26,12 +26,6 @@ 
 #include "opts.h"
 #include "flags.h"
 
-static const struct default_options m32r_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */
 
 static bool
@@ -65,8 +59,6 @@  m32r_handle_option (struct gcc_options *opts,
 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_CPU_DEFAULT
 #undef  TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION m32r_handle_option
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE m32r_option_optimization_table
 
 #undef  TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO		sjlj_except_unwind_info
diff --git a/gcc/common/config/mcore/mcore-common.c b/gcc/common/config/mcore/mcore-common.c
index 03f70a95d31b0e609e93492dc4c16b16e12c16ee..77958bb88ed643c757e4285c47c71bef81ed9870 100644
--- a/gcc/common/config/mcore/mcore-common.c
+++ b/gcc/common/config/mcore/mcore-common.c
@@ -33,7 +33,6 @@ 
 static const struct default_options mcore_option_optimization_table[] =
   {
     { OPT_LEVELS_1_PLUS, OPT_ffunction_cse, NULL, 0 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
     { OPT_LEVELS_ALL, OPT_fschedule_insns2, NULL, 0 },
diff --git a/gcc/common/config/microblaze/microblaze-common.c b/gcc/common/config/microblaze/microblaze-common.c
index 49756633056f0d6080b32d4621a48426a841b09f..448a7acd539a73986c0541ef3e915fe457f37401 100644
--- a/gcc/common/config/microblaze/microblaze-common.c
+++ b/gcc/common/config/microblaze/microblaze-common.c
@@ -24,17 +24,7 @@ 
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options microblaze_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS	TARGET_DEFAULT
 
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE microblaze_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/mips/mips-common.c b/gcc/common/config/mips/mips-common.c
index 525af741d58c7b46de93cce0e5e8d4447a7a55dd..07ba06049cb43c0167363f4e371d0f5e7769b264 100644
--- a/gcc/common/config/mips/mips-common.c
+++ b/gcc/common/config/mips/mips-common.c
@@ -56,16 +56,6 @@  mips_handle_option (struct gcc_options *opts,
     }
 }
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options mips_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE mips_option_optimization_table
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS		\
   (TARGET_DEFAULT				\
diff --git a/gcc/common/config/mmix/mmix-common.c b/gcc/common/config/mmix/mmix-common.c
index dd281394c0b4221f8c1f630a43c00127588d1508..f73ad980cd36718d9689f42dbd11f0afb4096244 100644
--- a/gcc/common/config/mmix/mmix-common.c
+++ b/gcc/common/config/mmix/mmix-common.c
@@ -24,18 +24,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options mmix_option_optimization_table[] =
-  {
-    { OPT_LEVELS_2_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT
 
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE mmix_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/mn10300/mn10300-common.c b/gcc/common/config/mn10300/mn10300-common.c
index e2df672ef665541653d694918020fdad0a995d17..74fa463d8d01844201aa8d832e32c6b4b1c1ea47 100644
--- a/gcc/common/config/mn10300/mn10300-common.c
+++ b/gcc/common/config/mn10300/mn10300-common.c
@@ -29,7 +29,6 @@ 
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options mn10300_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* The STC algorithm produces the smallest code at -Os.  */
     { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_algorithm_, NULL,
       REORDER_BLOCKS_ALGORITHM_STC },
diff --git a/gcc/common/config/nios2/nios2-common.c b/gcc/common/config/nios2/nios2-common.c
index 1366b1fffeaf2c7e0fe355c6d270ca31044b476d..36750ad1d3b91e64f4af519d7796caae6d146d76 100644
--- a/gcc/common/config/nios2/nios2-common.c
+++ b/gcc/common/config/nios2/nios2-common.c
@@ -30,7 +30,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options nios2_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_3_PLUS, OPT_mfast_sw_div, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/pa/pa-common.c b/gcc/common/config/pa/pa-common.c
index 13cc32b20c519c94a9fc01a9e9406226dff6a3af..ea943b9e04786ff31172f9533a7f157273f9602c 100644
--- a/gcc/common/config/pa/pa-common.c
+++ b/gcc/common/config/pa/pa-common.c
@@ -26,13 +26,6 @@  along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options pa_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */
 
 static bool
@@ -68,8 +61,6 @@  pa_handle_option (struct gcc_options *opts,
     }
 }
 
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE pa_option_optimization_table
 #undef TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | TARGET_CPU_DEFAULT)
 #undef TARGET_HANDLE_OPTION
diff --git a/gcc/common/config/pdp11/pdp11-common.c b/gcc/common/config/pdp11/pdp11-common.c
index 47512ef0071d18b5d7b177688ebb31849635b163..6c3044f042c5cd24cfee6b4f11088c0735d7360c 100644
--- a/gcc/common/config/pdp11/pdp11-common.c
+++ b/gcc/common/config/pdp11/pdp11-common.c
@@ -26,14 +26,6 @@  along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "flags.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-
-static const struct default_options pdp11_option_optimization_table[] =
-  {
-    { OPT_LEVELS_3_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 /* Implement TARGET_HANDLE_OPTION.  */
 
 static bool
@@ -70,8 +62,6 @@  pdp11_option_init_struct (struct gcc_options *opts)
   (MASK_FPU | MASK_45 | TARGET_UNIX_ASM_DEFAULT)
 #undef TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION pdp11_handle_option
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE pdp11_option_optimization_table
 #undef TARGET_OPTION_INIT_STRUCT
 #define TARGET_OPTION_INIT_STRUCT pdp11_option_init_struct
 
diff --git a/gcc/common/config/powerpcspe/powerpcspe-common.c b/gcc/common/config/powerpcspe/powerpcspe-common.c
index 3c0106ae555d80ded696a735d7213ef1e8588f4b..0458c4070861e4cd761bdd2fd6b13b2721933e11 100644
--- a/gcc/common/config/powerpcspe/powerpcspe-common.c
+++ b/gcc/common/config/powerpcspe/powerpcspe-common.c
@@ -31,7 +31,6 @@ 
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options rs6000_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable -fsched-pressure for first pass instruction scheduling.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/riscv/riscv-common.c b/gcc/common/config/riscv/riscv-common.c
index 50f1485f87a406dcf4ecf5571145980e965ce309..0408cb384cd8875419d9c287d52b1b8d9f3548d7 100644
--- a/gcc/common/config/riscv/riscv-common.c
+++ b/gcc/common/config/riscv/riscv-common.c
@@ -117,7 +117,6 @@  riscv_handle_option (struct gcc_options *opts,
 static const struct default_options riscv_option_optimization_table[] =
   {
     { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
   };
diff --git a/gcc/common/config/rs6000/rs6000-common.c b/gcc/common/config/rs6000/rs6000-common.c
index 07537543ddcc40d1ab820ccd9671224129d83241..915c4694fe5108f1dfc154cfb44f3d51caf2a340 100644
--- a/gcc/common/config/rs6000/rs6000-common.c
+++ b/gcc/common/config/rs6000/rs6000-common.c
@@ -31,7 +31,6 @@ 
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options rs6000_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable -fsched-pressure for first pass instruction scheduling.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/rx/rx-common.c b/gcc/common/config/rx/rx-common.c
index 961d05af1e3b4a3b3918037297b129575916e5eb..ef6f82302a3c0101fff91ca14d5062e465b3a5b6 100644
--- a/gcc/common/config/rx/rx-common.c
+++ b/gcc/common/config/rx/rx-common.c
@@ -70,19 +70,9 @@  rx_handle_option (struct gcc_options *opts,
   return true;
 }
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options rx_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
 #undef  TARGET_HANDLE_OPTION
 #define TARGET_HANDLE_OPTION			rx_handle_option
 
-#undef  TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE	rx_option_optimization_table
-
 #undef  TARGET_EXCEPT_UNWIND_INFO
 #define TARGET_EXCEPT_UNWIND_INFO		sjlj_except_unwind_info
 
diff --git a/gcc/common/config/s390/s390-common.c b/gcc/common/config/s390/s390-common.c
index 10418a36c20b8f2b8301e71c18b9d660676e1f0e..b53ea6e30a969e7b32d1f15c01c5ec62717b1d95 100644
--- a/gcc/common/config/s390/s390-common.c
+++ b/gcc/common/config/s390/s390-common.c
@@ -56,8 +56,6 @@  EXPORTED_CONST int processor_flags_table[] =
 
 static const struct default_options s390_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-
     /* Enable -fsched-pressure by default when optimizing.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
 
diff --git a/gcc/common/config/sh/sh-common.c b/gcc/common/config/sh/sh-common.c
index e9903cc9c4e92a237f0ac2c2a3c2e33480a3d9e8..395da07bd7d301037e18c6d8530f75d916c9fbac 100644
--- a/gcc/common/config/sh/sh-common.c
+++ b/gcc/common/config/sh/sh-common.c
@@ -30,7 +30,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Set default optimization options.  */
 static const struct default_options sh_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     { OPT_LEVELS_SIZE, OPT_mdiv_, SH_DIV_STR_FOR_SIZE, 1 },
     { OPT_LEVELS_0_ONLY, OPT_mdiv_, "", 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/sparc/sparc-common.c b/gcc/common/config/sparc/sparc-common.c
index 0d196697cc288cf082d93ae080c49e6e74929c2e..87fcac49486d947f2c32d4416475acb3df81c172 100644
--- a/gcc/common/config/sparc/sparc-common.c
+++ b/gcc/common/config/sparc/sparc-common.c
@@ -27,7 +27,6 @@  along with GCC; see the file COPYING3.  If not see
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
 static const struct default_options sparc_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Enable redundant extension instructions removal at -O2 and higher.  */
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
     { OPT_LEVELS_NONE, 0, NULL, 0 }
diff --git a/gcc/common/config/tilegx/tilegx-common.c b/gcc/common/config/tilegx/tilegx-common.c
index 96d5b25464f640ae50564ce0d42f063122993e63..7fca8bb08f1258080db8ce51f8f84b74d2796d8d 100644
--- a/gcc/common/config/tilegx/tilegx-common.c
+++ b/gcc/common/config/tilegx/tilegx-common.c
@@ -29,7 +29,6 @@ 
 #include "flags.h"
 
 static const struct default_options tilegx_option_optimization_table[] = {
-  {OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1},
   /* Scheduling and bundling are super important for our architecture, so
      enable them at -O1. */
   {OPT_LEVELS_1_PLUS, OPT_fschedule_insns, NULL, 1},
diff --git a/gcc/common/config/tilepro/tilepro-common.c b/gcc/common/config/tilepro/tilepro-common.c
index 50ac7a9404b00cedde94b649e8f10d739a005d14..9dddf6528e56894a3e86a67e7c42a9a1f68d6f0c 100644
--- a/gcc/common/config/tilepro/tilepro-common.c
+++ b/gcc/common/config/tilepro/tilepro-common.c
@@ -29,7 +29,6 @@ 
 #include "flags.h"
 
 static const struct default_options tilepro_option_optimization_table[] = {
-  {OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1},
   /* Scheduling and bundling are super important for our architecture, so
      enable them at -O1. */
   {OPT_LEVELS_1_PLUS, OPT_fschedule_insns, NULL, 1},
diff --git a/gcc/common/config/v850/v850-common.c b/gcc/common/config/v850/v850-common.c
index 032ef888966e5319460cde07bf0a6caabbd8cb14..b30f9cb0b673ef1621d2538b1ac82bece1547042 100644
--- a/gcc/common/config/v850/v850-common.c
+++ b/gcc/common/config/v850/v850-common.c
@@ -111,7 +111,6 @@  v850_handle_option (struct gcc_options *opts,
 
 static const struct default_options v850_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Note - we no longer enable MASK_EP when optimizing.  This is
        because of a hardware bug which stops the SLD and SST instructions
        from correctly detecting some hazards.  If the user is sure that
diff --git a/gcc/common/config/visium/visium-common.c b/gcc/common/config/visium/visium-common.c
index 6a29a243b325da1e66c963a773be3cbd2dfe66df..7d7c647c03b0c1d74515df999c5b6cff939aaa7d 100644
--- a/gcc/common/config/visium/visium-common.c
+++ b/gcc/common/config/visium/visium-common.c
@@ -25,14 +25,4 @@  along with GCC; see the file COPYING3.  If not see
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Set default optimization options.  */
-static const struct default_options visium_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE visium_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/xstormy16/xstormy16-common.c b/gcc/common/config/xstormy16/xstormy16-common.c
index 6e70d94cf735a7943670e24d6769a2b30463b68a..eb24c6fbdd57d208b5a96bc7ab78279eaad6a8bd 100644
--- a/gcc/common/config/xstormy16/xstormy16-common.c
+++ b/gcc/common/config/xstormy16/xstormy16-common.c
@@ -24,14 +24,4 @@ 
 #include "common/common-target.h"
 #include "common/common-target-def.h"
 
-/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
-static const struct default_options xstorym16_option_optimization_table[] =
-  {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
-    { OPT_LEVELS_NONE, 0, NULL, 0 }
-  };
-
-#undef TARGET_OPTION_OPTIMIZATION_TABLE
-#define TARGET_OPTION_OPTIMIZATION_TABLE xstorym16_option_optimization_table
-
 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
diff --git a/gcc/common/config/xtensa/xtensa-common.c b/gcc/common/config/xtensa/xtensa-common.c
index 24521ec9787a43e115c021ff9b39a6a1ac142e42..53ad976b5000dd23e33a0b7682fb7b08984f4d36 100644
--- a/gcc/common/config/xtensa/xtensa-common.c
+++ b/gcc/common/config/xtensa/xtensa-common.c
@@ -28,7 +28,6 @@  along with GCC; see the file COPYING3.  If not see
 
 static const struct default_options xtensa_option_optimization_table[] =
   {
-    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
     /* Reordering blocks for Xtensa is not a good idea unless the
        compiler understands the range of conditional branches.
        Currently all branch relaxation for Xtensa is handled in the
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 71b2445f70fd5b832c68c08e69e71d8ecad37a4a..1c56f4b12495fe97c604200ef245c9fa02684b0f 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -7436,16 +7436,17 @@  machine-description macro @code{FRAME_POINTER_REQUIRED} controls
 whether a target machine supports this flag.  @xref{Registers,,Register
 Usage, gccint, GNU Compiler Collection (GCC) Internals}.
 
-The default setting (when not optimizing for
-size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is
-@option{-fomit-frame-pointer}.  You can configure GCC with the
-@option{--enable-frame-pointer} configure option to change the default.
+The default setting is @option{-fomit-frame-pointer}.  You can configure GCC
+with the @option{--enable-frame-pointer} configure option to change the default.
 
 Note that @option{-fno-omit-frame-pointer} doesn't force a new stack
 frame for all functions if it isn't otherwise needed, and hence doesn't
-guarantee a new frame pointer for all functions.
+guarantee a new frame pointer for all functions.  Several targets always omit
+the frame pointer in leaf functions.
+
+Enabled at levels @option{-O}, @option{-O1}, @option{-O2}, @option{-O3},
+@option{-Os} and @option{-Og}.
 
-Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
 
 @item -foptimize-sibling-calls
 @opindex foptimize-sibling-calls
diff --git a/gcc/opts.c b/gcc/opts.c
index ee95c84cdef93b568aee0c0ee185332cc89870f6..6600a5afd488e89262e6327f7370057c7ae234ba 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -476,6 +476,7 @@  static const struct default_options default_options_table[] =
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 },
+    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
 
     /* -O2 optimizations.  */
     { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 },