2011-10-05 14 views
10

Vorrei sapere concretamente a cosa corrispondono i vari livelli di ottimizzazione di LLVM.Quale ottimizzazione esegue LLVM?

Vale a dire, vorrei sapere quali passaggi di ottimizzazione vengono eseguiti ESATTAMENTE (al di fuori del frontend) e in quale ordine quando utilizzo le opzioni "-0x" di llvm (o clang o opt). Gli "strumenti" degli strumenti corrispondenti non forniscono molte informazioni su questo argomento (al contrario di quello di gcc).

Sono a conoscenza di questa pagina utile: http://llvm.org/docs/Passes.html, ma non fornisce alcuna informazione relativa alle opzioni "-Ox". Stavo cercando alcune opzioni di debug o verbose (specialmente utilizzando le informazioni da "opt - help") ma non sono riuscito a trovare alcuna opzione utile.

Come complemento, ho notato analizzando il codice che tutti i vari strumenti LLVM e clang utilizzano driver distinti che analizzano le opzioni a modo loro. Tutti questi driver sono simili rispetto alle opzioni "-Ox"?

Edit: ho trovato l'opzione "pass--debug = Argomenti" per la funzione "opt", che dà il seguente output per l'opzione "O1":

Pass Arguments: -targetdata -no-aa -tbaa -targetlibinfo -basicaa -simplifycfg -domtree -scalarrepl -early-cse -lower-expect 
Pass Arguments: -targetlibinfo -targetdata -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -scalarrepl-ssa -domtree -early-cse -simplify-libcalls -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify 

questo è vicino da quello che Volevo ma rimane due domande:

  • perché ci sono due elenchi?

  • c'è qualche opzione simile per altri strumenti, in particolare "clang"? (Secondo le mie prove, "-pass -debug = Argomenti" non funziona con clangore)

Edit: l'opzione "passa--debug = Struttura" per la "opt" strumento dà ancora più dati user friendly (da http://llvm.org/docs/WritingAnLLVMPass.html)

risposta

11

perché ci sono due elenchi?

Le passate di modulo e modulo hanno i propri pass manager e quindi stampano separatamente.

c'è qualche opzione simile per altri strumenti, in particolare "clang"

Con clang è possibile utilizzare passa--debug -mllvm = Argomenti.

+0

Abbastanza giusto! Grazie ! –

+0

@echristo: potresti approfondire la differenza tra la funzione e il passaggio del modulo in LLVM? diciamo, sto passando l'intero file di codice sorgente foo.c per optare per uno dei passaggi di ottimizzazione standard (O1,2,3, ...). Cosa succederà dopo? – Amir

+1

@Amir Ci scusiamo per il ritardo, ho appena visto questo. In ogni caso, un passaggio modulo è qualcosa che generalmente funziona su tutte le funzioni, ecc. E ha visibilità globale. Una funzione passa su una singola funzione alla volta e non può passare le informazioni avanti e indietro fino all'analisi delle singole funzioni. In generale, le cose come il layout dei dati, la generazione del codice globale, l'analisi interprocedurale, ecc. Sono moduli mentre gvn è la funzione passa. Puoi dare un'occhiata alla fonte di ogni pass per scoprire cosa è in particolare. Hai una domanda più specifica o più informazioni? – echristo