首页 > 解决方案 > 为什么 clang++ 和 g++ 不对这些指令进行重复数据删除?

问题描述

考虑以下函数:

std::string get_value(const bool b)
{
    if (b) {
        return "Hello";
    }
    else {
        return "World";
    }
}

g++ 11.0.1 20210312 将此(作为 C++17 并具有最大优化)编译为:

get_value[abi:cxx11](bool):
        lea     rdx, [rdi+16]
        mov     rax, rdi
        mov     QWORD PTR [rdi], rdx
        test    sil, sil
        je      .L2
        mov     DWORD PTR [rdi+16], 1819043144
        mov     BYTE PTR [rdx+4], 111
        mov     QWORD PTR [rax+8], 5
        mov     BYTE PTR [rax+21], 0
        ret
.L2:
        mov     DWORD PTR [rdi+16], 1819438935
        mov     BYTE PTR [rdx+4], 100
        mov     QWORD PTR [rax+8], 5
        mov     BYTE PTR [rax+21], 0
        ret

为什么它不会mov在跳转之前甚至在 之前将两条复制的指令向上移动test,从而将代码大小减少两条指令?

clang++ 和 libc++ 也会发生同样的事情,除了它只有一条相关指令可以向上移动。

(另请参见GodBolt

标签: c++g++compiler-optimizationclang++redundancy

解决方案


推荐阅读