Как GCC оптимизирует неиспользуемую переменную, увеличивающуюся внутри цикла?

Я написал эту простую программу на C:

int main() {
    int i;
    int count = 0;
    for(i = 0; i < 2000000000; i++){
        count = count + 1;
    }
}

Я хотел увидеть, как компилятор gcc оптимизирует этот цикл (ясно, что нужно добавить 1 2000000000 раз. быть «добавить 2000000000 один раз»). Итак:

gcc test.c , а затем time на a.out дает:

real 0m7.717s  
user 0m7.710s  
sys 0m0.000s  

$ gcc -O2 test.c , а затем ] time on a.out` дает:

real 0m0.003s  
user 0m0.000s  
sys 0m0.000s  

Затем я разобрал оба с помощью gcc -S . Первый вариант кажется вполне ясным:

    .file "test.c"  
    .text  
.globl main
    .type   main, @function  
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    $0, -8(%rbp)
    movl    $0, -4(%rbp)
    jmp .L2
.L3:
    addl    $1, -8(%rbp)
    addl    $1, -4(%rbp)
.L2:
    cmpl    $1999999999, -4(%rbp)
    jle .L3
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
    .section    .note.GNU-stack,"",@progbits

L3 добавляет, L2 сравнивает -4 (% rbp) с 1999999999 и переходит к L3, если i <2000000000 .

Теперь оптимизированный:

    .file "test.c"  
    .text
    .p2align 4,,15
.globl main
    .type main, @function
main:
.LFB0:
    .cfi_startproc
    rep
    ret
    .cfi_endproc
.LFE0:
    .size main, .-main
    .ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
    .section .note.GNU-stack,"",@progbits

Я вообще не понимаю, что там творится! У меня мало знаний о сборке, но я ожидал чего-то вроде

addl $2000000000, -8(%rbp)

. Я даже попробовал с помощью gcc -c -g -Wa, -a, -ad -O2 test.c , чтобы увидеть код C. вместе со сборкой он был преобразован в, но результат был не более понятен, чем предыдущий.

Кто-нибудь может вкратце объяснить:

  1. Вывод gcc -S -O2 .
  2. Если цикл оптимизирован так, как я ожидал (одна сумма вместо множества сумм)?
64
задан Ciro Santilli 新疆改造中心法轮功六四事件 26 June 2015 в 06:49
поделиться