Clang optimizasyon seviyeleri


94

Gcc günü, manuel açıklar -O3, -Osvb özgü optimizasyon argümanlar açısından çevirmek ( -funswitch-loops, -fcompare-elimvs.)

Ben clang için aynı bilgiyi arıyorum .

Ben baktım çevrimiçi ve man clanghangi sadece (genel bilgi veren -O2fazla optimize eder -O1, -Oshız için optimize, ...) ve ayrıca Yığın taşması burada baktı ve bulunan bu ama atıf kaynak dosyaları ilgili bir şey bulamadım.

Düzenleme: Bir cevap buldum, ancak yine de herhangi birinin tüm optimizasyon geçişlerini ve seçilen geçişleri belgeleyen bir kullanıcı kılavuzuna bir bağlantısı olup olmadığını merak ediyorum . Şu anda bu geçiş listesini buldum , ancak optimizasyon seviyelerinde hiçbir şey bulamadım.-Ox

Yanıtlar:


160

Bu ilgili soruyu buldum .

Özetlemek gerekirse, derleyici optimizasyon geçişleri hakkında bilgi edinmek için:

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

İşaret edildiği gibi Geoff Nixon 'ın cevabı (1), clangayrıca biz alabilir bazı üst düzey optimizasyonlar, çalıştırır:

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

Bireysel geçişlerin dokümantasyonu burada mevcuttur .



İle sürüm 6.0 geçtiği aşağıdaki gibidir:

  • taban çizgisi ( -O0):

    • optayarlar : -tti -verify -ee-enstrüman -targetlibinfo -assumption-cache-tracker -profile-özet-info -forceattrs -basiccg -always-inline-barrier
    • clangşunu ekler : -mdisable-fp-elim -mrelax-all
  • -O1 dayanır -O0

    • opt ekler:-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-rem-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -specülative-execution -lazy-value-info -jump-threading -korelasyonlu-propagasyon -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simplify -lcssa-doğrulama -lcssa-skalar-evrim -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demand-bit -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -döngü erişimleri -döngü dağıtma-döngü-vektörleştir-döngü-yük-ortadan kaldır-varsayımlardan-hizalama-şerit-ölü-prototipler-döngü-çökme-basitleştirin -div-rem-çiftleri -doğrula -e-enstrümanı-erken-cse -düşük-bekle
    • clangekler : -momit-yaprak-çerçeve-işaretçisi
    • clangdrop : -mdisable-fp-elim -mrelax-all
  • -O2 dayanır -O1

    • optekler : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optdamla : -always-inline
    • clangekler : -vectorize-döngüleri -vectorize-slp
  • -O3 dayanır -O2

    • optekler : -callsite-splitting -argpromotion
  • -Ofasttemel alır -O3, içinde geçerlidir clangancak içinde değildiropt

    • clangekler : -fno-işaretli-sıfırlar -freciprocal-math -ffp-contract = hızlı -menable-güvensiz-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-matematik
  • -Os benzer -O2

    • optdrop : -libcalls-shrinkwrap ve -pgo-memopt-opt
  • -Oz dayanır -Os

    • optdamla : -slp-vektörleştirici

İle sürümü 3.8 geçtiği aşağıdaki gibidir:

  • taban çizgisi ( -O0):

    • optsetler : -targetlibinfo -tti -verify
    • clangşunu ekler : -mdisable-fp-elim -mrelax-all
  • -O1 dayanır -O0

    • optekler : -globalopt -dendilen-bitler -branch-prob -inferattrs -ipsccp -dse -döngü-sadeleştirme -kapsamlı-noalias -bariyer -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -temel deyim -loop -om -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototipler -loops -basicaa -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -düşük-bekle -sroa-loop-unroll -hizalama-varsayımlardan -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangekler : -momit-yaprak-çerçeve-işaretçisi
    • clangdrop : -mdisable-fp-elim -mrelax-all
  • -O2 dayanır -O1

    • optekler : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optdamla : -always-inline
    • clangekler : -vectorize-döngüleri -vectorize-slp
  • -O3 dayanır -O2

    • optekler : -argpromotion
  • -Ofasttemel alır -O3, içinde geçerlidir clangancak içinde değildiropt

    • clangekler : -fno-işaretli-sıfırlar -freciprocal-math -ffp-contract = hızlı -menable-güvensiz-fp-math -menable-no-nans -menable-no-infs
  • -Os aynıdır -O2

  • -Oz dayanır -Os

    • optdamla : -slp-vektörleştirici
    • clangdamla : -vectorize-döngüler


