Livelli di ottimizzazione del clang


91

Sul gcc, il manuale spiega che cosa -O3, -Osecc traducono in termini di argomenti specifici di ottimizzazione ( -funswitch-loops, -fcompare-elim, ecc)

Sto cercando le stesse informazioni per clang .

Ho cercato online e in man clangcui fornisce solo informazioni generali ( -O2ottimizza più di -O1, -Osottimizza per velocità, ...) e ho anche cercato qui su Stack Overflow e ho trovato questo , ma non ho trovato nulla di rilevante nei file sorgente citati.

Modifica: ho trovato una risposta ma sono ancora interessato se qualcuno ha un collegamento a un manuale utente che documenta tutti i passaggi di ottimizzazione e i passaggi selezionati da . Attualmente ho appena trovato questo elenco di passaggi, ma niente sui livelli di ottimizzazione.-Ox

Risposte:


156

Ho trovato questa domanda correlata.

Per riassumere, per scoprire i passaggi di ottimizzazione del compilatore:

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments

Come sottolineato nella risposta di Geoff Nixon (+1), clangesegue anche alcune ottimizzazioni di livello superiore, che possiamo recuperare con:

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

La documentazione dei singoli pass è disponibile qui .



Con la versione 6.0 i passaggi sono i seguenti:

  • baseline ( -O0):

    • optimposta : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangaggiunge : -mdisable-fp-elim -mrelax-all
  • -O1 è basato su -O0

    • opt aggiunge:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-execution -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-Simpy -lcssa-Verification -lcssa -Scalar-Evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribute-loop-vettorializzare -loop-load-elim -allineamento-da-ipotesi -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pair -verify -ee-instrument -early-cse -lower-expected
    • clangaggiunge : -momit-leaf-frame-pointer
    • clanggocce : -mdisable-fp-elim -mrelax-all
  • -O2 è basato su -O1

    • optaggiunge : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optgocce : -sempre-inline
    • clangaggiunge : -vectorize-loops -vectorize-slp
  • -O3 è basato su -O2

    • optaggiunge : -callsite-splitting -argpromotion
  • -Ofastè basato su -O3, valido in clangma non inopt

    • clangaggiunge : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-solo matematica
  • -Os è simile a -O2

    • optgocce : -libcalls-shrinkwrap e -pgo-memopt-opt
  • -Oz è basato su -Os

    • optgocce : -slp-vectorizer

Con la versione 3.8 i passaggi sono i seguenti:

  • baseline ( -O0):

    • optimposta : -targetlibinfo -tti -verify
    • clangaggiunge : -mdisable-fp-elim -mrelax-all
  • -O1 è basato su -O0

    • optaggiunge : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-semplifica -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -loops -baselated -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expected -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangaggiunge : -momit-leaf-frame-pointer
    • clanggocce : -mdisable-fp-elim -mrelax-all
  • -O2 è basato su -O1

    • optaggiunge : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optgocce : -sempre-inline
    • clangaggiunge : -vectorize-loops -vectorize-slp
  • -O3 è basato su -O2

    • optaggiunge : -argpromotion
  • -Ofastè basato su -O3, valido in clangma non inopt

    • clangaggiunge : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os equivale a -O2

  • -Oz è basato su -Os

    • optgocce : -slp-vectorizer
    • clanggocce : -vectorize-loops


Con la versione 3.7 i passaggi sono i seguenti (output analizzato del comando precedente):

  • predefinito (-O0): -targetlibinfo -verify -tti

  • -O1 è basato su -O0

    • aggiunge : -sccp -loop-Simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assumption-cache-tracker -reassociate -eliminazione-loop -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-assumptions -early-cse -inline -costo -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expected -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -sempre-inline
  • -O2 è basato su -01

    • aggiunge : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • rimuove : -sempre-inline
  • -O3 è basato su -O2

    • aggiunge : -argpromotion -verif
  • -Os è identico a -O2

  • -Oz è basato su -Os

    • rimuove : -slp-vectorizer


Per la versione 3.6 i passaggi sono come documentato nel post di GYUNGMIN KIM.


Con la versione 3.5 i passaggi sono i seguenti (output analizzato del comando precedente):

  • predefinito (-O0): -targetlibinfo -verify -verify-di

  • -O1 è basato su -O0

    • aggiunge : -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-semplifica -loop-vettorializzare -inline-cost -branch-prob -early-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-wait -licm -loop-idiom -adce -domtree -lcssa
  • -O2 è basato su -01

    • aggiunge : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • rimuove : -sempre-inline
  • -O3 è basato su -O2

    • aggiunge : -argpromotion
  • -Os è identico a -O2

  • -Oz è basato su -Os

    • rimuove : -slp-vectorizer


