提示可能变量的 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);
在下面的代码中,只会进行一次比较,因为编译器知道条件是互斥的,我们将始终输入第二个条件,因为 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);