[Bug middle-end/32729] Loop unrolling not performed with large constant loop bound

scovich at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Jul 11 16:36:00 GMT 2007



------- Comment #1 from scovich at gmail dot com  2007-07-11 16:36 -------
(In reply to comment #0)
> // g++ -mtune=core2 -O3 -S -dp
Oops... that doesn't actually unroll loop() all, though it still peels
loop_few().

Adding -funroll-loops (supposedly enabled by -O3?) unrolls loop()
Adding -funroll-all-loops does nothing

Nested loops also have issues:

void nested_loop(int* dest, int* src) {
  for(int i=0; i < 2; i++)
    for(int j=0; j < 2; j++)
      dest[4*i+j] = src[4*j+i];
}

becomes

_Z11nested_loopPiS_:
.LFB533:
        xorl    %edx, %edx      # 39    *movdi_xor_rex64        [length = 2]
.L47:
        movl    (%rsi), %ecx    # 13    *movsi_1/1      [length = 2]
        movl    %ecx, (%rdi,%rdx,4)     # 14    *movsi_1/2      [length = 3]
        movl    16(%rsi), %eax  # 15    *movsi_1/1      [length = 3]
        addq    $4, %rsi        # 17    *adddi_1_rex64/1        [length = 4]
        movl    %eax, 4(%rdi,%rdx,4)    # 16    *movsi_1/2      [length = 4]
        addq    $4, %rdx        # 18    *adddi_1_rex64/1        [length = 4]
        cmpq    $8, %rdx        # 20    cmpdi_1_insn_rex64/1    [length = 4]
        jne     .L47    # 21    *jcc_1  [length = 2]
        rep ; ret       # 40    return_internal_long    [length = 1]            


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32729



More information about the Gcc-bugs mailing list