क्लैंग अनुकूलन स्तर


91

जीसीसी पर, मैनुअल बताते हैं क्या -O3, -Osआदि विशिष्ट अनुकूलन तर्क के संदर्भ में से अनुवाद ( -funswitch-loops, -fcompare-elimआदि)

मैं क्लैंग के लिए एक ही जानकारी के लिए देख रहा हूँ

मैं देखा है ऑनलाइन और में man clangजो केवल सामान्य जानकारी देता है ( -O2अधिक से अधिक अनुकूलन -O1, -Osगति अनुकूलित होते हैं, ...) और भी स्टैक ओवरफ़्लो पर यहाँ देखा और पाया यह है, लेकिन मैं उद्धृत स्रोत फ़ाइलों में प्रासंगिक कुछ भी नहीं मिला है।

संपादित करें: मुझे एक उत्तर मिला लेकिन मुझे अभी भी दिलचस्पी है अगर किसी के पास सभी अनुकूलन पासों और द्वारा चयनित पासों के उपयोगकर्ता-मैनुअल का लिंक है । वर्तमान में मुझे सिर्फ पास की यह सूची मिली है, लेकिन अनुकूलन स्तरों पर कुछ भी नहीं है।-Ox

जवाबों:


156

मुझे यह संबंधित प्रश्न मिला ।

कंपाइल ऑप्टिमाइज़ेशन पास के बारे में जानने के लिए:

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

जैसा कि ज्योफ निक्सन के उत्तर (+1) में बताया गया है , clangइसके अतिरिक्त कुछ उच्च स्तरीय अनुकूलन भी चलाए जाते हैं, जिन्हें हम इसके साथ पुनः प्राप्त कर सकते हैं:

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

व्यक्तिगत पास का दस्तावेज़ीकरण यहाँ उपलब्ध है



साथ संस्करण 6.0 गुजरता निम्न हैं:

  • आधार रेखा ( -O0):

    • optसेट्स :
    • clangजोड़ता है : -mdisable-fp-elim -mrelax-all
  • -O1 पर आधारित है -O0

    • opt जोड़ता:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-सारांश-info -forceattrs -inferattrs -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadarglimimica-bica/ica -ब्रांच-प्रोब-लज़ीज़-ब्लॉक-फ्रीक-कॉमेंट-एमिटर -स्टिनकॉम्बिन -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrsrs -sroa -memoryssa -early-cse-memss -sp -Lazy-value-info -jump-threading -correlated-propagation -libcalls-compresswrap -branch-prob -block-freq -pgo-memop-optop -selcallelim -reasociate -loop-simpleify -lcssa-verification -lcssa -scalar-evolution -लूप-रोटेट -लिसलम -लूप-यूनिवर्स -इंडवार्स -लूप-मुहावरे-लूप-विलोपन -लूप-अनरोल -memdep -memcpyopt -sccp -dememeded-बिट्स -bdce -dse -postdomtree -adce -byr -rरियर -rpo-function -rs-फ़ंक्शन -float2int -loop-accesses -loop-वितरित-लूप-वेक्टराइज़ -लूप-लोड-एलिम-एलिमिनेशन-फ्रॉम-कॉन्सेप्ट्स -स्ट्रिप-डेड-प्रोटोटाइप -loop-सिंक -instsimplify -div-rem-जोड़े -verify -ee -ear-cse -lower-उम्मीद
    • clangजोड़ता है : -मोमिट-लीफ-फ्रेम-पॉइंटर
    • clangबूँदें : -मदनीय- fp-elim -mrelax-all
  • -O2 पर आधारित है -O1

    • optजोड़ता है : -लाइन -मल्डस्ट-मोशन -ग्वान -लिम-एग्जॉस्ट -slp-वेक्टरलाइज़र -केंमर
    • optबूँदें : -रेलवे-इनलाइन
    • clangजोड़ता है : -vectorize-loops -vectorize-slp
  • -O3 पर आधारित है -O2

    • optजोड़ता है : -कॉलेजाइट-स्प्लिटिंग -रगप्रोमिशन
  • -Ofastपर आधारित है -O3, clangलेकिन में मान्य नहीं हैopt

    • clangकहते हैं : -fno-साइन्ड-शून्य -freciprocal-गणित -ffp अनुबंध = तेजी -menable-असुरक्षित-FP-गणित -menable-नो-Nans -menable-नो-infs -mreassociate -fno-फँसाने-गणित -ffast-गणित -ffinite-गणित-केवल
  • -Os के समान है -O2

    • optबूँदें : -लिब्लेस-सिकुड़ा हुआ और -पोगो-मेमॉप्ट-ऑप्ट
  • -Oz पर आधारित है -Os

    • optबूँदें : -Slp-वेक्टरक

