Rust Range.contains 未能成为 inlined/optimized

Rust Range.contains failed to be inlined/optimized

我是 运行 通过 Clippy 编写的代码,它建议更改以下内容:

const SPECIAL_VALUE: u8 = 0; // May change eventually.

pub fn version1(value: u8) -> bool {
    (value >= 1 && value <= 9) || value == SPECIAL_VALUE
}

进入

pub fn version2(value: u8) -> bool {
    (1..=9).contains(&value) || value == SPECIAL_VALUE
}

因为它更具可读性。不幸的是,即使使用优化级别 3,生成的汇编输出也是两倍长。手动内联它(向下嵌套 2 层),给出与 version1 几乎相同的代码并且同样高效。

pub fn manually_inlined(value: u8) -> bool {
    (1 <= value && value <= 9) || value == SPECIAL_VALUE
}

如果我删除 || value == SPECIAL_VALUE 它们都以相同的方式解析(尽管添加了 1 条指令以在比较之前递减参数值)。此外,如果我将 SPECIAL_VALUE 更改为与范围不相邻的内容,它们都会解析为与 version2 相同的汇编代码,这就是我保留它 0 的原因,除非我最终必须更改它.

我有一个 link 到 Godbolt,代码在这里:https://rust.godbolt.org/z/bMYzfcYob

为什么编译器无法正确 inline/optimize version2?这是一个“优化错误”吗?或者我误解了 Rust 的一些语义,也许借用的东西阻止了优化,但编译器不能假设由于别名和引用规则没有值突变吗?

尝试在 C++ 中执行相同的建议,在两种情况下都会产生更差的选项 (https://godbolt.org/z/zahfz65W3)

编辑:将我的 C++ 版本的编译器更改为 GCC 使其在两种情况下都得到优化。

这确实是一个错失的优化机会,现在已在 LLVM 中得到纠正。 https://github.com/rust-lang/rust/issues/90609#issuecomment-1046037263.