On Fri, Nov 05, 2021 at 05:37:25PM +0000, Qing Zhao wrote:
> > On Nov 5, 2021, at 11:17 AM, Jakub Jelinek <ja...@redhat.com> wrote:
> > 
> > On Fri, Nov 05, 2021 at 04:11:36PM +0000, Qing Zhao wrote:
> >> 3076       if (TREE_CODE (TREE_TYPE (lhs)) != BOOLEAN_TYPE
> >> 3077           && tree_fits_uhwi_p (var_size)
> >> 3078           && (init_type == AUTO_INIT_PATTERN
> >> 3079               || !is_gimple_reg_type (var_type))
> >> 3080           && int_mode_for_size (tree_to_uhwi (var_size) * 
> >> BITS_PER_UNIT,
> >> 3081                                 0).exists ())
> >> 3082         {
> >> 3083           unsigned HOST_WIDE_INT total_bytes = tree_to_uhwi 
> >> (var_size);
> >> 3084           unsigned char *buf = (unsigned char *) xmalloc 
> >> (total_bytes);
> >> 3085           memset (buf, (init_type == AUTO_INIT_PATTERN
> >> 3086                         ? INIT_PATTERN_VALUE : 0), total_bytes);
> >> 3087           tree itype = build_nonstandard_integer_type
> >> 3088                          (total_bytes * BITS_PER_UNIT, 1);
> >> 
> >> The exact failing point is at function 
> >> “set_min_and_max_values_for_integral_type”:
> >> 
> >> 2851   gcc_assert (precision <= WIDE_INT_MAX_PRECISION);
> >> 
> >> For _Complex long double,  “precision” is 256.  
> >> In GCC11, “WIDE_INT_MAX_PRECISION” is 192,  in GCC12, it’s 512. 
> >> As a result, the above assertion failed on GCC11. 
> >> 
> >> I am wondering what’s the best fix for this issue in gcc11? 
> > 
> > Even for gcc 12 the above is wrong, you can't blindly assume that
> > build_nonstandard_integer_type will work for arbitrary precisions,
> > and even if it works that it will actually work.
> > The fact that such a mode exist is one thing, but
> > targetm.scalar_mode_supported_p should be tested for whether the mode
> > is actually supported.
> 
> You mean “int_mode_for_size().exists()” is not enough to make sure
> “build_nonstandard_integer_type” to be valid?  We should add
> “targetm.scalar_mode_supported_p” too ?

Yeah.  The former says whether the backend has that mode at all.
But some modes may be there only in some specific patterns but
without support for mov, add, etc.  Only for
targetm.scalar_mode_supported_p modes the backend guarantees that
one can use them e.g. in mode attribute and can expect expansion
to expand everything with that mode that is needed in some way.
E.g. only if targetm.scalar_mode_supported_p (TImode) the FEs
support __int128_t type, etc.

        Jakub

Reply via email to