我试图了解如何在GCC中进行展开。我编写了一个C代码来添加数组元素来实现这一目的。
for (i=0;i<16384;i++)
c[i] = a[i]+b[i];
我用-o2标志和-funroll-all-loops编译它。
gcc -o2 -funroll-all-loops --save-temps pleaseUnrollTheLoops.c
上述程序的目标文件具有以下汇编代码。
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $196504, %rsp
movl $0, -196612(%rbp)
jmp .L2
.L3:
movl -196612(%rbp), %eax
cltq
movl -196608(%rbp,%rax,4), %edx
movl -196612(%rbp), %eax
cltq
movl -131072(%rbp,%rax,4), %eax
addl %eax, %edx
movl -196612(%rbp), %eax
cltq
movl %edx, -65536(%rbp,%rax,4)
addl $1, -196612(%rbp)
.L2:
cmpl $16383, -196612(%rbp)
jle .L3
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
在每次迭代中,只进行一次加法(L3部分中的第7行)并将rbp寄存器的内容递增1(如L3部分的最后一行)。这表明编译器没有展开循环。我期待在一个循环中发生更多的添加。我的问题是,为什么即使在使用funroll标志后它也不会展开循环?是否有可能编译器没有优化,因为它认为在这种情况下展开是没有用的?如果这是真的,那么我应该怎么做才能使编译器展开循环?。