Mức độ tối ưu hóa Clang


91

Trên gcc, hướng dẫn giải thích gì -O3, -Osvv dịch để về lập luận cụ thể tối ưu hóa ( -funswitch-loops, -fcompare-elim, vv)

Tôi đang tìm kiếm thông tin tương tự cho tiếng kêu .

Tôi đã tìm kiếm trực tuyến và trong man clangđó chỉ cung cấp thông tin chung chung ( -O2tối ưu hóa nhiều hơn -O1, -Ostối ưu hóa tốc độ,…) và cũng đã xem ở đây trên Stack Overflow và tìm thấy điều này , nhưng tôi không tìm thấy bất kỳ điều gì có liên quan trong các tệp nguồn được trích dẫn.

Chỉnh sửa: Tôi đã tìm thấy câu trả lời nhưng tôi vẫn quan tâm nếu ai đó có liên kết đến tài liệu hướng dẫn sử dụng ghi lại tất cả các lần vượt qua tối ưu hóa và các lần vượt qua được chọn bởi . Hiện nay tôi chỉ tìm thấy này danh sách các đèo, nhưng không có gì trên mức tối ưu.-Ox

Câu trả lời:


156

Tôi tìm thấy câu hỏi liên quan này .

Tóm lại, để tìm hiểu về các bước tối ưu hóa trình biên dịch:

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

Như đã chỉ ra trong câu trả lời của Geoff Nixon (+1), clangcũng chạy một số tối ưu hóa cấp cao hơn mà chúng tôi có thể truy xuất bằng:

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

Tài liệu về các thẻ cá nhân có sẵn tại đây .



Với phiên bản 6.0, các lần vượt qua như sau:

  • đường cơ sở ( -O0):

    • optbộ : -tti -verify -ee-tools -targetlibinfo -assumption-cache-tracker -profile-Summary-info -forceattrs -basiccg -always-inline -barrier
    • clangthêm : -mdisable-fp-elim -mrelax-all
  • -O1 được dựa trên -O0

    • opt thêm vào:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-Summary-info -forceattrs -inferattrs -ipsccp -called-value-spreadation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -branch-prob -lazy-block-freq -opt-Notes-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa-tích lũy-thực hiện -lazy-giá trị-thông tin -jump-threading -có tương quan-lan truyền -libcalls-thu nhỏ -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-đơn giản hóa -lcssa-xác minh -lcssa -scalar-tiến hóa -loop-xoay -licm -loop-unswitch -indvars -loop-idiom -loop-deletetion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-Distribution-loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-chìm -instsimplify -div-rem-cặp-xác minh -ee-cụ -early-cse -lower-mong đợi
    • clangthêm : -momit-leaf-frame-pointer
    • clanggiọt : -mdisable-fp-elim -mrelax-all
  • -O2 được dựa trên -O1

    • optthêm : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optgiọt : -always-inline
    • clangthêm : -vectorize-loops -vectorize-slp
  • -O3 được dựa trên -O2

    • optthêm : -callsite-splitting -argpromotion
  • -Ofastdựa trên -O3, hợp lệ trong clangnhưng không trongopt

    • clangthêm : -fno-sign-zeros -freciprocal-math -ffp-contract = fast -menable-secure-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only
  • -Os tương tự như -O2

    • optgiọt : -libcalls-cowrap và -pgo-memopt-opt
  • -Oz được dựa trên -Os

    • optgiọt : -slp-vectorizer

