gpt4 book ai didi

c++ - 为什么 clang/llvm 不对此进行优化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:11 26 4
gpt4 key购买 nike

使用 clang 3.9 编译此代码时:

constexpr bool is_small(long long v) {
return v < 0x4000000000000000;
}
int foo();
int f(int a) {
if (is_small(a)) return a;
else return foo();
}

它生成的程序集等同于 int f(int a) { return a; },因为它确定 is_small(a) 将始终为真,因为 a 是一个 int,这(在我的平台)总是小于 0x4000000000000000

当我将 is_small 更改为:

constexpr bool is_small(long long v) {
return v >= -0x4000000000000000;
}

正如预期的那样,发生了完全相同的情况。

但是,当我更改 is_small 以检查这两个条件时:

constexpr bool is_small(long long v) {
return v < 0x4000000000000000 && v >= -0x4000000000000000;
}

clang 没有优化 ifreturn foo() 部分。

(这是 Godbolt 上的上述片段,可以玩:https://godbolt.org/g/fnoE9A)

为什么会这样?它清楚地得出结论,条件单独总是为真,为什么这不扩展到两者的逻辑合取?

最佳答案

没有充分的理由,这是 LLVM 缺少的优化。备案 https://llvm.org/bugs/show_bug.cgi?id=30794以确保它得到修复。

基本上 LLVM 首先优化 is_small在内联它并优化 f() 中的使用之前。优化时出现的问题is_small它正在转动比较v < 0x4000000000000000 && v >= -0x4000000000000000进入v + 0x4000000000000000 > -1 .内联后,优化器无法以允许不断折叠 f() 中的代码的方式识别这种新形式。

关于c++ - 为什么 clang/llvm 不对此进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203127/

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