साथ संस्करण 3.8 गुजरता निम्न हैं:

  • आधार रेखा ( -O0):

    • optसेट : -getgetlibinfo -tti -verify
    • clangजोड़ता है : -mdisable-fp-elim -mrelax-all
  • -O1 पर आधारित है -O0

    • optजोड़ता है : -globalopt -demanded-बिट्स -ranchch-prob -inferattrs -ipsccp -dse -loop-simpleify -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basic-gadc -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-वेक्टरक -लेटिस्केल -functionattrs -loop-accesses -memcpyopt -loop-deleteion -stsociate -rip। -propagation -lcssa -domtree -always-in -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-धारणाएँ -lazy-value-info -pr-eh -jump-threading -loop -रोटेट -इंडवर -बेडस-स्लाकर-इवोल्यूशन -टैबा -स्म्यूलेशन-कैश-ट्रैकर
    • clangजोड़ता है : -मोमिट-लीफ-फ्रेम-पॉइंटर
    • clangबूँदें : -मदनीय- fp-elim -mrelax-all
  • -O2 पर आधारित है -O1

    • optकहते हैं :
    • optबूँदें : -रेलवे-इनलाइन
    • clangजोड़ता है : -vectorize-loops -vectorize-slp
  • -O3 पर आधारित है -O2

    • optजोड़ता है : -ggpromotion
  • -Ofastपर आधारित है -O3, clangलेकिन में मान्य नहीं हैopt

    • clangकहते हैं : -fno-साइन्ड-शून्य -freciprocal-गणित -ffp अनुबंध = तेजी -menable-असुरक्षित-FP-गणित -menable-नो-Nans -menable-नो-infs
  • -Os के समान है -O2

  • -Oz पर आधारित है -Os

    • optबूँदें : -Slp-वेक्टरक
    • clangबूँदें : -वेक्टराइज़-लूप्स


साथ संस्करण 3.7 गुजरता पालन (उपरोक्त आदेश के पार्स उत्पादन) कर रहे हैं:

  • डिफ़ॉल्ट (-O0): -targetlibinfo -verify -tti

  • -O1 पर आधारित है -O0

    • जोड़ता है : -sccp -loop-simpleify -float2int -lazy-value-info -correlated -bagce -lcssa -deadargelim -loop-unroll -loop-वेक्टर -बार -माइमर-लूप-एक्सेस-कैश-ट्रैसर-कैश-ट्रैकर-लोडर -लूप-विलोपन -ब्रांच-प्रोब-थंप-थ्रेडिंग -डोमेट्री -dse -loop-रोटेट -ipsccpp -instcombine -scoped-noalias -licm -prune -pr-eh -loop-unswitch -alignment--ignignment -early-cse -inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -selcallelim -basicaa -indvars -globalopt -block-freq -ममदीप-रेलवे-इनलाइन
  • -ओ 2, -01 पर आधारित है

    • कहते हैं :
    • निकालता है : -always- इनलाइन
  • -O3 पर आधारित है -O2

    • जोड़ता है : -ggpromotion -verif
  • -O समान है -O2

  • -ओज़, ऑन-ओवर्स पर आधारित है

    • निकालता है : -Slp-Vectorizer


