2003-09-14 12:17:08

by Adrian Bunk

[permalink] [raw]
Subject: [2.6 patch] add a config option for -Os compilation

The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
to use -Os instead of -O2. Besides this, it removes constructs on
architectures that had a -Os hardcoded in their Makefiles.

It works for me, I'm currently running a 2.6.0-test5 compild with this
option enabled and there are no obvious problems.

The last time I sent this to linux-kernel there were one positive and
zero negative reactions.

diffstat output:

Makefile | 8 +++++++-
arch/arm/Makefile | 2 --
arch/h8300/Makefile | 2 +-
init/Kconfig | 9 +++++++++
4 files changed, 17 insertions(+), 4 deletions(-)

Please apply
Adrian

--- linux-2.6.0-test5-Os/init/Kconfig.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/init/Kconfig 2003-09-13 17:30:59.000000000 +0200
@@ -65,6 +65,15 @@

menu "General setup"

+config OPTIMIZE_FOR_SIZE
+ bool "Optimize for size" if EXPERIMENTAL
+ default n
+ help
+ Enabling this option will pass "-Os" instead of "-O2" to gcc
+ resulting in a smaller kernel.
+
+ If unsure, say N.
+
config SWAP
bool "Support for paging of anonymous memory"
depends on MMU
--- linux-2.6.0-test5-Os/Makefile.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/Makefile 2003-09-13 17:30:59.000000000 +0200
@@ -223,7 +223,7 @@
NOSTDINC_FLAGS = -nostdinc -iwithprefix include

CPPFLAGS := -D__KERNEL__ -Iinclude
-CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common
AFLAGS := -D__ASSEMBLY__

@@ -370,6 +370,12 @@
# ---------------------------------------------------------------------------


+ifdef CONFIG_OPTIMIZE_FOR_SIZE
+CFLAGS += -Os
+else
+CFLAGS += -O2
+endif
+
ifndef CONFIG_FRAME_POINTER
CFLAGS += -fomit-frame-pointer
endif
--- linux-2.6.0-test5-Os/arch/arm/Makefile.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/arch/arm/Makefile 2003-09-13 17:30:59.000000000 +0200
@@ -14,8 +14,6 @@
GZFLAGS :=-9
#CFLAGS +=-pipe

-CFLAGS :=$(CFLAGS:-O2=-Os)
-
ifeq ($(CONFIG_FRAME_POINTER),y)
CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
endif
--- linux-2.6.0-test5-Os/arch/h8300/Makefile.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/arch/h8300/Makefile 2003-09-13 17:30:59.000000000 +0200
@@ -34,7 +34,7 @@
ldflags-$(CONFIG_CPU_H8S) := -mh8300self

CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
CFLAGS += -g
CFLAGS += -D__linux__
CFLAGS += -DUTS_SYSNAME=\"uClinux\"


2003-09-14 12:33:55

by Russell King

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Sun, Sep 14, 2003 at 02:16:56PM +0200, Adrian Bunk wrote:
> The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
> to use -Os instead of -O2. Besides this, it removes constructs on
> architectures that had a -Os hardcoded in their Makefiles.

I'd rather retain the -Os default for ARM please. (The init/Kconfig
defaults it to 'n' for everything.)

--
Russell King ([email protected]) http://www.arm.linux.org.uk/personal/
Linux kernel maintainer of:
2.6 ARM Linux - http://www.arm.linux.org.uk/
2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2003-09-14 13:21:51

by Adrian Bunk

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Sun, Sep 14, 2003 at 01:33:49PM +0100, Russell King wrote:
> On Sun, Sep 14, 2003 at 02:16:56PM +0200, Adrian Bunk wrote:
> > The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
> > to use -Os instead of -O2. Besides this, it removes constructs on
> > architectures that had a -Os hardcoded in their Makefiles.
>
> I'd rather retain the -Os default for ARM please. (The init/Kconfig
> defaults it to 'n' for everything.)

Below is the patch with the ARM part omitted.

cu
Adrian