İle 3.7 sürümüne geçer aşağıdaki (komut yukarıda çözümlü çıkış) gibidir:

  • varsayılan (-O0): -targetlibinfo -verify -tti

  • -O1, -O0'a dayanır

    • şunu ekler : -sccp -döngü basitleştir-float2int -lazy-değer-bilgi -ilişkilendirilmiş-yayılma -bdce -lcssa -deadargelim-döngü-açma-döngü-vektörü-bariyer -memcpyopt -döngü-erişim-varsayım-önbellek-izleyici-yeniden ilişkilendirme -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -hizalama-varsayımlardan-erken-cse-satır içi -cost -simplifycfg -strip-dead-prototipler -tbaa -sroa -no-aa -adce -functionattrs -düşük beklenti -basiccg-döngüleri -loop-deyim -tailcallelim -basicaa -indvars -globalopt -blok-frekans-skalar-evrim -memdep -always-inline
  • -O2, -01'e dayanır

    • ekler : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • kaldırır : -always-inline
  • -O3, -O2'ye dayanır

    • ekler : -argpromotion -verif
  • -Os, -O2 ile aynıdır

  • -Oz, -Os'a dayanır

    • kaldırır : -slp-vectorizer


İçin sürümü 3.6 geçtiği olarak GYUNGMIN KIM'in yayında belgelenmiştir.


İle sürüm 3.5 geçtiği takip (komutun yukarıdakilerden çözümlü çıkışı) gibidir:

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

  • -O1, -O0'a dayanır

    • ekler : -ilgili-yayılma -temelcg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -bariyer -block-freq -loop-basitleştirme -loop-vectorize -inline-maliyet -branch-prob -early-cse -lazy-value-info -loop-rotate -strip-dead-prototipler -loop-deletion -tbaa -prune-eh -indvars -loop-unroll-yeniden ilişkilendirme -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -düşük-beklemek -licm -loop-deyim -adce -domtree -lcssa
  • -O2, -01'e dayanır

    • şunu ekler : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • kaldırır : -always-inline
  • -O3, -O2'ye dayanır

    • ekler : -argpromotion
  • -Os, -O2 ile aynıdır

  • -Oz, -Os'a dayanır

    • kaldırır : -slp-vectorizer


İle sürüm 3.4 geçer aşağıdaki (komut yukarıda çözümlü çıkış) gibidir:

  • -O0: -targetlibinfo -preverify -domtree -doğrulama

  • -O1, -O0'a dayanır

    • ekler : -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-döngü-silme-döngü-deyim-döngü-döndür-döngü-basitleştirme-döngü-açma-döngü-çözme -döngüler -düşük-bekle -memcpyopt -memdep -no-aa -notti -prune-eh-yeniden ilişkilendirme-skalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototipler -tailcallelim -tbaa
  • -O2, -01'e dayanır

    • şunu ekler : -bariyer -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • kaldırır : -always-inline
  • -O3, -O2'ye dayanır

    • ekler : -argpromotion
  • -Os, -O2 ile aynıdır

  • -Oz, -O2'ye dayanır

    • kaldırır : -barrier -loop-vectorize -slp-vectorizer


İle sürüm 3.2 geçer aşağıdaki (komut yukarıda çözümlü çıkış) gibidir:

  • -O0: -targetlibinfo -preverify -domtree -doğrulama

  • -O1, -O0'a dayanır

    • ekler : -sroa-erken-cse -düşük-bekle -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value -bilgi-atlama-iş parçacığı-ilişkili-yayılma-kuyruklu konuşma-yeniden ilişkilendirme -döngüler-döngü-basitleştirme -lcssa-döngü-döndürme -licm-döngü-anahtarını açma-skalar-evrim -indvars-döngü-deyim-döngü-silme-döngü-döndürme -memdep -memcpyopt -sccp -dse -adce -strip-ölü-prototipler
  • -O2, -01'e dayanır

    • ekler : -inline -globaldce -constmerge
    • kaldırır : -always-inline
  • -O3, -O2'ye dayanır

    • ekler : -argpromotion
  • -Os, -O2 ile aynıdır

  • -Oz, -Os ile aynıdır