के लिए संस्करण 3.6 गुजरता के रूप में GYUNGMIN किम की पोस्ट में दर्ज कर रहे हैं।


साथ संस्करण 3.5 गुजरता पालन (उपरोक्त आदेश के पार्स उत्पादन) कर रहे हैं:

  • डिफ़ॉल्ट (-O0): -targetlibinfo -verify -verify-di

  • -O1 पर आधारित है -O0

    • जोड़ता है : -संबंधित-प्रचार -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memddep -memcpyopt -bar -bar-freify -loop-simpleify -lo-वेक्टर-वेक्टर -ब्रांच-प्रोब-कर्नली-लेस-वैल्यू-इंफॉर्मेशन -लूप-रोटेट -स्ट्रीट-डेड-प्रोटोटाइप -लूप-डिलीटेशन -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -selcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
  • -ओ 2, -01 पर आधारित है

    • जोड़ता है : -ग्वान-कॉन्स्टमरेज -ग्लोड्डस -एसएलपी-वेक्टराइज़र -मल्डस्ट-मोशन-इनलाइन
    • निकालता है : -always- इनलाइन
  • -O3 पर आधारित है -O2

    • जोड़ता है : -ggpromotion
  • -O समान है -O2

  • -ओज़, ऑन-ओवर्स पर आधारित है

    • निकालता है : -Slp-Vectorizer


साथ संस्करण 3.4 गुजरता पालन (उपरोक्त आदेश के पार्स उत्पादन) कर रहे हैं:

  • -ओ0: -टार्गेटलिबिनफो -प्रोवरिफाइ -डोमेट्री -वरिफाई

  • -O1 पर आधारित है -O0

    • कहते हैं : -adce -हमेशा-इनलाइन -basicaa -basiccg -correlated-प्रसार -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline लागत वाली -instcombine -ipsccp -jump-थ्रेडिंग -lazy-मान-जानकारी -lcssa -licm -loop-delete -loop-idiom -loop-रोटेट -loop-सरलीकृत -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -mopdep -no -notti -prune-eh -reassociate -scalar -विल्यूशन -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -ओ 2, -01 पर आधारित है

    • कहते हैं :
    • निकालता है : -always- इनलाइन
  • -O3 पर आधारित है -O2

    • जोड़ता है : -ggpromotion
  • -O समान है -O2

  • -ओज़ पर आधारित है -O2

    • निकालता है : -रियर -लूप-वेक्टराइज़ -slp-वेक्टरलाइज़र


साथ संस्करण 3.2 गुजरता पालन (उपरोक्त आदेश के पार्स उत्पादन) कर रहे हैं:

  • -ओ0: -टार्गेटलिबिनफो -प्रोवरिफाइ -डोमेट्री -वरिफाई

  • -O1 पर आधारित है -O0

    • जोड़ता है : -sroa -early-cse -lower-expect -no-aa -tbaa -basicaa -globalopt -ipsccpp -deadargelim -instcombine -simplifycfg -basiccg -buneiccg -prin -hways-inline -functionattrs-simpla-ma-a -info -jump- थ्रेडिंग-प्रचारित-प्रचार-प्रसार -टेलस्क्रिमल-सामाजिक-लूप-सरलीकरण -ममदीप -ममचेओपॉप -sccp -dse -adce -strip-dead-prototypes
  • -ओ 2, -01 पर आधारित है

    • कहते हैं : -inline -globaldce -constmerge
    • निकालता है : -always- इनलाइन
  • -O3 पर आधारित है -O2

    • जोड़ता है : -ggpromotion
  • -O समान है -O2

  • -ओज़ समान है -O


[मार्च 2014 को संपादित करें ] ने डुप्लिकेट को सूचियों से हटा दिया।

संपादित करें [अप्रैल 2014] ने 3.4 के लिए प्रलेखन लिंक + विकल्प जोड़े

संपादित करें [सितम्बर 2014] 3.5 के लिए विकल्प जोड़े

[दिसम्बर 2015 को संपादित करें ] ने 3.7 के लिए विकल्प जोड़े और 3.6 के मौजूदा उत्तर का उल्लेख किया

