[llvm] r184684 - LoopVectorize: Add utility class for checking dependency among accesses
Hal Finkel
hfinkel at anl.gov
Thu Oct 31 09:24:42 PDT 2013
----- Original Message -----
>
> On Oct 31, 2013, at 9:40 AM, Hal Finkel <hfinkel at anl.gov> wrote:
>
> > ----- Original Message -----
> >>
> >> + // Negative distances are not plausible dependencies.
> >> + const APInt &Val = C->getValue()->getValue();
> >> + if (Val.isNegative()) {
> >> + bool IsTrueDataDependence = (AIsWrite && !BIsWrite);
> >> + if (IsTrueDataDependence &&
> >> + (couldPreventStoreLoadForward(Val.abs().getZExtValue(),
> >> TypeByteSize) ||
> >> + ATy != BTy))
> >
> > I don't understand why we're checking for store-load forwarding in
> > this case. If I understand correctly, this handles cases where we
> > have things like:
> > for (int i = 0; i < n; ++i) {
> > a[i] = a[i+3] // + b[i];
> > }
> >
>
> No. This check catches the case:
>
>
> ASCEV: a[i] = …
> BSCEV: = a[i-1]
>
> AIsWrite
> BIsRead
You're right; I misread the (AIsWrite && !BIsWrite) part. Thanks for clarifying!
-Hal
>
> BSCEV-ASCEV = negative, so this is a “safe dependence in program
> order to vectorize”:
>
> Iteration 1:
> a[1] =
> = a[0]
>
> Iteration 2:
> a[2] =
> = a[1]
>
> Iteration 3:
> a[3] =
> = a[2]
>
> Vectorized:
> a[1:2:3] =
> = a[0:1:2]
> a[4:5:6] =
> = a[3:4:5]
>
> But you miss out on store load forwarding ("a[1] =“ -> “ = a[1]”,
> etc) making this slower.
>
> We can add a target hook if you have an architecture where store load
> forwarding still happens in such cases.
>
> Best,
> Arnold
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list