Tingkat pengoptimalan dentang


94

Pada gcc, manual menjelaskan apa -O3, -Os, dll menerjemahkan ke dalam hal argumen optimasi khusus ( -funswitch-loops, -fcompare-elim, dll)

Saya mencari info yang sama untuk dentang .

Saya telah melihat online dan man clangyang hanya memberikan informasi umum ( -O2mengoptimalkan lebih dari -O1, -Osmengoptimalkan kecepatan,…) dan juga melihat di Stack Overflow dan menemukan ini , tetapi saya belum menemukan sesuatu yang relevan dalam file sumber yang dikutip.

Sunting: Saya menemukan jawaban tetapi saya masih tertarik jika ada yang memiliki tautan ke panduan pengguna yang mendokumentasikan semua lolos pengoptimalan dan jalur yang dipilih oleh . Saat ini saya baru saja menemukan ini daftar berlalu, tapi tidak ada pada tingkat optimasi.-Ox

Jawaban:


160

Saya menemukan pertanyaan terkait ini .

Singkatnya, untuk mengetahui tentang pengoptimalan compiler melewati:

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

Seperti yang ditunjukkan dalam jawaban Geoff Nixon (+1), clangjuga menjalankan beberapa pengoptimalan tingkat yang lebih tinggi, yang dapat kita ambil dengan:

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

Dokumentasi pas individu tersedia di sini .



Dengan versi 6.0 pass-nya adalah sebagai berikut:

  • baseline ( -O0):

    • optset : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangmenambahkan : -mdisable-fp-elim -mrelax-all
  • -O1 berdasarkan pada -O0

    • opt menambahkan:-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 -cabang-prob -lazy-blok-freq -opt-komentar-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-simplify -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-distribut-loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect
    • clangmenambahkan : -momit-leaf-frame-pointer
    • clangtetes : -mdisable-fp-elim -mrelax-all
  • -O2 berdasarkan pada -O1

    • optmenambahkan : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • opttetes : -selalu-inline
    • clangmenambahkan : -vectorize-loops -vectorize-slp
  • -O3 berdasarkan pada -O2

    • optmenambahkan : -callsite-splitting -argpromotion
  • -Ofastdidasarkan pada -O3, valid di clangtetapi tidak diopt

    • clangmenambahkan : -fno-signed-nol -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -tidak terbatas-matematika-saja
  • -Os mirip dengan -O2

    • opttetes : -libcalls-shrinkwrap dan -pgo-memopt-opt
  • -Oz berdasarkan pada -Os

    • opttetes : -slp-vectorizer

Dengan versi 3.8 operasinya adalah sebagai berikut:

  • baseline ( -O0):

    • optset : -targetlibinfo -tti -verify
    • clangmenambahkan : -mdisable-fp-elim -mrelax-all
  • -O1 berdasarkan pada -O0

    • optmenambahkan : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplify -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 -bate -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangmenambahkan : -momit-leaf-frame-pointer
    • clangtetes : -mdisable-fp-elim -mrelax-all
  • -O2 berdasarkan pada -O1

    • optmenambahkan : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opttetes : -selalu-inline
    • clangmenambahkan : -vectorize-loops -vectorize-slp
  • -O3 berdasarkan pada -O2

    • optmenambahkan : -argpromotion
  • -Ofastdidasarkan pada -O3, valid di clangtetapi tidak diopt

    • clangmenambahkan : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os sama dengan -O2

  • -Oz berdasarkan pada -Os

    • opttetes : -slp-vectorizer
    • clangtetes : -vectorize-loops


Dengan versi 3.7, langkah-langkahnya adalah sebagai berikut (hasil parsing dari perintah di atas):

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

  • -O1 didasarkan pada -O0

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

    • menambahkan : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • menghapus : -selalu-sebaris
  • -O3 didasarkan pada -O2

    • menambahkan : -argpromotion -verif
  • -Os identik dengan -O2

  • -Oz didasarkan pada -Os

    • menghapus : -slp-vectorizer


Untuk versi 3.6 , lintasan seperti yang didokumentasikan di pos GYUNGMIN KIM.


Dengan versi 3.5 passnya adalah sebagai berikut (hasil parsing dari perintah di atas):

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

  • -O1 didasarkan pada -O0

    • menambahkan : -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-sederhanakan -loop-vectorize -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-evolusi -lower-mengharapkan -licm -loop-idiom -adce -domtree -lcssa
  • -O2 didasarkan pada -01

    • menambahkan : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • menghapus : -selalu-sebaris
  • -O3 didasarkan pada -O2

    • menambahkan : -argpromotion
  • -Os identik dengan -O2

  • -Oz didasarkan pada -Os

    • menghapus : -slp-vectorizer


