2009-11-22 1 views
5

So che -O1 attiva automaticamente alcuni flag. Tuttavia, questi flag possono essere attivati ​​manualmente. Se non si specifica -O1, dovrebbe essere ancora possibile ottenere l'ottimizzazione -O1 specificando tutti i flag che -O1 attiva.Come ottenere l'ottimizzazione gcc -O1 senza specificare -O1

ho cercato

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

ma ancora non fa ottimizzazione -O1. Posso dire quando uso gprof perché le prestazioni non sono altrettanto buone.

Quali flag si attivano per ottenere l'ottimizzazione -O1?

+8

Quali flag si attivano per ottenere l'ottimizzazione -O1? Si attiva -O1. Accendere manualmente ogni bandiera è una perdita di tempo ed è soggetto a errori. Usa la scorciatoia che i ragazzi GCC ti hanno dato invece di fare le cose nel modo più duro !!! – Glen

+0

Vedi anche: http://stackoverflow.com/questions/1778698/. –

risposta

13

Un modo per scoprire:

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

(dove dummy.c è il tuo nome file). Questo fa sì che gcc sputa i flag usati per la riga di comando.

Modifica: Vedere kastauyra's answer su questo. Sembra che non sia possibile simulare l'ottimizzazione completa -O1 con i flag -f.

0

Dipende dalla versione di gcc. Vedi lo gcc manpage.

Sulla mia macchina, -O (che è -O1) accende le seguenti ottimizzazioni:

-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

Dal manuale:

-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

Ci sono altri flag interni che non possono essere "attivati" per simulare un pieno '-O1'. – LiraNuna

11

Sfortunatamente, è impossibile. Ci sono molti flag di ottimizzazione individuali attivati ​​da -O1, vero, tuttavia un sacco di codice in GCC controlla il valore del flag di ottimizzazione globale ed esegue ottimizzazioni non specificate da nessuna delle opzioni -f ...

+0

hmm questa è una novità per me .. puoi citare un documento? – int3

+3

Il documento non lo dice (probabilmente una patch per cambiarlo sarebbe accettata). Ma questo può essere visto dal codice sorgente (controlla il numero di posti se (ottimizza> 0) ... che non controlla i singoli flag), anche questo è stato chiesto sulle mailing list GCC: http: //gcc.gnu. org/ml/gcc-help/2008-02/msg00389.html –

+7

"Non tutte le ottimizzazioni sono controllate direttamente da un flag. In questa sezione sono elencate solo le ottimizzazioni con flag. La maggior parte delle ottimizzazioni è abilitata solo se un -O livello è impostato sulla riga di comando, altrimenti sono disabilitati, anche se vengono specificati singoli flag di ottimizzazione. "da: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html – Dan

1

Si può anche provare a utilizzare questo pragma (richiede GCC> = 4.4):

#pragma GCC optimize opt_list 
void f() 

Questo pragma consentono di attivare e disattivare le ottimizzazioni specifiche per data funzione. opt_list è una lista di opzioni -f * senza -f.

C'è anche attributo di funzione per modificare il livello di ottimizzazione:

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

È inoltre possibile modificare il livello di ottimizzazione globale (si applicano a tutte le funzioni successive):

#pragma GCC optimize 1 
#pragma GCC optimize 0 

È inoltre possibile utilizzare (applicano a tutte le funzioni successive):

#pragma GCC optimization_level n 

e per compilatore Intel C (doc; applicato solo per la funzione successiva)

#pragma intel optimization_level n