为什么 g++ -O3 不优化这个简单的按位运算

mih*_*g93 6 c++ optimization gcc bit-manipulation x86-64

我有一个简单的函数,它是从许多最内部的循环中调用的。

uint16_t getBit(uint16_t val, uint16_t n)
{
    return (val & (1 << n)) >> n;
}
Run Code Online (Sandbox Code Playgroud)

此版本的程序平均执行时间为 3.1 秒。

然后我想像这样重写该函数:

uint16_t getBit(uint16_t val, uint16_t n)
{
    return (val >> n) & 1;
}
Run Code Online (Sandbox Code Playgroud)

该程序的第二个版本平均需要 2.9 秒来执行。

为什么 GCC 不将其优化为与 -O3 相同的东西?

编译器浏览器链接:https ://godbolt.org/z/s6fTfo4Ee