Clang 최적화 수준


94

GCC에서 매뉴얼이 무엇인지 설명하고 -O3, -Os등 특정 최적화 인수의 관점에서로 번역 ( -funswitch-loops, -fcompare-elim, 등)

clang에 대한 동일한 정보를 찾고 있습니다.

내가 검토 한 온라인 및에 man clang있는 전용 (일반 정보를 제공합니다 -O2개를 최적화를 -O1, -Os속도 최적화, ...) 또한 스택 오버플로 여기에보고 발견 ,하지만 난 인용 된 소스 파일의 관련 아무것도 발견하지 않았습니다.

편집 : 답을 찾았지만 모든 최적화 패스와에서 선택한 패스를 문서화하는 사용자 설명서에 대한 링크가있는 사람이 있다면 여전히 관심 이 있습니다. 현재 난 그냥 발견 최적화 레벨을 뚫고 목록,하지만 아무것도.-Ox

답변:


159

관련 질문을 찾았습니다 .

요약하면 컴파일러 최적화 패스에 대해 알아 보려면 다음을 수행하십시오.

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

Geoff Nixon 의 답변 (+1) 에서 지적했듯이 clang추가로 몇 가지 더 높은 수준의 최적화를 실행하며 다음을 사용하여 검색 할 수 있습니다.

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

개별 패스에 대한 문서는 여기에서 볼 수 있습니다 .



으로 버전 6.0 출입증은 다음과 같습니다 :

  • 기준선 ( -O0) :

    • opt세트 : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clang추가 : -mdisable-fp-elim -mrelax-all
  • -O1 기반 -O0

    • opt 추가:-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-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa-투기 적 실행 -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-distribute-loop-vectorize -loop-load-elim-가정에서 정렬 -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect
    • clang추가 : -momit-leaf-frame-pointer
    • clang상품 : -mdisable-fp-elim -mrelax-all
  • -O2 기반 -O1

    • opt추가 : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • opt상품 :-항상 인라인
    • clang추가 : -vectorize-loops -vectorize-slp
  • -O3 기반 -O2

    • opt추가 : -callsite-splitting -argpromotion
  • -Ofast을 (를) 기반으로 -O3하고 유효 clang하지만 유효 하지는 않습니다.opt

    • clang추가 : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only
  • -Os ~와 비슷하다 -O2

    • optdrops : -libcalls-shrinkwrap 및 -pgo-memopt-opt
  • -Oz 기반 -Os

    • opt방울 : -slp-vectorizer

버전 3.8 출입증은 다음과 같습니다 :

  • 기준선 ( -O0) :

    • opt 세트 : -targetlibinfo -tti -verify
    • clang추가 : -mdisable-fp-elim -mrelax-all
  • -O1 기반 -O0

    • opt 추가 : -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 -basicaa -correlated -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-가정 캐시 추적기
    • clang 추가 : -momit-leaf-frame-pointer
    • clang상품 : -mdisable-fp-elim -mrelax-all
  • -O2 기반 -O1

    • opt추가 : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opt상품 :-항상 인라인
    • clang추가 : -vectorize-loops -vectorize-slp
  • -O3 기반 -O2

    • opt추가 : -argpromotion
  • -Ofast을 (를) 기반으로 -O3하고 유효 clang하지만 유효 하지는 않습니다.opt

    • clang추가 : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os 와 같다 -O2

  • -Oz 기반 -Os

    • opt방울 : -slp-vectorizer
    • clangdrops : -vectorize-loops


으로 버전 3.7 이용권은 다음 (명령어의 상기 파싱 된 출력)과 같다 :

  • 기본값 (-O0) : -targetlibinfo -verify -tti

  • -O1은 -O0을 기반으로합니다.

    • 추가 : -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 -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep-항상 인라인
  • -O2는 -01을 기준으로합니다.

    • 추가 : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • 제거 : -always-inline
  • -O3는 -O2를 기반으로합니다.

    • 추가 : -argpromotion -verif
  • -Os는 -O2와 동일합니다.

  • -Oz는 -Os를 기반으로합니다.

    • 제거 : -slp-vectorizer


들어 버전 3.6 출입증은 GYUNGMIN KIM의 게시물에 설명되어 있습니다.


으로 버전 3.5 이용권은 다음 (명령어의 상기 파싱 된 출력)과 같다 :

  • 기본값 (-O0) : -targetlibinfo -verify -verify-di

  • -O1은 -O0을 기반으로합니다.

    • 추가 : -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplify -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-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
  • -O2는 -01을 기준으로합니다.

    • 추가 : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • 제거 : -always-inline
  • -O3는 -O2를 기반으로합니다.

    • 추가 : -argpromotion
  • -Os는 -O2와 동일합니다.

  • -Oz는 -Os를 기반으로합니다.

    • 제거 : -slp-vectorizer


