Hi, Continuing from this thread, https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575920.html The proposal is to provide a mechanism to mark a parameter in a function as a literal constant.
Motivation: Consider the following intrinsic vshl_n_s32 from arrm/arm_neon.h: __extension__ extern __inline int32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vshl_n_s32 (int32x2_t __a, const int __b) { return (int32x2_t)__builtin_neon_vshl_nv2si (__a, __b); } and it's caller: int32x2_t f (int32x2_t x) { return vshl_n_s32 (x, 1); } The constraint here is that, vshl_n<type> intrinsics require that the second arg (__b), should be an immediate value. Currently, this check is performed by arm_expand_builtin_args, and if a non-constant value gets passed, it emits the following diagnostic: ../armhf-build/gcc/include/arm_neon.h:4904:10: error: argument 2 must be a constant immediate 4904 | return (int32x2_t)__builtin_neon_vshl_nv2si (__a, __b); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ However, we're trying to replace builtin calls with gcc's C vector extensions where possible (PR66791), because the builtins are opaque to the optimizers. Unfortunately, we lose type checking of immediate value if we replace the builtin with << operator: __extension__ extern __inline int32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) vshl_n_s32 (int32x2_t __a, const int __b) { return __a << __b; } So, I was wondering if we should have an attribute for a parameter to specifically mark it as a constant value with optional range value info ? As Richard suggested, sth like: void foo(int x __attribute__((literal_constant (min_val, max_val))); Thanks, Prathamesh