Với phiên bản 3.8, các đường chuyền như sau:

  • đường cơ sở ( -O0):

    • optbộ : -targetlibinfo -tti -verify
    • clangthêm : -mdisable-fp-elim -mrelax-all
  • -O1 được dựa trên -O0

    • optthêm : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplefy -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-xóa -reassociate -strip-dead-nguyên mẫu -loops-tương quan -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-mong đợi -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-Evolution -tbaa -assumption-cache-tracker
    • clangthêm : -momit-leaf-frame-pointer
    • clanggiọt : -mdisable-fp-elim -mrelax-all
  • -O2 được dựa trên -O1

    • optthêm : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optgiọt : -always-inline
    • clangthêm : -vectorize-loops -vectorize-slp
  • -O3 được dựa trên -O2

    • optthêm : -argpromotion
  • -Ofastdựa trên -O3, hợp lệ trong clangnhưng không trongopt

    • clangthêm : -fno-sign-zeros -freciprocal-math -ffp-contract = fast -menable-secure-fp-math -menable-no-nans -menable-no-infs
  • -Os giống như -O2

  • -Oz được dựa trên -Os

    • optgiọt : -slp-vectorizer
    • clanggiọt : -vectorize-vòng


Với phiên bản 3.7, các đường chuyền như sau (đầu ra được phân tích cú pháp của lệnh trên):

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

  • -O1 dựa trên -O0

    • cho biết thêm : -sccp -loop-simplefy -float2int -lazy-value-info -corinity-lan truyền -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assumption-cache-tracker -reassociate -loop-deletetion -branch-prob -jump-threading -domtree -dse -loop-xoay -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-assumptions -early-cse -inline -cost -simplifycfg -strip-dead-nguyên mẫu -tbaa -sroa -no-aa -adce -functionattrs -lower-mong đợi -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-tiến hóa -memdep -always-inline
  • -O2 dựa trên -01

    • thêm : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • loại bỏ : -always-inline
  • -O3 dựa trên -O2

    • thêm : -argpromotion -verif
  • -Os giống với -O2

  • -Oz dựa trên -Os

    • loại bỏ : -slp-vectorizer


Đối với phiên bản 3.6, các đường chuyền như được ghi lại trong bài đăng của GYUNGMIN KIM.


Với phiên bản 3.5, các đường chuyền như sau (đầu ra được phân tích cú pháp của lệnh trên):

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

  • -O1 dựa trên -O0

    • thêm : -có tương quan-lan truyền -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplefy -loop-vectorize -inline-cost -branch-prob -early-cse -lazy-value-info -loop-xoay -strip-dead-prototypes -loop-deletetion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-tiến hóa -lower-mong đợi -licm -loop-idiom -adce -domtree -lcssa
  • -O2 dựa trên -01

    • thêm : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • loại bỏ : -always-inline
  • -O3 dựa trên -O2

    • thêm : -argpromotion
  • -Os giống với -O2

  • -Oz dựa trên -Os

    • loại bỏ : -slp-vectorizer


Với phiên bản 3.4, các đường chuyền như sau (đầu ra được phân tích cú pháp của lệnh trên):

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

  • -O1 dựa trên -O0

    • thêm : -adce -always-inline -basicaa -basiccg -có tương quan-lan truyền -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-deletetion -loop-idiom -loop-quay -loop-đơn giản hóa -loop-unroll -loop-unswitch -loops -lower-mong đợi -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 dựa trên -01

    • thêm : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • loại bỏ : -always-inline
  • -O3 dựa trên -O2

    • thêm : -argpromotion
  • -Os giống với -O2

  • -Oz dựa trên -O2

    • loại bỏ : -barrier -loop-vectorize -slp-vectorizer


Với phiên bản 3.2, các đường chuyền như sau (đầu ra được phân tích cú pháp của lệnh trên):

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

  • -O1 dựa trên -O0

    • thêm : -sroa -early-cse -lower-mong đợi -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplifyla-libcalls-value -info -jump-threading -có liên quan-lan truyền -tailcallelim -reassociate -loops -loop-simplefy -lcssa -loop-xoay -licm -loop-unswitch -scalar-tiến hóa -indvars -loop-idiom -loop-xóa -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 dựa trên -01

    • thêm : -inline -globaldce -constmerge
    • loại bỏ : -always-inline
  • -O3 dựa trên -O2

    • thêm : -argpromotion
  • -Os giống với -O2

  • -Oz giống hệt -Os


Chỉnh sửa [tháng 3 năm 2014] đã xóa các bản sao khỏi danh sách.

Chỉnh sửa [tháng 4 năm 2014] liên kết tài liệu đã thêm + tùy chọn cho 3.4

