On Fri, 1 Dec 2023, Jakub Jelinek wrote:

> Hi!
> 
> handle_operand_addr for INTEGER_CSTs uses wi::min_precision (UNSIGNED
> for non-negative constants, SIGNED for negative ones) and from that
> computes mp as minimum number of limbs which can represent that value,
> and in some cases creates a test BITINT_TYPE with that precision to
> categorize it and decide based on that what types to use on the constant
> emitted into memory.  For the actual precisions (what will be passed
> to libgcc) it actually already uses MAX/MIN to adjust the corner cases:
>           *prec = MAX (min_prec, 1);
> ...
>           *prec = MIN ((int) -min_prec, -2);
> but for integer_zerop min_prec will be 0,
> mp = CEIL (min_prec, limb_prec) * limb_prec;
> will be also 0 and we ICE trying to build unsigned BITINT_TYPE with
> 0 precision.
> 
> Fixed thusly by noting even 0 has to be encoded at least as one limb.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2023-12-01  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/112771
>       * gimple-lower-bitint.cc (bitint_large_huge::handle_operand_addr):
>       Use mp = limb_prec if it is zero.
> 
>       * gcc.dg/bitint-44.c: New test.
> 
> --- gcc/gimple-lower-bitint.cc.jj     2023-11-30 17:24:59.828026693 +0100
> +++ gcc/gimple-lower-bitint.cc        2023-11-30 17:42:07.172487347 +0100
> @@ -2179,6 +2179,8 @@ bitint_large_huge::handle_operand_addr (
>         *prec = MIN ((int) -min_prec, -2);
>       }
>        mp = CEIL (min_prec, limb_prec) * limb_prec;
> +      if (mp == 0)
> +     mp = limb_prec;
>        if (mp >= (unsigned) TYPE_PRECISION (TREE_TYPE (op)))
>       type = TREE_TYPE (op);
>        else
> --- gcc/testsuite/gcc.dg/bitint-44.c.jj       2023-11-30 17:45:02.421017172 
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-44.c  2023-11-30 17:39:51.968393081 +0100
> @@ -0,0 +1,10 @@
> +/* PR middle-end/112771 */
> +/* { dg-do compile { target bitint575 } } */
> +/* { dg-options "-std=c23" } */
> +
> +_BitInt(575)
> +foo (_BitInt(575) a)
> +{
> +  a /= 0;    /* { dg-warning "division by zero" } */
> +  return a;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to