--- linux-2.6.0-test5-Os/init/Kconfig.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/init/Kconfig 2003-09-13 17:30:59.000000000 +0200
@@ -65,6 +65,15 @@

menu "General setup"

+config OPTIMIZE_FOR_SIZE
+ bool "Optimize for size" if EXPERIMENTAL
+ default n
+ help
+ Enabling this option will pass "-Os" instead of "-O2" to gcc
+ resulting in a smaller kernel.
+
+ If unsure, say N.
+
config SWAP
bool "Support for paging of anonymous memory"
depends on MMU
--- linux-2.6.0-test5-Os/Makefile.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/Makefile 2003-09-13 17:30:59.000000000 +0200
@@ -223,7 +223,7 @@
NOSTDINC_FLAGS = -nostdinc -iwithprefix include

CPPFLAGS := -D__KERNEL__ -Iinclude
-CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common
AFLAGS := -D__ASSEMBLY__

@@ -370,6 +370,12 @@
# ---------------------------------------------------------------------------


+ifdef CONFIG_OPTIMIZE_FOR_SIZE
+CFLAGS += -Os
+else
+CFLAGS += -O2
+endif
+
ifndef CONFIG_FRAME_POINTER
CFLAGS += -fomit-frame-pointer
endif
--- linux-2.6.0-test5-Os/arch/h8300/Makefile.old 2003-09-13 17:30:50.000000000 +0200
+++ linux-2.6.0-test5-Os/arch/h8300/Makefile 2003-09-13 17:30:59.000000000 +0200
@@ -34,7 +34,7 @@
ldflags-$(CONFIG_CPU_H8S) := -mh8300self

CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
CFLAGS += -g
CFLAGS += -D__linux__
CFLAGS += -DUTS_SYSNAME=\"uClinux\"

2003-09-14 13:53:56

by Wade

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

Adrian Bunk wrote:
> The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
> to use -Os instead of -O2. Besides this, it removes constructs on
> architectures that had a -Os hardcoded in their Makefiles.

Someone told me that -Os is actually faster than -O2 for Athlons, is
that true?



2003-09-14 14:52:50

by Russell King

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Sun, Sep 14, 2003 at 03:21:43PM +0200, Adrian Bunk wrote:
> On Sun, Sep 14, 2003 at 01:33:49PM +0100, Russell King wrote:
> > On Sun, Sep 14, 2003 at 02:16:56PM +0200, Adrian Bunk wrote:
> > > The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
> > > to use -Os instead of -O2. Besides this, it removes constructs on
> > > architectures that had a -Os hardcoded in their Makefiles.
> >
> > I'd rather retain the -Os default for ARM please. (The init/Kconfig
> > defaults it to 'n' for everything.)
>
> Below is the patch with the ARM part omitted.

But it doesn't make sense - you include a generic configuration option
which people will see, yet it makes no effect on ARM - seems to be rather
silly putting it there in the first place.

Also, do users particularly care what -Os and -O2 mean?

Maybe you need to change init/Kconfig to be something like the following,
and reinstate the change to the ARM makefile:

config OPTIMIZE_FOR_SIZE
bool "Optimize for size" if EXPERIMENTAL
default n if !ARM
default y if ARM
help
Enabling this option will cause the compiler to reduce the code
size of the kernel by disabling certain optimisations. However,
the resulting kernel may run faster due to more efficient
cache utilisation.

If unsure, say N.

--
Russell King ([email protected]) http://www.arm.linux.org.uk/personal/
Linux kernel maintainer of:
2.6 ARM Linux - http://www.arm.linux.org.uk/
2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2003-09-14 14:59:22

by Alan

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Sul, 2003-09-14 at 14:53, Wade wrote:
> Adrian Bunk wrote:
> > The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
> > to use -Os instead of -O2. Besides this, it removes constructs on
> > architectures that had a -Os hardcoded in their Makefiles.
>
> Someone told me that -Os is actually faster than -O2 for Athlons, is
> that true?

On gcc 2.95 -Os was faster for most stuff. I would intuitively expect
the best result to be a mix varied by function but I don't think gcc has
the support to do that.

