2009-11-22 5 views
5

Je sais que -O1 active automatiquement certains indicateurs. Ces drapeaux peuvent être activés manuellement cependant. Si je ne spécifie pas -O1, il devrait toujours être possible d'obtenir l'optimisation -O1 en spécifiant tous les indicateurs que -O1 active.Comment obtenir l'optimisation gcc -O1 sans spécifier -O1

J'ai essayé

-fthread-jumps -fcprop-registers -fguess-branch-probability 

mais il ne fonctionne toujours pas faire l'optimisation -O1. Je peux dire quand j'utilise gprof parce que la performance n'est pas aussi bonne.

Quels indicateurs dois-je activer pour obtenir l'optimisation -O1?

+8

Quels indicateurs dois-je activer pour obtenir l'optimisation -O1? Vous allumez -O1. Tourner manuellement chaque drapeau est une perte de temps et est sujet aux erreurs. Utilisez simplement le raccourci que les gars du GCC vous ont donné au lieu de faire les choses à la dure !!! – Glen

+0

Voir aussi: http://stackoverflow.com/questions/1778698/. –

Répondre

13

Une façon de savoir:

gcc -O1 -c -Q -v dummy.c 

(où dummy.c est votre nom de fichier.) Cela provoque gcc à cracher les drapeaux utilisés pour la ligne de commande.

Édition: Veuillez consulter kastauyra's answer à ce sujet. Il semble que vous ne puissiez pas simuler l'optimisation complète -O1 avec les indicateurs -f seuls.

0

Cela dépend de votre version de gcc. Voir le gcc manpage.

Sur ma machine, -O (qui est -O1) tourne sur les optimisations suivantes:

-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch 
    -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion 
    -finline-small-functions -fipa-pure-const -fipa-reference 
    -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce 
    -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce 
    -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter 
    -funit-at-a-time 

    -O also turns on -fomit-frame-pointer on machines where doing so 
    does not interfere with debugging. 
3

A partir du manuel:

-O 
-O1 
Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. 

With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. 

-O turns on the following optimization flags: 
      -fauto-inc-dec 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -fipa-pure-const 
      -fipa-reference 
      -fmerge-constants 
      -fsplit-wide-types 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-forwprop 
      -ftree-fre 
      -ftree-phiprop 
      -ftree-sra 
      -ftree-pta 
      -ftree-ter 
      -funit-at-a-time 
+2

Il existe d'autres indicateurs internes qui ne peuvent pas être "activés" pour simuler un "-O1" complet. – LiraNuna

11

Malheureusement, c'est impossible. De nombreux indicateurs d'optimisation individuels sont activés par -O1, true, mais beaucoup de code dans GCC vérifie la valeur de l'indicateur d'optimisation globale et effectue des optimisations non spécifiées par l'une des options -f ...

+0

hmm c'est nouvelles pour moi .. peut citer doc? – int3

+3

Le doc ne le dit pas (probablement un patch pour changer ceci serait accepté). Mais cela peut être vu à partir du code source (vérifiez le nombre de places si (optimiser> 0) ... qui ne vérifie pas les drapeaux individuels), aussi cela a été demandé sur les listes de diffusion GCC: http: //gcc.gnu. org/ml/gcc-help/2008-02/msg00389.html –

+7

"Toutes les optimisations ne sont pas directement contrôlées par un indicateur, seules les optimisations ayant un indicateur sont répertoriées dans cette section." La plupart des optimisations ne sont activées que si level est défini sur la ligne de commande, sinon ils sont désactivés, même si des indicateurs d'optimisation individuels sont spécifiés. "à partir de: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html – Dan

1

Vous pouvez aussi utiliser ce pragma (nécessite GCC> = 4.4):

#pragma GCC optimize opt_list 
void f() 

Cette pragma vous permet d'activer et désactiver des optimisations spécifiques pour la fonction donnée. opt_list est la liste des options -f * sans -f.

Il y a aussi attribut de fonction pour changer le niveau d'optimisation:

int f() __attribute__((optimize(1))); 

Vous pouvez également modifier le niveau d'optimisation globale (appliquer à toutes les fonctions suivantes):

#pragma GCC optimize 1 
#pragma GCC optimize 0 

Vous pouvez également utiliser (appliquer à toutes les fonctions suivantes):

#pragma GCC optimization_level n 

et pour le compilateur Intel C (doc; appliqué uniquement pour la fonction suivante)

#pragma intel optimization_level n 
Questions connexes