Dengan versi 3.4 , operannya adalah sebagai berikut (hasil parsing dari perintah di atas):

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

  • -O1 didasarkan pada -O0

    • menambahkan : -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-sederhanakan -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 didasarkan pada -01

    • menambahkan : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • menghapus : -selalu-sebaris
  • -O3 didasarkan pada -O2

    • menambahkan : -argpromotion
  • -Os identik dengan -O2

  • -Oz didasarkan pada -O2

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


Dengan versi 3.2 , operannya adalah sebagai berikut (hasil parsing dari perintah di atas):

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

  • -O1 didasarkan pada -O0

    • menambahkan : -sroa -early-cse -lower-expect -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-simplify -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 didasarkan pada -01

    • menambahkan : -inline -globaldce -constmerge
    • menghapus : -selalu-sebaris
  • -O3 didasarkan pada -O2

    • menambahkan : -argpromotion
  • -Os identik dengan -O2

  • -Oz identik dengan -Os


Edit [Maret 2014] menghapus duplikat dari daftar.

Sunting [April 2014] menambahkan tautan dokumentasi + opsi untuk 3.4

Edit [september 2014] menambahkan opsi untuk 3.5

Edit [desember 2015] menambahkan opsi untuk 3.7 dan menyebutkan jawaban yang ada untuk 3.6

Sunting [Mei 2016] menambahkan opsi untuk 3.8, baik untuk memilih dan dentang dan menyebutkan jawaban yang ada untuk dentang (versus memilih)

Edit [nov 2018] tambahkan opsi untuk 6.0


2
Apakah ada cara untuk melakukan ini dengan versi dentang yang disertakan dengan XCode5? Saya sudah mencoba mencari-cari perintah llvm-as, tetapi tidak ada di komputer saya di mana pun yang dapat saya lihat
Teknogrebo

@Antoine, mengapa beberapa bendera, seperti -simplifycfgdiulang?
Paschalis

2
@ Paschalis: Saya tidak yakin, tetapi karena beberapa lintasan pengoptimalan hanya berfungsi jika beberapa lintasan lain telah dijalankan, dan misalnya simplifycfgdiperlukan oleh beberapa lintasan. Dan debug-pass=Argumentsmungkin terjadi sebelum deduplikasi. Saya menghapus duplikat dalam jawaban saya, terima kasih atas tanggapan Anda.
Antoine

5
Beberapa pengoptimalan membuat hal-hal yang dapat dioptimalkan lebih lanjut (kode mati, dll.), Jadi mungkin masuk akal untuk menjalankan kembali beberapa pengoptimalan.
cyco130

1
@ZachB / @Antoine Mengapa tidak (juga?) LLVM 7 (atau itu maksud Anda?) Juga: 1. Saya tidak yakin sudah berapa lama, tapi sekarang ada juga -Ogyang ala GCC; 2. Apakah semua spesifikasi untuk versi lama masih diperlukan? 3. Saya pikir dengan perubahan bagus yang telah dibuat selama bertahun-tahun, dan status komunitas, saya akan memotong jawaban saya hanya dengan menyebutkan hal-hal seperti clang -cc1 -mllvm -help-list-hidden(kecuali Anda lebih suka mengintegrasikannya).
Geoff Nixon

16

Jawaban @ Antoine (dan pertanyaan lain yang ditautkan) secara akurat menjelaskan pengoptimalan LLVM yang diaktifkan, tetapi ada beberapa opsi khusus Clang lainnya (yaitu, yang memengaruhi penurunan ke AST) yang dipengaruhi oleh -O[0|1|2|3|fast]flag.

Anda dapat melihat ini dengan:

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

Misalnya, -O0memungkinkan -mrelax-all, -O1memungkinkan -vectorize-loopsdan -vectorize-slp, dan -Ofastmemungkinkan -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fastdan -ffast-math.


@Techogrebo:

Ya, tidak perlu alat LLVM lainnya. Mencoba:

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

Selain itu, ada lebih banyak opsi mendetail yang dapat Anda periksa / modifikasi dengan Clang saja ... Anda hanya perlu tahu cara mengaksesnya!

Cobalah beberapa dari:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

LLVM 3.6 -O1

Lulus Argumen:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -selalu -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtsa -loop -loop-sederhanakan -lcssa -loop -loop-sederhanakan -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-evolusi -loop -vektorisasi -instcombine-simplifycfg -domtree -instcombine -loops -loop-sederhanakan -lcssa -scalar-evolusion -function_tti -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -verify -verify-di

-O2 berdasarkan -O1

tambahkan: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolusi -slp-vectorizer -globaldce -constmerge

dan menghapus: -selalu-sebaris

-O3 berdasarkan -O2

tambahkan: -argpromotion

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.