ระดับการเพิ่มประสิทธิภาพเสียงดัง


95

บน gcc, คู่มืออธิบายถึงสิ่งที่-O3, -Osฯลฯ แปลในแง่ของการขัดแย้งการเพิ่มประสิทธิภาพโดยเฉพาะ ( -funswitch-loops, -fcompare-elimฯลฯ )

ฉันกำลังมองหาข้อมูลเหมือนกันสำหรับเสียงดังกราว

ผมมองออนไลน์และในการman clangที่เพียง แต่ช่วยให้ข้อมูลทั่วไป ( -O2เพิ่มประสิทธิภาพมากกว่า-O1, -Osจะเพิ่มประสิทธิภาพสำหรับความเร็ว, ... ) และยังมองที่นี่ในกองมากเกินและพบนี้แต่ฉันไม่ได้พบอะไรที่เกี่ยวข้องในการอ้างถึงไฟล์ที่มา

แก้ไข:ผมพบคำตอบ แต่ฉันสนใจยังคงถ้าใครมีการเชื่อมโยงไปยังเอกสารใช้คู่มือการเพิ่มประสิทธิภาพทั้งหมดผ่านและผ่านการคัดเลือกจาก ขณะนี้ฉันเพิ่งพบนี้รายการผ่าน แต่ไม่มีอะไรในระดับที่เพิ่มประสิทธิภาพ-Ox

คำตอบ:


160

ผมพบว่านี้คำถามที่เกี่ยวข้อง

ในการสรุปผลการค้นหาเกี่ยวกับการส่งผ่านการปรับให้เหมาะสมของคอมไพเลอร์:

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 - ตรวจสอบ -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangเพิ่ม : -mdisable-fp-กำจัด -mrelax-all
  • -O1 ขึ้นอยู่กับ -O0

    • opt เพิ่ม:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -branch-prob -lazy-block-freq -opt-note-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative -ecution -lazy-value-info -jump-threading -correlated-propation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simplify -lcssa-verification -lcssa -scalar-evolution -loop-rot -licm -loop-unswitch -indvars -loop-idiom -loop-deleteion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribution-loop-vectorize -loop-load-กำจัด -alignment-from-สมมติฐาน -strip-dead-Prototype -loop-sink -instsimplify -div-rem-pair -verify -ee-instrument -early-cse -lower-expect
    • clangเพิ่ม : -momit-leaf-frame-pointer
    • clangหยด : -mdisable-fp-กำจัด -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 - ไม่มีที่สิ้นสุดคณิตศาสตร์เท่านั้น
  • -Os เหมือนกับ -O2

    • optหยด : -libcalls-shrinkwrap และ -pgo-memopt-opt
  • -Oz ขึ้นอยู่กับ -Os

    • optหยด : -slp-vectorizer

ด้วยเวอร์ชัน 3.8บัตรผ่านมีดังนี้:

  • พื้นฐาน ( -O0):

    • optชุด : -targetlibinfo -tti -verify
    • clangเพิ่ม : -mdisable-fp-กำจัด -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-deleteion -reassociate -strip-dead-prototypes -loops -basicaa -loop-accesses -memcpyopt -loop-deleteion -reassociate -strip-dead-Prototype -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
    • clangเพิ่ม : -momit-leaf-frame-pointer
    • clangหยด : -mdisable-fp-กำจัด -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
    • clangหยด : -vectorize-loops


ด้วยเวอร์ชัน 3.7การส่งผ่านจะเป็นดังนี้ (เอาต์พุตที่แยกวิเคราะห์ของคำสั่งด้านบน):

  • ค่าเริ่มต้น (-O0): -targetlibinfo -verify -tti

  • -O1 ขึ้นอยู่กับ -O0

    • เพิ่ม : -sccp -loop-simplify -float2int -lazy-value-info -correlated-propation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assumption-cache-tracker -reassociate -loop- ลบ -branch-prob -jump-threading -domtree -dse -loop-rot -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 -always-inline
  • -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-การแพร่กระจาย -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-rot -strip-dead-prototypes -loop-deleteion -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-propation -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-delete -loop-idiom -loop-rot -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 -lazy value -info -jump-threading -correlated-propation -tailcallelim -reassociate -loops -loop-simplify -lcssa -loop-rot -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deleteion -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]ลบรายการที่ซ้ำกันออกจากรายการ