버전 3.4 이용권은 다음 (명령어의 상기 파싱 된 출력)과 같다 :

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

  • -O1은 -O0을 기반으로합니다.

    • 추가 : -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-simplify -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는 -01을 기준으로합니다.

    • 추가 : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • 제거 : -always-inline
  • -O3는 -O2를 기반으로합니다.

    • 추가 : -argpromotion
  • -Os는 -O2와 동일합니다.

  • -Oz는 -O2를 기반으로합니다.

    • 제거 : -barrier -loop-vectorize -slp-vectorizer


으로 버전 3.2 이용권은 다음 (명령어의 상기 파싱 된 출력)과 같다 :

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

  • -O1은 -O0을 기반으로합니다.

    • 추가 : -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-상관 전파 -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는 -01을 기준으로합니다.

    • 추가 : -inline -globaldce -constmerge
    • 제거 : -always-inline
  • -O3는 -O2를 기반으로합니다.

    • 추가 : -argpromotion
  • -Os는 -O2와 동일합니다.

  • -Oz는 -Os와 동일합니다.


수정 [2014 년 3 월] 목록에서 중복 항목을 제거했습니다.

수정 [2014 년 4 월] 3.4에 대한 문서 링크 + 옵션 추가

편집 [2014 년 9 월] 3.5 옵션 추가

편집 [2015 년 12 월] 3.7에 대한 옵션 추가 및 3.6에 대한 기존 답변 언급

편집 [2016 년 5 월] opt 및 clang 모두에 대한 3.8 옵션 추가 및 clang에 대한 기존 답변 언급 (opt 대)

수정 [2018 년 11 월] 6.0 옵션 추가


2
XCode5와 함께 제공되는 clang 버전으로이를 수행하는 방법이 있습니까? 나는 LLVM-같은 명령 주위에 사냥을 시도했지만, 그것은 내가 볼 수있는 내 컴퓨터의 어느 곳에서 존재하지 않는
Teknogrebo

@Antoine, 같은 일부 플래그 -simplifycfg가 반복되는 이유 는 무엇입니까?
Paschalis 2014 년

2
@Paschalis : 확실하지 않지만 일부 최적화 패스는 다른 패스가 실행 된 경우에만 작동하며 예를 들어 simplifycfg여러 패스에 필요합니다. 그리고 debug-pass=Arguments아마도 중복 제거 전에 발생합니다. 귀하의 의견에 감사드립니다.
Antoine

5
일부 최적화는 추가로 최적화 할 수있는 항목 (데드 코드 등)을 생성하므로 일부 최적화 단계를 다시 실행하는 것이 좋습니다.
cyco130 2014

1
@ZachB / @Antoine 왜 안돼요? (또한?) LLVM 7 (또는 그게 무슨 뜻인가요?) 또한 : 1. 얼마나 오래 있었는지 모르겠지만 -Og지금은 la GCC도 있습니다. 2. 이전 버전에 대한 모든 세부 사항이 여전히 필요합니까? 3. 수년에 걸쳐 이루어진 멋진 변경 사항과 커뮤니티 상태를 고려할 때 clang -cc1 -mllvm -help-list-hidden(통합을 선호하지 않는 한) 다음 과 같은 항목을 언급하는 것으로 답을 줄이려고 합니다.
Geoff Nixon

16

@Antoine의 답변 (및 연결된 다른 질문) 은 활성화 된 LLVM 최적화를 정확하게 설명 하지만 Clang 관련 옵션 (예 : AST로 낮추는 데 영향을주는 옵션)이 몇 가지 있습니다.-O[0|1|2|3|fast] 플래그의 있습니다.

다음과 같이 살펴볼 수 있습니다.

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

예를 들어, -O0-mrelax-all, -O1-vectorize-loops-vectorize-slp, 그리고 -Ofast-menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fast-ffast-math.


@Techogrebo :

예, 아니요, 반드시 다른 LLVM 도구가 필요하지는 않습니다. 시험:

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

또한 Clang만으로 검사 / 수정할 수있는 훨씬 더 자세한 옵션이 있습니다 ... 그 옵션에 접근하는 방법 만 알면됩니다!

다음 중 몇 가지를 시도해보십시오.

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

LLVM 3.6 -O1

인수 전달 :-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-재 연결 -domtree -loops -loop-simplify -lcssa -loop -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 -벡터화 -instcombine-simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-assumptions -strip-dead-prototypes -verify -verify-di

-O1에 -O2 염기

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

및 제거 : -always-inline

-O2 기반 -O3

추가 : -argpromotion

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.