I've also not benched gcc 3.2 -Os v -O2 at real workloads - thats a
nice little project for someone.

2003-09-15 15:16:25

by Martin J. Bligh

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

--Alan Cox <[email protected]> wrote (on Sunday, September 14, 2003 15:57:49 +0100):

> On Sul, 2003-09-14 at 14:53, Wade wrote:
>> Adrian Bunk wrote:
>> > The patch below adds a config option OPTIMIZE_FOR_SIZE for telling gcc
>> > to use -Os instead of -O2. Besides this, it removes constructs on
>> > architectures that had a -Os hardcoded in their Makefiles.
>>
>> Someone told me that -Os is actually faster than -O2 for Athlons, is
>> that true?
>
> On gcc 2.95 -Os was faster for most stuff. I would intuitively expect
> the best result to be a mix varied by function but I don't think gcc has
> the support to do that.
>
> I've also not benched gcc 3.2 -Os v -O2 at real workloads - thats a
> nice little project for someone.

I think it depends heavily on the chip - I tried 2.95 and 3.3. For me,
-Os was slower for both, but I have a 2MB L2 cache. If you have a 128K
celeron or something, I'm sure it'd be faster.

M.

2003-09-25 14:39:08

by Adrian Bunk

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Sun, Sep 14, 2003 at 03:52:45PM +0100, Russell King wrote:
>
> But it doesn't make sense - you include a generic configuration option
> which people will see, yet it makes no effect on ARM - seems to be rather
> silly putting it there in the first place.
>
> Also, do users particularly care what -Os and -O2 mean?

The "If unsure, say N." should take care of it. People who really need
small kernels usually know what -Os means.

> Maybe you need to change init/Kconfig to be something like the following,
> and reinstate the change to the ARM makefile:
>
> config OPTIMIZE_FOR_SIZE
> bool "Optimize for size" if EXPERIMENTAL
> default n if !ARM
> default y if ARM

That's a good idea.

The patch below does this for ARM and H8300.
Since there was no H8300 symbol, I added it to arch/h8300/Kconfig
similar to the symbols on other architectures.

> help
> Enabling this option will cause the compiler to reduce the code
> size of the kernel by disabling certain optimisations. However,
> the resulting kernel may run faster due to more efficient
> cache utilisation.
>...

I don't like this part, it would cause confusion. -O2 is more widely
tested, and though if there might be small improvements on some CPUs
with some compiler versions, it's untested whether -Os might cause worse
performance of some fast path code in any area of the kernel.
OPTIMIZE_FOR_SIZE should, although of low risk, be an "only use it if
you know what you are doing" option.


diffstat output for the patch below:

Makefile | 8 +++++++-
arch/arm/Makefile | 2 --
arch/h8300/Kconfig | 4 ++++
arch/h8300/Makefile | 2 +-
init/Kconfig | 10 ++++++++++
5 files changed, 22 insertions(+), 4 deletions(-)


cu
Adrian

--- linux-2.6.0-test5-mm4/init/Kconfig.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/init/Kconfig 2003-09-25 14:47:12.000000000 +0200
@@ -65,6 +65,16 @@

menu "General setup"

+config OPTIMIZE_FOR_SIZE
+ bool "Optimize for size" if EXPERIMENTAL
+ default y if ARM || H8300
+ default n
+ help
+ Enabling this option will pass "-Os" instead of "-O2" to gcc
+ resulting in a smaller kernel.
+
+ If unsure, say N.
+
config SWAP
bool "Support for paging of anonymous memory"
depends on MMU
--- linux-2.6.0-test5-mm4/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/Makefile 2003-09-25 14:40:26.000000000 +0200
@@ -274,7 +274,7 @@
CPPFLAGS := -D__KERNEL__ -Iinclude \
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)

-CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common
AFLAGS := -D__ASSEMBLY__

@@ -421,6 +421,12 @@
# ---------------------------------------------------------------------------