Düzenleme [Mart 2014] , listelerden kopyaları kaldırdı.

Düzenleme [nisan 2014] dokümantasyon bağlantısı + 3.4 için seçenekler eklendi

Düzenleme [Eylül 2014] 3.5 için seçenekler eklendi

Düzenleme [aralık 2015] 3.7 için seçenekler ekledi ve 3.6 için mevcut yanıtı belirtin

Edit [mayıs 2016] 3.8 için seçenekler ekledi, hem tercih hem de clang için ve clang için mevcut yanıtı belirt (tercihe karşı)

Düzenleme [Kasım 2018] 6.0 için seçenek ekleme


2
Bunu XCode5 ile birlikte gelen clang sürümüyle yapmanın bir yolu var mı? Llvm-as komutu için etrafta dolaşmayı denedim, ancak
makinemde

@Antoine, neden bazı bayraklar -simplifycfgtekrarlanıyor?
Paschalis

2
@Paschalis: Emin değilim, ancak bazı optimizasyon geçişleri yalnızca başka geçişler çalıştırıldıysa ve örneğin simplifycfgbirden çok geçiş için gerekli olduğunda çalışır. Ve debug-pass=Argumentsmuhtemelen tekilleştirmeden önce gerçekleşir. Cevabımdaki kopyaları kaldırdım, geri bildiriminiz için teşekkürler.
Antoine

5
Bazı optimizasyonlar, daha fazla optimize edilebilecek şeyler oluşturur (ölü kod vb.), Bu nedenle bazı optimizasyon geçişlerini yeniden çalıştırmak mantıklı olabilir.
cyco130

1
@ZachB / @Antoine Neden (aynı zamanda?) LLVM 7 (veya bunu kastettiğin bu mu?) Ayrıca: 1. Ne kadar süredir orada olduğundan emin değilim, ama -Ogşimdi bir de GCC var; 2. Eski sürümler için tüm ayrıntılar hala gerekli mi? 3. Yıllar içinde yapılan güzel değişiklikler ve topluluk statüsü göz önüne alındığında, cevabımı sadece şu gibi şeylerden bahsetmekle kısaltacağım clang -cc1 -mllvm -help-list-hidden(entegre etmeyi tercih etmediğiniz sürece).
Geoff Nixon

16

@ Antoine'ın cevabı (ve bağlantılı diğer soru) , etkinleştirilen LLVM optimizasyonlarını doğru bir şekilde açıklar , ancak -O[0|1|2|3|fast]işaretlerden etkilenen Clang'a özgü birkaç seçenek (yani, AST'ye düşürmeyi etkileyenler) vardır .

Bunlara bir göz atabilirsiniz:

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 -\#\#\#

Örneğin, -O0etkinleştirir-mrelax-all , -O1sağlar -vectorize-loopsve -vectorize-slpve -Ofastsağlayan -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fastve -ffast-math.


@Techogrebo:

Evet, hayır, diğer LLVM araçlarına ihtiyaç duymaz. Deneyin:

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

Ayrıca, yalnızca Clang ile inceleyebileceğiniz / değiştirebileceğiniz çok daha ayrıntılı seçenekler var ... sadece bunlara nasıl ulaşacağınızı bilmeniz gerekiyor!

Şunlardan birkaçını deneyin:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

LLVM 3.6 -O1

Geçiş Bağımsız Değişkenleri:-hedeflibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -line-cost -always -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -korelasyonlu-propagasyon -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-basitleştirin -lcssa -loop -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-deyim -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -bilgi-atlama-iş parçacığı-ilişkili-yayılma -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-basitleştir -lcssa -branch-prob -block-freq -scalar-evrim-döngü -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -verify -verify-di

-O1 bazında -O2

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

ve kaldırır: -always-inline

-O3, -O2'ye göre

ekleyin: -argpromotion

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.