> Am 03.01.2025 um 09:44 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> Hi!
> 
> When touching the function yesterday, I was surprised to see just
> TREE_CODE (something) != INTEGER_CST checks followed by tree_to_shwi.
> That would ICE if the INTEGER_CST doesn't fit.
> 
> I have actually not been able to reproduce an ICE for the elt case
> as the caller gives up if the precision of the array type is larger than 32
> bits (but I think it is still cleaner to use it), the idx case can actually
> ICE e.g. on
> static const unsigned long long magic = 0x03f08c5392f756cdULL;
> static const char table[] = {
>     0,  [0x8000000000000000ULL] = 1, 12,  2, 13, 22, 17,  3, 14, 33, 23, 36, 
> 18, 58, 28,  4,
>    62, 15, 34, 26, 24, 48, 50, 37, 19, 55, 59, 52, 29, 44, 39,  5,
>    63, 11, 21, 16, 32, 35, 57, 27, 61, 25, 47, 49, 54, 51, 43, 38,
>    10, 20, 31, 56, 60, 46, 53, 42, 9, 30, 45, 41,  8, 40,  7,  6,
> };
> 
> int ctz (unsigned long x)
> {
>  unsigned long lsb = x & -x;
>  return table[(lsb * magic) >> 58];
> }
> ~/src/gcc/obj20/gcc/cc1 -quiet /tmp/1.c -O2 -mbmi
> /tmp/1.c:2:19: warning: size of ‘table’ 9223372036854775871 bytes exceeds 
> maximum object size 9223372036854775807 [-Wlarger-than=]
>    2 | static const char table[] = {
>      |                   ^~~~~
> during GIMPLE pass: forwprop
> /tmp/1.c: In function ‘ctz’:
> /tmp/1.c:13:1: internal compiler error: in tree_to_shwi, at tree.cc:6518
>   13 | }
>      | ^
> 0x2efa51f internal_error(char const*, ...)
>    ../../gcc/diagnostic-global-context.cc:517
> 0xf3c617 fancy_abort(char const*, int, char const*)
>    ../../gcc/diagnostic.cc:1722
> 0x949a36 tree_to_shwi(tree_node const*)
>    ../../gcc/tree.cc:6518
> 0x949a36 tree_to_shwi(tree_node const*)
>    ../../gcc/tree.cc:6516
> 0x18472d5 check_ctz_array
>    ../../gcc/tree-ssa-forwprop.cc:2286
> but given the 9223372036854775871 bytes long array
> I'm not sure it is appropriate for the testsuite.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok


> 2025-01-03  Jakub Jelinek  <ja...@redhat.com>
> 
>    * tree-ssa-forwprop.cc (check_ctz_array): Use tree_fits_shwi_p instead
>    of just TREE_CODE tests for INTEGER_CST.
> 
> --- gcc/tree-ssa-forwprop.cc.jj    2025-01-02 12:29:23.906259521 +0100
> +++ gcc/tree-ssa-forwprop.cc    2025-01-02 13:54:25.077630882 +0100
> @@ -2278,9 +2278,9 @@ check_ctz_array (tree ctor, unsigned HOS
> 
>   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), i, idx, elt)
>     {
> -      if (TREE_CODE (idx) != INTEGER_CST)
> +      if (!tree_fits_shwi_p (idx))
>    return false;
> -      if (TREE_CODE (elt) != INTEGER_CST && TREE_CODE (elt) != RAW_DATA_CST)
> +      if (!tree_fits_shwi_p (elt) && TREE_CODE (elt) != RAW_DATA_CST)
>    return false;
> 
>       unsigned HOST_WIDE_INT index = tree_to_shwi (idx);
> 
>    Jakub
> 

Reply via email to