No gcc, o manual explica o que -O3
, -Os
etc. traduzir para em termos de argumentos de otimização específica ( -funswitch-loops
, -fcompare-elim
, etc.)
Estou procurando as mesmas informações para o clang .
Procurei online e no man clang
qual só dá informações gerais ( -O2
otimiza mais que -O1
, -Os
otimiza para velocidade, ...) e também procurei aqui no Stack Overflow e encontrei isso , mas não encontrei nada relevante nos arquivos de origem citados.
Edit: Eu encontrei uma resposta, mas ainda estou interessado se alguém tiver um link para um manual do usuário documentando todas as passagens de otimização e as passagens selecionadas por . Atualmente encontrei apenas esta lista de passes, mas nada sobre os níveis de otimização.-Ox
fonte
-simplifycfg
se repetem?simplifycfg
são necessários para vários passes. Edebug-pass=Arguments
provavelmente acontece antes da desduplicação. Removi as duplicatas em minha resposta, obrigado por seus comentários.-Og
um GCC agora; 2. Todas as especificações para as versões anteriores ainda são necessárias? 3. Acho que, dadas as boas mudanças que foram feitas ao longo dos anos, e o status da comunidade, vou reduzir minha resposta para apenas mencionar coisas comoclang -cc1 -mllvm -help-list-hidden
(a menos que você prefira integrá-las).A resposta de @Antoine (e a outra pergunta vinculada) descreve com precisão as otimizações do LLVM que estão habilitadas, mas existem algumas outras opções específicas do Clang (ou seja, aquelas que afetam a redução para o AST) que são afetadas pelos
-O[0|1|2|3|fast]
sinalizadores.Você pode dar uma olhada nisso com:
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 -\#\#\#
Por exemplo,
-O0
permite-mrelax-all
,-O1
permite-vectorize-loops
e-vectorize-slp
, e-Ofast
permite-menable-no-infs
,-menable-no-nans
,-menable-unsafe-fp-math
,-ffp-contract=fast
e-ffast-math
.@Techogrebo:
Sim, não necessariamente não precisa das outras ferramentas LLVM. Experimentar:
echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options
Além disso, existem opções muito mais detalhadas que você pode examinar / modificar apenas com o Clang ... você só precisa saber como acessá-las!
Experimente alguns dos seguintes:
clang -help
clang -cc1 -help
clang -cc1 -mllvm -help
clang -cc1 -mllvm -help-list-hidden
clang -cc1as -help
fonte
LLVM 3.6 -O1
Argumentos de aprovação:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -always -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loopsa-simplify -lcs -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -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-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-presupostos -strip-dead-prototypes -verify -verify-di
-O2 com base em -O1
adicionar: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge
e remove: -sempre-inline
-O3 baseado em -O2
adicionar: -argpromotion
fonte