แก้ไข [เมษายน 2014]เพิ่มลิงก์เอกสาร + ตัวเลือกสำหรับ 3.4

แก้ไข [กันยายน 2014]เพิ่มตัวเลือกสำหรับ 3.5

แก้ไข [ธันวาคม 2015]เพิ่มตัวเลือกสำหรับ 3.7 และระบุคำตอบที่มีอยู่สำหรับ 3.6

แก้ไข [พฤษภาคม 2016]เพิ่มตัวเลือกสำหรับ 3.8 สำหรับทั้ง opt และ clang และระบุคำตอบที่มีอยู่สำหรับ clang (เทียบกับ opt)

แก้ไข [พ.ย. 2018]เพิ่มตัวเลือกสำหรับ 6.0


2
มีวิธีทำเช่นนี้กับ clang เวอร์ชันที่มาพร้อมกับ XCode5 หรือไม่? ฉันพยายามตามล่าหาคำสั่ง llvm-as แต่ไม่มีอยู่ในเครื่องของฉันทุกที่ที่ฉันเห็น
Teknogrebo

@ แอนทอนทำไมแฟล็กบางไลค์-simplifycfgซ้ำ?
Paschalis

2
@ Paschalis: ฉันไม่แน่ใจ แต่เนื่องจากการเพิ่มประสิทธิภาพบางอย่างจะผ่านไปได้ก็ต่อเมื่อมีการเรียกใช้บัตรอื่น ๆ และตัวอย่างเช่นsimplifycfgจำเป็นต้องใช้หลายรอบ และdebug-pass=Argumentsอาจเกิดขึ้นก่อนการขจัดข้อมูลซ้ำซ้อน ฉันลบคำตอบที่ซ้ำกันออกไปแล้วขอบคุณสำหรับความคิดเห็นของคุณ
Antoine

5
การเพิ่มประสิทธิภาพบางอย่างจะสร้างสิ่งที่สามารถปรับให้เหมาะสมเพิ่มเติมได้ (โค้ดที่ตายแล้วเป็นต้น) ดังนั้นจึงควรเรียกใช้การเพิ่มประสิทธิภาพบางอย่างซ้ำ
cyco130

1
@ZachB / @Antoine ทำไมไม่ (เช่นกัน) LLVM 7 (หรือว่าคุณหมายถึงอะไร) นอกจากนี้: 1. ฉันไม่แน่ใจว่าอยู่ที่นั่นนานแค่ไหน แต่-Ogตอนนี้ก็มี la GCC ด้วย 2. ข้อมูลจำเพาะทั้งหมดสำหรับเวอร์ชันเก่ายังจำเป็นอยู่หรือไม่? 3. ฉันคิดว่าจากการเปลี่ยนแปลงที่ดีที่เกิดขึ้นในช่วงหลายปีที่ผ่านมาและสถานะของชุมชนฉันจะลดคำตอบลงเหลือเพียงการพูดถึงสิ่งต่างๆเช่นclang -cc1 -mllvm -help-list-hidden(เว้นแต่คุณต้องการที่จะรวมเข้าด้วยกัน)
Geoff Nixon

16

คำตอบของ @ Antoine (และคำถามอื่น ๆ ที่เชื่อมโยง) อธิบายถึงการเพิ่มประสิทธิภาพLLVMที่เปิดใช้งานได้อย่างถูกต้องแต่มีตัวเลือกเฉพาะอื่น ๆ อีกสองสามตัวเลือก (เช่นคำตอบที่มีผลต่อการลด 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 -inwaysline-costline -inline-functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deleteion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -info -jump-threading -correlated-propation -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-Assumptions -strip-dead-prototypes -verify -verify-di

-O2 บนฐาน -O1

เพิ่ม: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

และลบ: -always-inline

-O3 ขึ้นอยู่กับ -O2

เพิ่ม: -argpromotion

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.