2013-02-19 23 views
8

हैकर जिज्ञासा से, मुझे आश्चर्य है कि gcc इस स्मार्टफ़ोन के नीचे दिए गए फ़ंक्शन को अनुकूलित करने का प्रबंधन कैसे कर सकता है?जीसीसी अनुकूलन का स्पष्टीकरण

int c() { 
     int i, j = 0; 
     for (i = 0; i < 10; i++) { 
       j += i; 
     } 
     return j; 
} 

$objdump -D c.o नीचे हाथ के लिए है लेकिन x86 तर्क में कोई अलग नहीं है।

00000000 <c>: 
    0: 202d  movs r0, #45 ; 0x2d 
    2: 4770  bx lr 

मुझे ज्यादातर आश्चर्य है कि यह अनुकूलन की श्रृंखला या टेम्पलेट मैच की तरह कुछ है? क्या ऐसे अनुकूलन पर कोई दस्तावेज है?

+0

ग के साथ retaging अधिक लोगों atract होगा ... – qPCR4vir

उत्तर

10

अनुकूलक चरण/पास में करता है ... जब आप निर्दिष्ट करते हैं- ओ 2 सक्षम कई अनुकूलन हैं। प्रिंसिपल अनुकूलन नहीं है जो यहां सामने आते हैं

  1. loop unrolling
  2. constant propagation
  3. constant folding
  4. dead-code elimination

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

तो यह कोड

int i, j = 0; 
for (i = 0; i < 10; i++) { 
    j += i; 
} 
return j; 

पाश unrolling के बाद लगातार प्रचार पास

int i, j = 0; 
i=0; j += 0; 
i=1; j += 1; 
i=2; j += 2; 
i=3; j += 3; 
i=4; j += 4; 
i=5; j += 5; 
i=6; j += 6; 
i=7; j += 7; 
i=8; j += 8; 
i=9; j += 9; 
return j; 

मृत-कोड उन्मूलन के बाद के बाद हो जाता है

int i, j = 0; 
i=0; j += i; 
i=1; j += i; 
i=2; j += i; 
i=3; j += i; 
i=4; j += i; 
i=5; j += i; 
i=6; j += i; 
i=7; j += i; 
i=8; j += i; 
i=9; j += i; 
return j; 

j = 0; 
j += 0; 
j += 1; 
j += 2; 
j += 3; 
j += 4; 
j += 5; 
j += 6; 
j += 7; 
j += 8; 
j += 9; 
return j; 

के बाद constant folding

j = 45; 
return j; 

और अंत में,

return 45; 
+2

बस भयानक ... – NeonGlow

+0

एक पुराने जवाब पर नीचे वोट के लिए क्षमा करें, लेकिन इस का सही चित्रण नहीं है जीसीसी में परिवर्तन करता है (हालांकि यह काम करता है, और यह एक समझदार अनुमान और विभिन्न संकलक अनुकूलन का साफ प्रदर्शन है)। यदि आप इस टेस्टकेस के लिए जीसीसी के आंतरिक काम को देखना चाहते हैं, तो आप -फडम्प-पेड़-कूनोल-सब पास कर सकते हैं और आउटपुट पढ़ सकते हैं। मेरा मुख्य आपत्ति यह है कि इनमें से अधिकतर विश्लेषण intertwined हैं, जीसीसी केवल अनलॉक करने का फैसला करता है क्योंकि यह जानता है कि यह प्रेरण चर को दूर कर सकता है और cunroll folding/प्रचार करता है तो खत्म करने के लिए कभी भी कोई मृत कोड नहीं है। –

संबंधित मुद्दे