+ifdef CONFIG_OPTIMIZE_FOR_SIZE
+CFLAGS += -Os
+else
+CFLAGS += -O2
+endif
+
ifndef CONFIG_FRAME_POINTER
CFLAGS += -fomit-frame-pointer
endif
--- linux-2.6.0-test5-mm4/arch/arm/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/arm/Makefile 2003-09-25 14:40:47.000000000 +0200
@@ -14,8 +14,6 @@
GZFLAGS :=-9
#CFLAGS +=-pipe

-CFLAGS :=$(CFLAGS:-O2=-Os)
-
ifeq ($(CONFIG_FRAME_POINTER),y)
CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
endif
--- linux-2.6.0-test5-mm4/arch/h8300/Kconfig.old 2003-09-25 14:43:27.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/h8300/Kconfig 2003-09-25 14:43:44.000000000 +0200
@@ -5,6 +5,10 @@

mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"

+config H8300
+ bool
+ default y
+
config MMU
bool
default n
--- linux-2.6.0-test5-mm4/arch/h8300/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/h8300/Makefile 2003-09-25 14:38:24.000000000 +0200
@@ -34,7 +34,7 @@
ldflags-$(CONFIG_CPU_H8S) := -mh8300self

CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
CFLAGS += -g
CFLAGS += -D__linux__
CFLAGS += -DUTS_SYSNAME=\"uClinux\"

2003-09-25 18:13:41

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Thu, Sep 25, 2003 at 04:38:45PM +0200, Adrian Bunk wrote:
> --- linux-2.6.0-test5-mm4/init/Kconfig.old 2003-09-25 14:38:18.000000000 +0200
> +++ linux-2.6.0-test5-mm4/init/Kconfig 2003-09-25 14:47:12.000000000 +0200
> @@ -65,6 +65,16 @@
>
> menu "General setup"
>
> +config OPTIMIZE_FOR_SIZE
> + bool "Optimize for size" if EXPERIMENTAL
> + default y if ARM || H8300
> + default n
> + help
> + Enabling this option will pass "-Os" instead of "-O2" to gcc
> + resulting in a smaller kernel.
> +
> + If unsure, say N.
> +

This is a general file, and it is wrong to include architecture specific
knowledge here.
I recall that Roman Zippel introduced "enable" for exactly this purpose.

I looked into Documentation/kbuild/kconfig-language.txt but did not
see it documented - Roman?

Another comment about the naming of the config symbol.
We keep getting more config symbols controlling options to GCC.
A naming scheme like: CONFIG_CC_OPTIMIZE_FOR_SIZE, CONFIG_CC_DEBUG_INFO
is preferable since it give better context information.
Let's start with this option, and rename the others later.

Sam

2003-09-26 11:44:50

by Russell King

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Thu, Sep 25, 2003 at 08:11:27PM +0200, Sam Ravnborg wrote:
> On Thu, Sep 25, 2003 at 04:38:45PM +0200, Adrian Bunk wrote:
> > --- linux-2.6.0-test5-mm4/init/Kconfig.old 2003-09-25 14:38:18.000000000 +0200
> > +++ linux-2.6.0-test5-mm4/init/Kconfig 2003-09-25 14:47:12.000000000 +0200
> > @@ -65,6 +65,16 @@
> >
> > menu "General setup"
> >
> > +config OPTIMIZE_FOR_SIZE
> > + bool "Optimize for size" if EXPERIMENTAL
> > + default y if ARM || H8300
> > + default n
> > + help
> > + Enabling this option will pass "-Os" instead of "-O2" to gcc
> > + resulting in a smaller kernel.
> > +
> > + If unsure, say N.
> > +
>
> This is a general file, and it is wrong to include architecture specific
> knowledge here.

In which case we need to replicate the option in each of the per-
architecture files. That seems a bit wasteful though.

I don't think "select" will hack it in this case though.

--
Russell King ([email protected]) http://www.arm.linux.org.uk/personal/
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2003-09-26 22:36:24

by Adrian Bunk

[permalink] [raw]
Subject: Re: [2.6 patch] add a config option for -Os compilation

