提示可能变量的 C 编译器(GCC 或 Clang)value/range

Hint the C compiler (GCC or Clang) of possible variable value/range

在下面的代码中,只会进行一次比较,因为编译器知道条件是互斥的,我们将始终输入第二个条件,因为 bar 是必需的 > 32:

int foo(int bar) {
    if (bar <= 64)
        return 1;
    if (bar > 32) {
        printf("Too many elements");
    }
    return 0;
}

现在,假设我知道 bar 总是高于 64。因为系统的输入、配置或其他原因。我怎样才能提示编译器根本不进行比较,就像编译 if (bar <= 64) return 一样,除了它实际上没有保留在最终的 ASM 中。

类似于:

int foo(int bar) {
    @precond(bar > 64);
    if (bar > 32) {
        printf("Too many elements");
    }
    return 0;
}

我唯一的解决方案是编写一个 LLVM pass 吗?

您可以在 GCC 中使用 __builtin_unreachable

if (bar > 32) {
  __builtin_unreachable();
}

__builtin_assume 在 Clang 中:

__builtin_assume(bar <= 32);
MSVC 中的

__assume

__assume(bar <= 32);