小编Sle*_*lei的帖子

当 x 的范围有限时,为什么 x/10 会通过不必要的偏移进行优化?

我有这个功能

long long int divideBy10(long long int a){
    return a / 10;
}
Run Code Online (Sandbox Code Playgroud)

它被编译为:

        mov     rax, rdi
        movabs  rcx, 7378697629483820647
        imul    rcx
        mov     rax, rdx
        shr     rax, 63
        sar     rdx, 2
        add     rax, rdx
        ret
Run Code Online (Sandbox Code Playgroud)

如果我添加 __builtin_assume(a > 0);

它被编译为

        mov     rax, rdi
        movabs  rcx, -3689348814741910323
        mul     rcx
        mov     rax, rdx
        shr     rax, 3
        ret
Run Code Online (Sandbox Code Playgroud)

代码效率更高,因为它不必担心负号。现在,如果我添加 __builtin_assume(a < 10000); 我原以为它会被编译成一个乘法而没有移位。但事实并非如此。

我想也许编译器只跟踪数字是正数还是负数,但是

long long int noBranch(long long int a){
    __builtin_assume(a < 400);
    if( a < 500){
        return a;
    }
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction assembly compiler-optimization

9
推荐指数
0
解决办法
206
查看次数