This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Alternative check for vector refs with same alignment


"Bin.Cheng" <amker.cheng@gmail.com> writes:
> On Wed, May 3, 2017 at 11:07 AM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>> On Wed, May 3, 2017 at 9:54 AM, Richard Sandiford
>> <richard.sandiford@linaro.org> wrote:
>>> vect_find_same_alignment_drs uses the ddr dependence distance
>>> to tell whether two references have the same alignment.  Although
>>> that's safe with the current code, there's no particular reason
>>> why a dependence distance of 0 should mean that the accesses start
>>> on the same byte.  E.g. a reference to a full complex value could
>>> in principle depend on a reference to the imaginary component.
>>> A later patch adds support for this kind of dependence.
>>>
>>> On the other side, checking modulo vf is pessimistic when the step
>>> divided by the element size is a factor of 2.
>>>
>>> This patch instead looks for cases in which the drs have the same
>>> base, offset and step, and for which the difference in their constant
>>> initial values is a multiple of the alignment.
>>
>> I'm a bit wary about trusting operand_equal_p over dependence analysis.
>> So, did you (can you) add an assert that the new code computes
>> same alignment in all cases where the old one did?

FWIW, the operand_equal_p for the base addresses is the same as the one
used by the dependence analysis:

  /* If the references do not access the same object, we do not know
     whether they alias or not.  We do not care about TBAA or alignment
     info so we can use OEP_ADDRESS_OF to avoid false negatives.
     But the accesses have to use compatible types as otherwise the
     built indices would not match.  */
  if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), OEP_ADDRESS_OF)
      || !types_compatible_p (TREE_TYPE (DR_BASE_OBJECT (a)),
			      TREE_TYPE (DR_BASE_OBJECT (b))))
    {
      DDR_ARE_DEPENDENT (res) = chrec_dont_know;
      return res;
    }

> At the moment operand_equal_p method looks more powerful than
> dependence analysis, for example, it can handle the same memory
> reference with pointer/array_ref forms like in PR65206.  However,
> given dependence check is not expensive here, is it possible to build
> the patch on top of it when it fails?

The old check isn't valid after my later patches, because there's
no guarantee that the accesses start on the same byte.  And like
you say, the new check is more powerful in some ways (including
the modulo vf thing I mentioned).

So I'm not sure we can do anything useful with the dependence distance
information.  Sometimes it would give false positives and sometimes
it would give false negatives.

Thanks,
Richard


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]