为什么不clang / llvm优化呢?

当使用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; } 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;
}

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

(以上是关于Godbolt的片段,可以参考:https://godbolt.org/g/fnoE9A)

为什么会发生? 它清楚地总结出,单独的条件总是如此,为什么这不能扩展到两者的逻辑结合呢?


没有什么好的理由,这是LLVM缺少的优化。 提交https://llvm.org/bugs/show_bug.cgi?id=30794以确保它得到修复。

基本上,LLVM is_small联它之前首先优化is_small ,并优化f()中的使用。 当优化is_small ,将比较v < 0x4000000000000000 && v >= -0x4000000000000000转换为v + 0x4000000000000000 > -1 。 内联后,优化器无法识别这种新形式,从而可以不断折叠f()中的代码。

链接地址: http://www.djcxy.com/p/85637.html

上一篇: Why doesn't clang/llvm optimize this?

下一篇: Which LLVM passes are responsible for floating