Con la versione 3.4 i passaggi sono i seguenti (output analizzato del comando precedente):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 è basato su -O0

    • aggiunge : -adce -always-inline -basicaa -basiccg -correlated-propagation -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-deletion -loop-idiom -loop-rotate -loop-semplifica -loop-unroll -loop-unswitch -loops -lower-aspetta -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 è basato su -01

    • aggiunge : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • rimuove : -sempre-inline
  • -O3 è basato su -O2

    • aggiunge : -argpromotion
  • -Os è identico a -O2

  • -Oz è basato su -O2

    • rimuove : -barrier -loop-vectorize -slp-vectorizer


Con la versione 3.2 i passaggi sono i seguenti (output analizzato del comando precedente):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 è basato su -O0

    • aggiunge : -sroa -early-cse -lower-wait -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value -info -jump-threading -correlated-propagation -tailcallelim -reassociate -loops -loop-sempy -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 è basato su -01

    • aggiunge : -inline -globaldce -constmerge
    • rimuove : -sempre-inline
  • -O3 è basato su -O2

    • aggiunge : -argpromotion
  • -Os è identico a -O2

  • -Oz è identico a -Os


Modifica [marzo 2014] ha rimosso i duplicati dagli elenchi.

Modifica [aprile 2014] aggiunto collegamento alla documentazione + opzioni per 3.4

Modifica [settembre 2014] ha aggiunto le opzioni per 3.5

Modifica [dicembre 2015] ha aggiunto le opzioni per 3.7 e menziona la risposta esistente per 3.6

Modifica [maggio 2016] ha aggiunto le opzioni per 3.8, sia per opt che per clang e menziona la risposta esistente per clang (contro opt)

Modifica [nov 2018] aggiungi opzioni per 6.0


2
C'è un modo per farlo con la versione di clang fornita con XCode5? Ho provato a cercare il comando llvm-as, ma non esiste sulla mia macchina da nessuna parte che possa vedere
Teknogrebo

@Antoine, perché -simplifycfgsi ripetono alcune bandiere simili ?
Paschalis

2
@Paschalis: non ne sono sicuro, ma poiché alcuni passaggi di ottimizzazione funzionano solo se sono stati eseguiti altri passaggi, ad esempio simplifycfgè richiesto da più passaggi. E debug-pass=Argumentsprobabilmente accade prima della deduplicazione. Ho rimosso i duplicati nella mia risposta, grazie per il tuo feedback.
Antoine

5
Alcune ottimizzazioni creano elementi che possono essere ulteriormente ottimizzati (codice morto ecc.), Quindi potrebbe avere senso rieseguire alcuni passaggi di ottimizzazione.
cyco130

1
@ZachB / @Antoine Perché non (anche?) LLVM 7 (o è questo che intendevi?) Inoltre: 1. Non sono sicuro da quanto tempo ci sia, ma ora c'è anche -Ogun GCC; 2. Sono ancora necessarie tutte le specifiche per le versioni precedenti? 3. Penso che visti i bei cambiamenti che sono stati fatti nel corso degli anni e lo stato della comunità, ridurrò la mia risposta a menzionare solo cose come clang -cc1 -mllvm -help-list-hidden(a meno che tu non preferisca integrarle).
Geoff Nixon

15

La risposta di @ Antoine (e l'altra domanda collegata) descrive accuratamente le ottimizzazioni LLVM abilitate, ma ci sono alcune altre opzioni specifiche di Clang (cioè quelle che influenzano l'abbassamento all'AST) che sono interessate dai -O[0|1|2|3|fast]flag.

Puoi dare un'occhiata a questi con:

echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O1 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O2 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -Ofast - -o /dev/null -\#\#\#

Ad esempio, -O0consente -mrelax-all, -O1consente -vectorize-loopse -vectorize-slp, e -Ofastconsente -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=faste -ffast-math.


@Techogrebo:

Sì, no, non servono necessariamente gli altri strumenti LLVM. Provare:

echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options

Inoltre, ci sono opzioni molto più dettagliate che puoi esaminare / modificare solo con Clang ... devi solo sapere come raggiungerle!

Prova alcuni di:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

LLVM 3.6 -O1

Passare argomenti:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -sempre -funzione -inlineattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-semplifica -lcssa -loop -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-semplifica -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-semplifica -lcssa -branch-prob -block-freq -scalar-evolution -loop -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-semplifica -lcssa -scalar-evolution -function_tti -loop-unroll -allineamento-da-ipotesi -strip-dead-prototypes -verify -verify-di

-O2 base su -O1

aggiungere: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

e rimuove: -sempre-inline

-O3 basato su -O2

aggiungi: -argpromotion

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.