gpt4 book ai didi

c - 为什么小于表达式在 gcc 中转换为小于或等于表达式

转载 作者:太空狗 更新时间:2023-10-29 17:24:28 24 4
gpt4 key购买 nike

我正在研究代码优化并研究 gcc 内部结构。我在我的程序中写了一个简单的表达式,我检查了该表达式的 gimple 表示,我被卡住为什么 gcc 这样做了。假设我有一个表达式:

if(i < 9)

然后在 gimple 表示中它将被转换为

if(i <= 8)

我不知道为什么 gcc 这样做。它是某种优化吗?如果是,那么谁能告诉我它如何优化我们的程序?

最佳答案

规范化有助于检测 CommonSubExpressions,例如:

#include <stdio.h>

int main(void)
{
unsigned u, pos;
char buff[40];

for (u=pos=0; u < 10; u++) {
buff[pos++] = (u <5) ? 'A' + u : 'a' + u;
buff[pos++] = (u <=4) ? '0' + u : 'A' + u;
}
buff[pos++] = 0;
printf("=%s=\n", buff);
return 0;
}

GCC -O1 会将其编译成:

         ...
movl $1, %edx
movl $65, %ecx
.L4:
cmpl $4, %eax
ja .L2
movb %cl, (%rsi)
leal 48(%rax), %r8d
jmp .L3
.L2:
leal 97(%rax), %edi
movb %dil, (%rsi)
movl %ecx, %r8d
.L3:
mov %edx, %edi
movb %r8b, (%rsp,%rdi)
addl $1, %eax
addl $1, %ecx
addl $2, %edx
addq $2, %rsi
cmpl $10, %eax
jne .L4
movb $0, 20(%rsp)
movq %rsp, %rdx
movl $.LC0, %esi
movl $1, %edi
movl $0, %eax
call __printf_chk
...

GCC -O2 实际上会删除整个循环并用赋值流替换它。

关于c - 为什么小于表达式在 gcc 中转换为小于或等于表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433073/

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