2012-10-31 11 views
13

में -O0 और -O1 के बीच मतभेद कुछ कोड संकलित करते समय मैंने -O0 और -O1 के बीच बनाए गए असेंबलर में बड़े अंतर को देखा। मैं ऑप्टिमाइज़ेशन को सक्षम/अक्षम करने के माध्यम से दौड़ना चाहता था जब तक कि मुझे पता चला कि असेंबलर में कोई निश्चित परिवर्तन क्यों हो रहा था।जीसीसी

यदि मैं O0 की तुलना में ठीक से कौन सा झंडे ओ 1 सक्षम कर रहा है, तो यह पता लगाने के लिए -फवरबोज-एएसएम का उपयोग करता है, और फिर उन्हें मैन्युअल रूप से अक्षम कर देता है, असेंबलर अभी भी इतनी व्यापक रूप से अलग क्यों होता है? यहां तक ​​कि यदि मैं ओ 0 के साथ जीसीसी चलाता हूं और मैन्युअल रूप से सभी झंडे जोड़ता हूं जो fverbose-asm कहा जाता है ओ 1 के साथ सक्षम किया गया था, तो मुझे वही असेंबलर नहीं मिलता है जो मुझे ओ 1 का उपयोग करके प्राप्त होता।

क्या '-f ...' और '-m ...' से अलग कुछ भी बदला जा सकता है?

या यह है कि 'ओ 1' में 'ओ 0' की तुलना में कुछ जादू है जिसे बंद नहीं किया जा सकता है।


crypticness के लिए खेद है - इस Reducing stack usage during recursion with GCC + ARM से संबंधित था लेकिन यह का उल्लेख प्रश्न थोड़ा कठिन समझने के लिए बना रही थी।

+0

तो समस्या यह है कि आप "हमलावर अनुकूलन" कि ढेर उपयोग बढ़ जाती है के नाम (या हत्यारा संयोजन) पता नहीं है, और आप * भी * नहीं है आपको '-ओएस' से ऑप्टिमाइज़ेशन के नाम पता हैं जिन्हें आपको चाहिए? जहां "नाम नहीं पता" में संभावना है कि उनके पास नाम नहीं हैं, वे 'ओ 1' या 'ओएस' द्वारा सक्षम विविध अतिरिक्त अनुकूलन हैं जिन्हें व्यक्तिगत रूप से नियंत्रित नहीं किया जा सकता है। –

+0

हां - मूल रूप से मैं उन सभी झंडे को जानता हूं जो जीसीसी कहते हैं कि यह सक्षम है (के माध्यम से -फवरबोज-एएसएम)। हालांकि उन्हें मैन्युअल रूप से अक्षम करने से समस्या ठीक नहीं होती है, इसलिए यह कुछ 'जादू' होना चाहिए जिसे मैं नियंत्रित करने में असमर्थ हूं। हालांकि मैंने अभी खोजा है (लिंक किए गए प्रश्न देखें) कि समस्या अभी भी एक अलग तरीके से O0 के साथ मौजूद है। यह जानना अभी भी अच्छा होगा कि इस सवाल का जवाब है या नहीं - क्योंकि यह डरावना है कि अनुकूलन को नियंत्रित करने में सक्षम नहीं है। –

+0

क्या आपने जीसीसी की 'विशेषता (()) का उपयोग करने की कोशिश की थी या किसी अन्य तरीके से फ़ंक्शन को फिर से लिखना था (ई जी। बनाये गये चर स्थिर हैं या मैन्युअल रूप से अपनी जगह आवंटित करते हैं)? आखिरी मौका समाधान समस्याग्रस्त फ़ंक्शन असेंबली में फिर से लिखा जा सकता है। – Vovanium

उत्तर

3

ऐसा नहीं है कि इस मदद करता है, -O1 जादू के बारे में अपने शक है कि बंद नहीं किया जा सकता है के लिए कुछ सबूत दिखाने के अलावा:

  • से http://gcc.gnu.org/ml/gcc-help/2007-11/msg00214.html:

    चेतावनी, नहीं सभी अनुकूलन सक्षम by -O1 में उन्हें अक्षम करने के लिए कमांड-लाइन टॉगल ध्वज है।

  • हेगन की "जीसीसी, 2 एड करने के लिए निश्चित गाइड" से:

    नोट: जीसीसी के अनुकूलन के सभी एक ध्वज का उपयोग कर नियंत्रित किया जा सकता। जीसीसी, स्वचालित रूप से कुछ अनुकूलन करता है और, स्रोत कोड को संशोधित से कम आप -O

दुर्भाग्य का उपयोग कर अनुकूलन का अनुरोध जब आप इन अनुकूलन अक्षम नहीं कर सकता, मैं के बारे में क्या इन कड़ी मेहनत से कोई स्पष्ट बयान नहीं मिला है कोडित अनुकूलन हो सकता है। उम्मीद है कि जीसीसी के आंतरिक के बारे में जानकार कोई भी व्यक्ति इसके बारे में कुछ जानकारी के साथ उत्तर पोस्ट कर सकता है।

5

सब आप चाहते हैं जो गुजरता O1 जो O0 में सक्षम नहीं हैं आप की तरह कुछ चला सकते हैं पर लागू किए गए हैं देखने के लिए है:,

gcc -O0 test.c -fdump-tree-all -da 
ls > O0 
rm -f test.c.* 
gcc -O1 test.c -fdump-tree-all -da 
ls > O1 
diff O0 O1 

इसी तरह की प्रक्रिया झंडे जो आप की खोज की सेट का उपयोग, होगा आप देखते हैं कि जीसीसी द्वारा ओ 1 में किए गए अतिरिक्त जादू पास को नियंत्रित नहीं किया जाता है।

संपादित करें:

एक कम गंदा तरीका -fdump-पास के उत्पादन में है, जो सूची जाएगा जो गुजरता stderr या बंद करने का तुलना करने के लिए हो सकता है।

तो जैसे कुछ:

gcc -O0 test.c -fdump-passes |& grep ON > O0 
gcc -O1 test.c -fdump-passes |& grep ON > O1 
diff O0 O1