gpt4 book ai didi

c - gcc 如何将 sum 从 1 到 100 优化为 5050

转载 作者:行者123 更新时间:2023-12-04 13:29:31 25 4
gpt4 key购买 nike

我用 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, %esigcc 是如何做这种优化的?
这种优化的学术名称是什么?

最佳答案

我试图找到特定的标志,但没有运气。我只能用 -O1 重现您的结果所以我之后所做的是手动添加所有由 -O1 启用的标志.但是当我这样做时,我无法重现结果。
并且可以在 documentation 中阅读

Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed in this section.


所以我认为这是由 -O1 完成的添加没有标志的。
这是我尝试过的:
$ gcc -fauto-inc-dec  -fbranch-count-reg  -fcombine-stack-adjustments \
-fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse \
-fforward-propagate -fguess-branch-probability -fif-conversion \
-fif-conversion2 -finline-functions-called-once -fipa-profile \
-fipa-pure-const -fipa-reference -fipa-reference-addressable \
-fmerge-constants -fmove-loop-invariants -fomit-frame-pointer \
-freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types \
-fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch \
-ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts \
-ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta \
-ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter \
-funit-at-a-time -S k.c
cc1: warning: this target machine does not have delayed branches
$ grep "5050" k.s
$ gcc -O1 -S k.c
$ grep "5050" k.s
movl $5050, %esi
$

关于c - gcc 如何将 sum 从 1 到 100 优化为 5050,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65896918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com