On Tue, Jan 27, 2026 at 02:24:37PM +0100, Richard Biener wrote:
>       PR ipa/116296
>       * ipa-modref-tree.cc (modref_access_node::contains): Use
>       poly_offset_int for the param offset difference and the
>       overlap computation.
> 
>       * gcc.dg/torture/pr116296.c: New testcase.

> @@ -80,7 +80,8 @@ modref_access_node::contains (const modref_access_node &a) 
> const
>             a.offset may result in non-negative offset again.
>             Ubsan fails on val << LOG_BITS_PER_UNIT where val
>             is negative.  */
> -        aoffset_adj = (a.parm_offset - parm_offset)
> +        aoffset_adj = (poly_offset_int::from (a.parm_offset, UNSIGNED)
> +                       - poly_offset_int::from (parm_offset, UNSIGNED))
>                        * BITS_PER_UNIT;

parm_offset is poly_int64 rather than poly_uint64, so shouldn't the above be
SIGNED instead?

>       }
>      }
> @@ -96,10 +97,14 @@ modref_access_node::contains (const modref_access_node 
> &a) const
>             || !known_le (size, a.size)))
>       return false;
>        if (known_size_p (max_size))
> -     return known_subrange_p (a.offset + aoffset_adj,
> -                              a.max_size, offset, max_size);
> +     return known_subrange_p (poly_offset_int::from (a.offset, UNSIGNED)
> +                              + aoffset_adj, a.max_size,
> +                              poly_offset_int::from (offset, UNSIGNED),
> +                              max_size);
>        else
> -     return known_le (offset, a.offset + aoffset_adj);
> +     return known_le (poly_offset_int::from (offset, UNSIGNED),
> +                      poly_offset_int::from (a.offset, UNSIGNED)
> +                      + aoffset_adj);

And so is offset.

        Jakub

Reply via email to