> Am 06.07.2025 um 23:23 schrieb Andrew Pinski <quic_apin...@quicinc.com>:
> 
> These builtins requires a constant integer for the third argument but 
> currently
> there is assert rather than error. This fixes that and updates the 
> documentation too.
> Uses the same terms as was being used for the __builtin_prefetch arguments.
> 
> Bootstrapped and tested on x86_64-linux-gnu.

Ok

Richard 

>    PR middle-end/120709
> 
> gcc/ChangeLog:
> 
>    * builtins.cc (expand_builtin_crc_table_based): Error out
>    instead of asserting the 3rd argument is an integer constant.
>    * internal-fn.cc (expand_crc_optab_fn): Likewise.
>    * doc/extend.texi (crc): Document requirement of the poly argument
>    being a constant.
> 
> gcc/testsuite/ChangeLog:
> 
>    * gcc.dg/crc-non-cst-poly-1.c: New test.
> 
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
> gcc/builtins.cc                           | 12 +++++++++---
> gcc/doc/extend.texi                       |  4 ++--
> gcc/internal-fn.cc                        | 11 ++++++++---
> gcc/testsuite/gcc.dg/crc-non-cst-poly-1.c | 11 +++++++++++
> 4 files changed, 30 insertions(+), 8 deletions(-)
> create mode 100644 gcc/testsuite/gcc.dg/crc-non-cst-poly-1.c
> 
> diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> index a2ce3726810..7f580a3145f 100644
> --- a/gcc/builtins.cc
> +++ b/gcc/builtins.cc
> @@ -7799,11 +7799,17 @@ expand_builtin_crc_table_based (internal_fn fn, 
> scalar_mode crc_mode,
> 
>   rtx op1 = expand_normal (rhs1);
>   rtx op2 = expand_normal (rhs2);
> -  gcc_assert (TREE_CODE (rhs3) == INTEGER_CST);
> -  rtx op3 = gen_int_mode (TREE_INT_CST_LOW (rhs3), crc_mode);
> +  rtx op3;
> +  if (TREE_CODE (rhs3) != INTEGER_CST)
> +    {
> +      error ("third argument to %<crc%> builtins must be a constant");
> +      op3 = const0_rtx;
> +    }
> +  else
> +    op3 = convert_to_mode (crc_mode, expand_normal (rhs3), 0);
> 
>   if (CONST_INT_P (op2))
> -    op2 = gen_int_mode (INTVAL (op2), crc_mode);
> +    op2 = convert_to_mode (crc_mode, op2, 0);
> 
>   if (fn == IFN_CRC)
>     expand_crc_table_based (target, op1, op2, op3, data_mode);
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 70adf2dab0a..a119ad31ea2 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -15553,7 +15553,7 @@ are 128-bit.  Only supported on targets when 128-bit 
> types are supported.
> Returns the calculated 8-bit bit-reversed CRC using the initial CRC (8-bit),
> data (8-bit) and the polynomial (8-bit).
> @var{crc} is the initial CRC, @var{data} is the data and
> -@var{poly} is the polynomial without leading 1.
> +@var{poly} is the polynomial without leading 1. @var{poly} is required to be 
> a compile-time constant.
> Table-based or clmul-based CRC may be used for the
> calculation, depending on the target architecture.
> @enddefbuiltin
> @@ -15608,7 +15608,7 @@ is 32-bit.
> Returns the calculated 8-bit bit-forward CRC using the initial CRC (8-bit),
> data (8-bit) and the polynomial (8-bit).
> @var{crc} is the initial CRC, @var{data} is the data and
> -@var{poly} is the polynomial without leading 1.
> +@var{poly} is the polynomial without leading 1. @var{poly} is required to be 
> a compile-time constant.
> Table-based or clmul-based CRC may be used for the
> calculation, depending on the target architecture.
> @enddefbuiltin
> diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc
> index 3f4ac937367..39048d77d23 100644
> --- a/gcc/internal-fn.cc
> +++ b/gcc/internal-fn.cc
> @@ -4031,9 +4031,14 @@ expand_crc_optab_fn (internal_fn fn, gcall *stmt, 
> convert_optab optab)
>   rtx dest = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
>   rtx crc = expand_normal (rhs1);
>   rtx data = expand_normal (rhs2);
> -  gcc_assert (TREE_CODE (rhs3) == INTEGER_CST);
> -  rtx polynomial = gen_rtx_CONST_INT (TYPE_MODE (result_type),
> -                      TREE_INT_CST_LOW (rhs3));
> +  rtx polynomial;
> +  if (TREE_CODE (rhs3) != INTEGER_CST)
> +    {
> +      error ("third argument to %<crc%> builtins must be a constant");
> +      polynomial = const0_rtx;
> +    }
> +  else
> +    polynomial = convert_to_mode (TYPE_MODE (result_type), expand_normal 
> (rhs3), 0);
> 
>   /* Use target specific expansion if it exists.
>      Otherwise, generate table-based CRC.  */
> diff --git a/gcc/testsuite/gcc.dg/crc-non-cst-poly-1.c 
> b/gcc/testsuite/gcc.dg/crc-non-cst-poly-1.c
> new file mode 100644
> index 00000000000..0c3d9054017
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/crc-non-cst-poly-1.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +/* PR middle-end/120709 */
> +/* Make sure we don't ICE on a non-constant poly argument. */
> +
> +
> +typedef unsigned char uint8_t;
> +uint8_t crc8_data8(uint8_t crc, uint8_t data, uint8_t polynomial) {
> +  return __builtin_rev_crc32_data8 (crc, data, polynomial); /* { dg-error 
> "must be a constant" } */
> +}
> --
> 2.43.0
> 

Reply via email to