https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102989

--- Comment #39 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #38)
> I guess there are other options.
> If we could make wide_int/widest_int non-POD, one option would be to turn
> their storage into a union of the normal small case we use now everywhere
> (i.e. fixed one) and one where the val array is not stored directly in the
> storage but pointed to by some pointer.
> E.g.
> class GTY(()) wide_int_storage
> {
> private:
>   HOST_WIDE_INT val[WIDE_INT_MAX_ELTS];
>   unsigned int len;
>   unsigned int precision;
> could be
> private:
>   union { HOST_WIDE_INT val[WIDE_INT_MAX_ELTS]; HOST_WIDE_INT *valp; };
>   unsigned int len;
>   unsigned int precision;
> and decide which one is which based on len > WIDE_INT_MAX_ELTS or something
> similar.
> Or, if we can't affort to make it non-POD, perhaps valp would refer to
> obstack destroyed at the end of each pass or something similar.
> Another problem is with INTEGER_CST (note, if we lower this stuff before
> expansion hopefully we wouldn't need something similar for rtxes).
> Currently INTEGER_CST has:
>     /* The number of HOST_WIDE_INTs in an INTEGER_CST.  */
>     struct {
>       /* The number of HOST_WIDE_INTs if the INTEGER_CST is accessed in
>          its native precision.  */
>       unsigned char unextended;
>    
>       /* The number of HOST_WIDE_INTs if the INTEGER_CST is extended to
>          wider precisions based on its TYPE_SIGN.  */
>       unsigned char extended;
> 
>       /* The number of HOST_WIDE_INTs if the INTEGER_CST is accessed in
>          offset_int precision, with smaller integers being extended
>          according to their TYPE_SIGN.  This is equal to one of the two
>          fields above but is cached for speed.  */            
>       unsigned char offset;                                   
>     } int_length;
> Now, this obviously limits the largest representable constants to 0xFF
> HOST_WIDE_INTs,

It might be possible to elide 'offset' given it is just a cache.  Also
'extended' can possibly be computed as well.

Reply via email to