संपादित करें [मई २०१६] ५.१ के लिए विकल्प जोड़े, दोनों के लिए विकल्प और क्लैंग और क्लैंग के लिए मौजूदा उत्तर का उल्लेख करें (बनाम ऑप्ट)

[Nov 2018] संपादित करें 6.0 के लिए विकल्प जोड़ें


2
वहाँ XCode5 के साथ जहाजों कि क्लैंग के संस्करण के साथ ऐसा करने का एक तरीका है? मैंने llvm-as कमांड के लिए शिकार करने की कोशिश की है, लेकिन यह मेरी मशीन पर कहीं भी मौजूद नहीं है जिसे मैं देख सकता हूं
Teknogrebo

@ एंटोनी, क्यों कुछ झंडे, जैसे -simplifycfgदोहराया जाता है?
पासचलिस

2
@Paschalis: मुझे यकीन नहीं है, लेकिन चूंकि कुछ अनुकूलन केवल तभी काम करते हैं जब कुछ अन्य पास चलाए गए हों, और उदाहरण के लिए simplifycfgकई पासों की आवश्यकता होती है। और debug-pass=Argumentsशायद समर्पण से पहले होता है। मैंने अपने उत्तर में डुप्लिकेट हटा दिए, आपकी प्रतिक्रिया के लिए धन्यवाद।
एंटोनी

5
कुछ अनुकूलन सामान बनाते हैं जो आगे अनुकूलित (मृत कोड आदि) हो सकते हैं, इसलिए यह कुछ अनुकूलन पासों को फिर से चलाने के लिए समझ में आ सकता है।
cyco130

1
@ZachB / @Antoine क्यों नहीं (भी?) LLVM 7 (या यह है कि आप क्या कहते हैं?) इसके अलावा: 1. 1. मुझे यकीन नहीं है कि कब तक वहाँ रहा है, लेकिन -Ogअब एक ला GCC भी है; 2. क्या पुराने संस्करणों के लिए सभी बारीकियाँ अभी भी आवश्यक हैं? 3. मुझे लगता है कि पिछले कुछ वर्षों में किए गए अच्छे बदलाव और सामुदायिक स्थिति को देखते हुए, मैं अपना उत्तर केवल सामान का उल्लेख करने के लिए नीचे काट रहा हूं clang -cc1 -mllvm -help-list-hidden(जब तक कि आप इसे एकीकृत करना पसंद नहीं करेंगे)।
ज्योफ निक्सन

15

@ एंटोनी का उत्तर (और जुड़ा हुआ अन्य प्रश्न) एलएलवीएम ऑप्टिमाइज़ेशन का सटीक वर्णन करता है जो सक्षम हैं, लेकिन कुछ अन्य क्लैंग-विशिष्ट विकल्प हैं (अर्थात, जो एएसटी को कम करने को प्रभावित करते हैं) जो -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:

हां, अन्य एलएलवीएम टूल्स की आवश्यकता नहीं है। प्रयत्न:

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

इसके अलावा, बहुत अधिक विस्तृत विकल्प हैं जो आप अकेले क्लैंग के साथ जांच / संशोधित कर सकते हैं ... आपको बस यह जानना होगा कि उन्हें कैसे प्राप्त करना है!

कुछ की कोशिश करो:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help


3

एलएलवीएम 3.6- ओ 1

तर्क पास करें:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -darargarim -domtree -instcombine -simplifycfg -basiccune-gune -une -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -selcallelim -simplifycfg -reassociate -ree -ree -lops -loves -लोटेट -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-delete -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -inst -bree -info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loop-simplify -lcssa -branch -branch-prob-freq -calarcalcal विकास -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-सरलीकृत -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-धारणाएँ -strip-dead-prototypes -verify -verify-di

-O2 आधार पर -O1

जोड़ें:

और निकालता है: -always- इनलाइन

-ओ 3 आधारित -O2

जोड़ें: -रजप्रमोशन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.