On Thu, Sep 25, 2003 at 08:11:27PM +0200, Sam Ravnborg wrote:
> On Thu, Sep 25, 2003 at 04:38:45PM +0200, Adrian Bunk wrote:
> > --- linux-2.6.0-test5-mm4/init/Kconfig.old 2003-09-25 14:38:18.000000000 +0200
> > +++ linux-2.6.0-test5-mm4/init/Kconfig 2003-09-25 14:47:12.000000000 +0200
> > @@ -65,6 +65,16 @@
> >
> > menu "General setup"
> >
> > +config OPTIMIZE_FOR_SIZE
> > + bool "Optimize for size" if EXPERIMENTAL
> > + default y if ARM || H8300
> > + default n
> > + help
> > + Enabling this option will pass "-Os" instead of "-O2" to gcc
> > + resulting in a smaller kernel.
> > +
> > + If unsure, say N.
> > +
>
> This is a general file, and it is wrong to include architecture specific
> knowledge here.
> I recall that Roman Zippel introduced "enable" for exactly this purpose.
>...

I can't see how this would help in this situation, we need a default,
not a dependency (OPTIMIZE_FOR_SIZE=n should be possible on ARM).

It's not the only option that sets defaults depending on the
architecture and I can't see why it should be a bad thing.

> Another comment about the naming of the config symbol.
> We keep getting more config symbols controlling options to GCC.
> A naming scheme like: CONFIG_CC_OPTIMIZE_FOR_SIZE, CONFIG_CC_DEBUG_INFO
> is preferable since it give better context information.
> Let's start with this option, and rename the others later.

Below is the patch with CONFIG_CC_OPTIMIZE_FOR_SIZE.

> Sam

cu
Adrian

--- linux-2.6.0-test5-mm4/init/Kconfig.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/init/Kconfig 2003-09-25 14:47:12.000000000 +0200
@@ -65,6 +65,16 @@

menu "General setup"

+config CC_OPTIMIZE_FOR_SIZE
+ bool "Optimize for size" if EXPERIMENTAL
+ default y if ARM || H8300
+ default n
+ help
+ Enabling this option will pass "-Os" instead of "-O2" to gcc
+ resulting in a smaller kernel.
+
+ If unsure, say N.
+
config SWAP
bool "Support for paging of anonymous memory"
depends on MMU
--- linux-2.6.0-test5-mm4/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/Makefile 2003-09-25 14:40:26.000000000 +0200
@@ -274,7 +274,7 @@
CPPFLAGS := -D__KERNEL__ -Iinclude \
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)

-CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -fno-common
AFLAGS := -D__ASSEMBLY__

@@ -421,6 +421,12 @@
# ---------------------------------------------------------------------------


+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+CFLAGS += -Os
+else
+CFLAGS += -O2
+endif
+
ifndef CONFIG_FRAME_POINTER
CFLAGS += -fomit-frame-pointer
endif
--- linux-2.6.0-test5-mm4/arch/arm/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/arm/Makefile 2003-09-25 14:40:47.000000000 +0200
@@ -14,8 +14,6 @@
GZFLAGS :=-9
#CFLAGS +=-pipe

-CFLAGS :=$(CFLAGS:-O2=-Os)
-
ifeq ($(CONFIG_FRAME_POINTER),y)
CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
endif
--- linux-2.6.0-test5-mm4/arch/h8300/Kconfig.old 2003-09-25 14:43:27.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/h8300/Kconfig 2003-09-25 14:43:44.000000000 +0200
@@ -5,6 +5,10 @@

mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"

+config H8300
+ bool
+ default y
+
config MMU
bool
default n
--- linux-2.6.0-test5-mm4/arch/h8300/Makefile.old 2003-09-25 14:38:18.000000000 +0200
+++ linux-2.6.0-test5-mm4/arch/h8300/Makefile 2003-09-25 14:38:24.000000000 +0200
@@ -34,7 +34,7 @@
ldflags-$(CONFIG_CPU_H8S) := -mh8300self

CFLAGS += $(cflags-y)
-CFLAGS += -mint32 -fno-builtin -Os
+CFLAGS += -mint32 -fno-builtin
CFLAGS += -g
CFLAGS += -D__linux__
CFLAGS += -DUTS_SYSNAME=\"uClinux\"