【发布时间】:2021-04-29 23:24:50
【问题描述】:
我用gcc -O3 -S a.c编译了以下c程序:
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
printf("%d", sum);
}
生成的汇编代码如下:
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 15 sdk_version 10, 15, 4
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
leaq L_.str(%rip), %rdi
movl $5050, %esi ## imm = 0x13BA
xorl %eax, %eax
callq _printf
xorl %eax, %eax
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "%d"
.subsections_via_symbols
好像 GCC 运行代码并注意到循环时间已确定并且 GCC 替换了 整体计算,结果为 5050。
movl $5050, %esi
gcc 是如何做这种优化的呢? 这种优化的学术名称是什么?
【问题讨论】:
-
它可能是以一种复杂的方式“不断折叠”。
-
持续传播?
-
似乎是专门针对算术级数的第一和第二次方之和的优化。例如
sum += 3*i*i + 2*i + 1;得到优化,但添加第三次幂i*i*i运行实际循环。
标签: c gcc compiler-optimization