Martin Sebor <mse...@gmail.com> writes:
> On 02/24/2018 02:32 AM, Richard Sandiford wrote:
>> Martin Sebor <mse...@gmail.com> writes:
>>> On 02/23/2018 01:13 PM, Jakub Jelinek wrote:
>>>> On Fri, Feb 23, 2018 at 12:57:14PM -0700, Martin Sebor wrote:
>>>>> +  /* get_inner_reference is not expected to return null.  */
>>>>> +  gcc_assert (base != NULL);
>>>>> +
>>>>>    poly_int64 bytepos = exact_div (bitpos, BITS_PER_UNIT);
>>>>>
>>>>> -  HOST_WIDE_INT const_off;
>>>>> -  if (!base || !bytepos.is_constant (&const_off))
>>>>> -    {
>>>>> -      base = get_base_address (TREE_OPERAND (expr, 0));
>>>>> -      return;
>>>>> -    }
>>>>> -
>>>>> +  /* There is no conversion from poly_int64 to offset_int even
>>>>> +     though the latter is wider, so go through HOST_WIDE_INT.
>>>>> +     The offset is expected to always be constant.  */
>>>>> +  HOST_WIDE_INT const_off = bytepos.to_constant ();
>>>>
>>>> The assert is ok, but removing the bytepos.is_constant (&const_off)
>>>> is wrong, I'm sure Richard S. can come up with some SVE testcase
>>>> where it will not be constant.  If it is not constant, you can handle
>>>> it like var_off (which as I said on IRC or in the PR also seems to be
>>>> incorrect, because if the base is not a decl the variable offset could be
>>>> negative).
>>>
>>> That's what I did at first.  I took it out because it sounded
>>> to me like you were saying it was a hypothetical possibility,
>>> not something that would ever happen in practice, and because
>>> I have no way of testing that code.  I have put it back in
>>> the attached update.
>>>
>>> Since you added Richard: can you please explain how to convert
>>> a poly64_int to offset_int without converting it to HOST_WIDE_INT,
>>> or if it can't be done, why not?  It's cumbersome and error-prone
>>> to have to go through HWI, and doing so defeats the main goal of
>>> using offset_int in the gimple-ssa-warn-restrict pass.  Should
>>> the pass (and others like it) be changed to store offsets and
>>> sizes in some flavor of poly_int instead of offset_int?
>>
>> Not sure if this is what you mean, but:
>>
>> bool f (poly_int64 x, offset_int *y) { return x.is_constant (y); }
>>
>> does work.  "y" doesn't have to be "HOST_WIDE_INT *".
>
> Great, that works, thank you!
>
> Can you also comment on whether the poly64_int offset returned
> by get_inner_reference() can be non-constant?  O'm trying to
> understand why/how that could happen and if there is a way to
> test it in the -Wrestrict pass (i.e., come up with a test case
> involving memcpy or similar built-in).

Yeah, get_inner_reference can return non-constant offsets (but so far
only on SVE of course).  E.g. the SVE versions of IFN_LOAD/STORE_LANES
use arrays of variable-length vectors, so vectors 1 and above will be at
non-constant offsets.  Also, the OpenMP support creates vector-sized
variables, and we can have references to the last element of such
a vector.

I don't think it can yet happen for cases that are interesting to the
-Wrestrict warning though, so dropping back to conservatively correct
behaviour (via is_constant) is fine.

And that's the general principle: if one of the inputs has poly type,
try to use poly types for the whole operation if it's easy to do,
otherwise drop to conservatively correct behaviour using is_constant.
Only use to_constant if there is a known reason for it to be correct
(rather than no known reason for it to be incorrect).

Thanks,
Richard

Reply via email to