Désactiver toutes les options d’optimisation dans GCC

Le niveau d’optimisation par défaut pour la compilation de programmes en C utilisant GCC est -O0. qui désactive toutes les optimisations conformément à la documentation de GCC. par exemple:

gcc -O0 test.c 

Cependant, pour vérifier si -O0 désactive réellement toutes les optimisations . J’ai exécuté cette commande:

  gcc -Q -O0 --help=optimizers 

Et là, j’ai été un peu surpris. J’ai eu environ 50 options activées. Ensuite, j’ai vérifié les arguments par défaut passés à gcc en utilisant ceci:

  gcc -v 

J’ai eu ceci:

 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) 

Ma conclusion est donc que le drapeau -O0 j’ai fourni au programme n’a pas été remplacé par autre chose.

En fait, je cherche à mettre en œuvre un outil qui génère des séquences aléatoires d’optimisations aléatoires et compare les séquences générées aux niveaux 0-3 par défaut. Tout comme “acovea”. Alors, j’aimerais comparer mes séquences générées à un niveau d’optimisation zéro (qui devrait être -O0 )

Pouvez-vous m’expliquer pourquoi 50 options sont activées par défaut dans -O0 ?

Une idée que je me -O0 est de comstackr avec -O0 et de désactiver 50 fois les optimisations par défaut dans -O0 aide de -fno-OPTIMIZATION_NAME -O0 . Qu’est-ce que tu penses?

    Ssortingcto sensu, le compilateur GCC intermédiaire est constitué d’une séquence (en fait d’un arbre nested, qui change dynamicment lors de la compilation) de passes d’optimisation. Par conséquent, si GCC n’optimisait pas, il ne pourrait pas émettre de code.

    Pensez-y d’une autre manière: la langue d’entrée dans GCC est assez riche (même pour le langage C simple, où vous avez while , for , ….), mais la langue intermédiaire de Gimple est beaucoup plus pauvre (en particulier Gimple / SSA). Il faut appliquer certaines transformations pour passer de la source AST à Gimple. Ces transformations sont des passes d’optimisation, presque par définition.

    Voir aussi les images de cette réponse et celle- ci (une image SVG) et lisez les références mentionnées ici .

    Vous devez comprendre -O0 comme désactivant toute optimisation supplémentaire (fournie par exemple par -O1 etc …) qui n’est pas nécessaire pour produire un exécutable.

    bien

     gcc -O0 `gcc -Q -O0 --help=optimizers 2>&1 | perl -ane 'if ($F[1] =~/enabled/) {$F[0] =~ s/^\s*-f/-fno-/g;push @o,$F[0];}} END {print join(" ", @o)'` your args here 

    va désactiver toutes les options (beurk).

    Plus sérieusement, si vous couvrez tous les états d’optimisation, dressez une liste des indicateurs d’optimisation (ce que vous devez faire de toute façon) et activez ou désactivez explicitement chacun d’eux avec -fmyflag ou -fno-myflag . Cela répond essentiellement à votre deuxième question.

    Cependant, vous pouvez considérer que cela ne vaut pas la peine de jouer avec la désactivation des optimisations activées pour tous les niveaux -O .

    Quant à pourquoi c’est comme ça, c’est quelque part entre “trop ​​large” (c’est-à-dire qu’il faudrait demander à celui qui l’a écrit) et “parce que c’est ce que https://github.com/gcc-mirror/gcc/blob/master/gcc/ toplev.c fait ‘ .

    Notez que la documentation ne dit pas que -O0 désactive l’optimisation. Il dit (à partir de la page de manuel ):

    -O0 Réduisez le temps de compilation et faites en sorte que le débogage produise les résultats escomptés. C’est la valeur par défaut.

    Cela implique implicitement des optimisations qui n’augmentent pas le temps de compilation et n’affectent pas le débogage. Celles-ci restront activées.

    Pour répondre à ma question, j’ai tiré certaines conclusions et hypothèses:

    Alors laissez-moi vous dire que comstackr avec O0 ne signifie pas qu’aucune optimisation ne sera appliquée. Les options permettant de réduire le temps de compilation et d’améliorer le débogage seront activées, comme @abligh l’a indiqué ci-dessus.

    En d’autres termes, O0 optimise le niveau de compilation. Les fichiers binarys produits ne sont pas optimisés afin de faciliter le processus de débogage.

    Je donne un exemple: cette option est activée au niveau O0

    optimisations de boucle -faggressive

    Dans la documentation GCC:

    Cette option indique à l’optimiseur de boucle d’utiliser des contraintes de langage pour dériver des bornes pour le nombre d’itérations d’une boucle. Cela suppose que le code de la boucle n’invoque pas de comportement indéfini, par exemple en provoquant des débordements d’entiers signés ou des access à des tableaux hors limites. Les bornes pour le nombre d’itérations d’une boucle sont utilisées pour guider le déroulement et l’optimisation des tests de pelage et de sortie de boucle. Cette option est activée par défaut.

    Donc, pour GCC 4.8.x, il y a près de 50 options activées par défaut.