है आंशिक रूप से पाश unrolling, यह पाश दस बार unrolls और फिर एक सशर्त कूद करताजीसीसी 5.1 लूप unrolling
-x c -std=c99 -O3 -funroll-all-loops --param max-completely-peeled-insns=1000 --param max-completely-peel-times=10000
साथ जीसीसी 5.1 या बाद का उपयोग को देखते हुए निम्नलिखित कोड
#include <stdio.h>
int main(int argc, char **argv)
{
int k = 0;
for(k = 0; k < 20; ++k)
{
printf("%d\n", k) ;
}
}
। इस तरह के 4.9.2 के रूप में जीसीसी के
.LC0:
.string "%d\n"
main:
pushq %rbx
xorl %ebx, %ebx
.L2:
movl %ebx, %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 1(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 2(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 3(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 4(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 5(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 6(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 7(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 8(%rbx), %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
leal 9(%rbx), %esi
xorl %eax, %eax
movl $.LC0, %edi
addl $10, %ebx
call printf
cmpl $20, %ebx
jne .L2
xorl %eax, %eax
popq %rbx
ret
लेकिन का उपयोग कर पुराने संस्करणों assemlby
.LC0:
.string "%d\n"
main:
subq $8, %rsp
xorl %edx, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $1, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $2, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $3, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $4, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $5, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $6, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $7, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $8, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $9, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $10, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $11, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $12, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $13, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $14, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $15, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $16, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $17, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $18, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
movl $19, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
call __printf_chk
xorl %eax, %eax
addq $8, %rsp
ret
वांछित बनाता है वहाँ यह वही उत्पादन का उत्पादन करने के लिए जीसीसी के बाद के संस्करणों के लिए मजबूर करने के लिए एक तरीका है?
https://godbolt.org/g/D1AR6i का उपयोग करते हुए विधानसभा का उत्पादन करने के
संपादित करें: कोई डुप्लिकेट किए गए सवाल के बाद से समस्या को पूरी तरह से जीसीसी के बाद के संस्करणों के साथ छोरों उतारना करने के लिए अभी तक हल नहीं किया गया है। पासिंग --param max-completely-peeled-insns=1000 --param max-completely-peel-times=10000
पर नहीं असर पड़ता है उत्पन्न विधानसभा का उपयोग कर जीसीसी> = 5.1
दिलचस्प बात यह है कि यदि आप शर्त के लिए बदलते हैं, उदाहरण के लिए, 'के <9' अनलोल बिल्कुल नहीं किया जाता है ... – LPs
@LPS बहुत छोटे पुनरावृत्ति को छोड़कर 2 या 3 – Garf365
@ एलपी का उपयोग कर जीसीसी 4.9.2 अनोलिंग भी 9 से कम पुनरावृत्तियों के लिए काम करता है https://godbolt.org/g/ZPlCP6 – surrz