Disable all optimization options in GCC

staticx picture staticx · Oct 22, 2015 · Viewed 9.1k times · Source

The default optimization level for compiling C programs using GCC is -O0. which turns off all optimizations according to GCC documentation. for example:

    gcc -O0 test.c 

However, to check if -O0 is really turning off all optimizations. I executed this command:

    gcc -Q -O0 --help=optimizers 

And here, I was a bit surprised. I got around 50 options enabled. Then, I checked the default arguments passed to gcc using this:

    gcc -v 

I got this:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-       
2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --      
enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --
program-suffix=-4.8 --enable-shared --enable-linker-build-id --
libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-
gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-
sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-
time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --
with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-
cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-
java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-
jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-
directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-
gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --
with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release 
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu

Thread model: posix

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

So my conclusion is that the -O0 flag I provided to the program was not overridden by something else.

In fact, I am seeking to implement from scratch a tool that generates random sequences of optimization options and compare generated sequences to default levels 0-3. Just like "acovea". So that, I would like to compare my generated sequences to a zero-optimization level (which should be -O0)

Can you explain me why 50 options are enabled by default in -O0?

One idea I have in mind is to compile with -O0 and turn off default optimizations in -O0 using -fno-OPTIMIZATION_NAME 50 times. What do you think?

Answer

Basile Starynkevitch picture Basile Starynkevitch · Oct 22, 2015

Stricto sensu, the GCC compiler middle-end is made of a sequence (actually a nested tree, dynamically changing during compilation) of optimization passes, so if GCC did no optimization, it won't be able to emit any code.

Think of it another way: the input language to GCC is quite rich (even for plain C, where you have while, for, ....) but the intermediate Gimple language is much more poor (in particular Gimple/SSA) so you need to apply some transformations to go from source AST to Gimple. These transformations are optimization passes, almost by definition.

See also the pictures from that answer and this one (an SVG image) and read the references mentioned here.

You should understand -O0 as disabling any additional optimizations (e.g. provided by -O1 etc...) not needed to produce some executable.