为什么小于表达式转换为小于或等于gcc中的表达式

nee*_*eel 6 c optimization gcc gimple

我正在进行代码优化并通过gcc内部.我在我的程序中写了一个简单的表达式,然后检查了该表达式的gimple表示,我被卡住了为什么gcc已经这样做了.说我有一个表达式:

if(i < 9)
Run Code Online (Sandbox Code Playgroud)

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

if(i <= 8)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么gcc这样做.它是某种优化,如果是,那么任何人都可以告诉我它如何优化我们的程序?

wil*_*ser 4

标准化有助于检测 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;
}
Run Code Online (Sandbox Code Playgroud)

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
         ...
Run Code Online (Sandbox Code Playgroud)

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