[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