When used on a parameter of an inline function __builtin_constant_p() always returns 0, even when the parameters is a constant literal. This differs from gcc and leads to sub-optimal code.
This has been brought up as a problem on the kernel mailing list: https://lkml.org/lkml/2018/4/4/777
Example:
#include <stdio.h>
static int is_const(int val) {
return __builtin_constant_p(val);
}
int main(int argc, char *argv[])
{
const int var = 456;
printf("literal: %d\n", __builtin_constant_p(123));
printf("const var: %d\n", __builtin_constant_p(var));
printf("literal+inline: %d\n", is_const(123));
printf("const var+inline: %d\n", is_const(var));
return 0;
}
gcc (with -O2):
literal: 1
const var: 1
literal+inline: 1
const var+inline: 1
clang (with -O2):
literal: 1
const var: 1
literal+inline: 0
const var+inline: 0
Comment 1 by manojgupta@chromium.org
, Apr 4 2018