https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88345

            Bug ID: 88345
           Summary: -Os overrides -finline-functions=N on the command line
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The -Os effect on -falign-functions is documented in a confusing or even
contradictory way:

    Optimize for size. -Os enables all -O2 optimizations except those that
often increase code size:

    -falign-functions  -falign-jumps 
    -falign-labels  -falign-loops 
    -fprefetch-loop-arrays  -freorder-blocks-algorithm=stc

    It also enables -finline-functions, causes the compiler to tune for code
size rather than execution speed, and performs further optimizations designed
to reduce code size.

The first sentence implies -Os is doesn't enable -finline-functions, but the
second sentence contradicts it.

The documentation for -finline-functions=n doesn't help.  It just says:

  If n is not specified or is zero, use a machine-dependent default.

I haven't been able to find a way to determine the machine-dependent default
except by testing.

An experiment with an x86_64 compiler shows that -Os overrides whatever
-falign-functions option is specified on the command line.  Curiously, though,
with -O2 GCC does honor the -falign-functions=n setting.

Clang, on the other hand, does the opposite: it honors the -falign-functions=n
setting with -Os and ignores it with -O2.

$ cat u.c && gcc -Os -c -Wall -falign-functions=2 u.c && objdump -d u.o
void f (void) { }
void g (void) { }


u.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   c3                      retq

0000000000000001 <g>:
   1:   c3                      retq

Reply via email to