循环展开GCC

时间:2014-09-20 13:27:12

标签: c gcc assembly loop-unrolling

我试图了解如何在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标志后它也不会展开循环?是否有可能编译器没有优化,因为它认为在这种情况下展开是没有用的?如果这是真的,那么我应该怎么做才能使编译器展开循环?。

0 个答案:

没有答案