Richard Sandiford <richard.sandif...@linaro.org> writes: > "Bin.Cheng" <amker.ch...@gmail.com> writes: >> On Wed, May 3, 2017 at 11:07 AM, Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Wed, May 3, 2017 at 9:54 AM, Richard Sandiford >>> <richard.sandif...@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.
Upthread you said "otherwise ok" apart from the "I'm a bit wary..." part. Is the original patch OK given the above? Thanks, Richard