Chỉnh sửa [tháng 9 năm 2014] đã thêm các tùy chọn cho 3.5

Chỉnh sửa [tháng 12 năm 2015] đã thêm các tùy chọn cho 3.7 và đề cập đến câu trả lời hiện có cho 3.6

Chỉnh sửa [tháng 5 năm 2016] đã thêm các tùy chọn cho 3.8, cho cả opt và clang và đề cập đến câu trả lời hiện có cho clang (so với opt)

Chỉnh sửa [nov 2018] thêm tùy chọn cho 6.0


2
Có cách nào để thực hiện việc này với phiên bản tiếng kêu đi kèm với XCode5 không? Tôi đã cố gắng săn xung quanh cho các llvm-như lệnh, nhưng nó không tồn tại trên bất cứ nơi nào máy tính của tôi mà tôi có thể nhìn thấy
Teknogrebo

@Antoine, tại sao một số cờ, như -simplifycfgđược lặp lại?
Paschalis

2
@Paschalis: Tôi không chắc, nhưng vì một số đường chuyền tối ưu hóa chỉ hoạt động nếu một số đường chuyền khác đã được chạy, và ví dụ: simplifycfgđược yêu cầu bởi nhiều đường chuyền. Và debug-pass=Argumentscó thể xảy ra trước khi khử trùng. Tôi đã xóa các bản sao trong câu trả lời của mình, cảm ơn phản hồi của bạn.
Antoine

5
Một số tối ưu hóa tạo ra những thứ có thể được tối ưu hóa hơn nữa (mã chết, v.v.), vì vậy có thể hợp lý khi chạy lại một số lần tối ưu hóa.
cyco130

1
@ZachB / @Antoine Tại sao không (cũng không?) LLVM 7 (hoặc đó là ý của bạn?) Ngoài ra: 1. Tôi không chắc nó đã ở đó bao lâu, nhưng -Ogbây giờ cũng có một la GCC; 2. Tất cả các chi tiết cụ thể cho các phiên bản cũ có còn cần thiết không? 3. Tôi nghĩ với những thay đổi tốt đẹp đã được thực hiện trong những năm qua và trạng thái cộng đồng, tôi sẽ cắt giảm câu trả lời của mình để chỉ đề cập đến những thứ như clang -cc1 -mllvm -help-list-hidden(trừ khi bạn muốn tích hợp nó).
Geoff Nixon

15

Câu trả lời của @ Antoine (và câu hỏi khác được liên kết) mô tả chính xác các tối ưu hóa LLVM được bật, nhưng có một số tùy chọn cụ thể khác dành riêng cho Clang (tức là những tùy chọn ảnh hưởng đến việc giảm xuống AST) bị ảnh hưởng bởi -O[0|1|2|3|fast]cờ.

Bạn có thể xem những điều này với:

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

Ví dụ, -O0cho phép -mrelax-all, -O1cho phép -vectorize-loops-vectorize-slp, và -Ofastcho phép -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fast-ffast-math.


@Techogrebo:

Có, không, không nhất thiết phải cần các công cụ LLVM khác. Thử:

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

Ngoài ra, có rất nhiều tùy chọn chi tiết hơn mà bạn có thể kiểm tra / sửa đổi chỉ với Clang ... bạn chỉ cần biết cách truy cập chúng!

Hãy thử một vài trong số:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

LLVM 3,6 -O1

Vượt qua đối số:-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 -có tương quan-lan truyền -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplefy -l -rotate -licm -loop-unswitch -instcombine -scalar-tiến hóa -loop-đơn giản hóa -lcssa -indvars -loop-idiom -loop-xóa-chức năng_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -info -jump-threading -có tương quan-lan truyền -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplefy -lcssa -branch-prob -block-freq -scalar-tiến hóa -loop -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-simplefy -lcssa -scalar-Evolution-Function_tti -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -verify -verify-di

-O2 cơ sở trên -O1

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

và loại bỏ: -always-inline

-O3 dựa trên -O2

thêm: -argpromotion

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.