[LLVMdev] LICM and SCEV AA?
Hal Finkel
hfinkel at anl.gov
Sat Nov 2 05:45:04 PDT 2013
----- Original Message -----
>
>
> Sent from my iPhone
>
> > On Nov 2, 2013, at 1:52 AM, Andrew Trick <atrick at apple.com> wrote:
> >
> >
> >> On Oct 31, 2013, at 6:06 AM, Hal Finkel <hfinkel at anl.gov> wrote:
> >>
> >> Hello,
> >>
> >> We currently generate suboptimal code for this loop:
> >>
> >> for (int i = 1; i < LEN; i++) {
> >> a[i] = a[0] + b[i];
> >> }
> >>
> >> The largest problem is that we won't vectorize the loop because
> >> the loop vectorizer does not grok the independence of a[i] and
> >> a[0] (note that i starts at 1 in this loop). While we can
> >> probably fix the vectorizer to handle this, I don't think that is
> >> the right place for the fix, because this is really a LICM
> >> problem. LICM could move a[0] out of the loop, but it currently
> >> doesn't (which is pretty suboptimial in itself). The reason is
> >> that LICM does not use SE (either directly or indirectly), and
> >> BasicAA does not recognize that a[0] and a[i] will never overlap
> >> in this loop.
> >>
> >> I see several possible solutions:
> >>
> >> 1. Add yet-another hack to BasicAA to catch this case.
> >>
> >> 2. Let LICM use SE directly. Instead of bailing out on hoisting a
> >> loop-invariant value in an alias set with non-invariant values,
> >> use SE to check independence with the other values in the alias
> >> set.
> >>
> >> 3. Use ScalarEvolutionAliasAnalysis; scheduling SCEV AA prior to
> >> running LICM fixes this problem.
> >>
> >> Using #3 seems like the simplest, and most natural, way to fix
> >> this issue. I recall someone tell me (maybe at the developers'
> >> meeting) that SCEV AA was 'fundamentally flawed', and now I'm
> >> wondering what was meant by that. The pass manager does not know
> >> how to reschedule it unless it is specifically requested, but if
> >> that's the entirety of the problem, then I think that we could
> >> manually schedule it in a few key places and get a lot of benefit
> >> (there is a particular use case for prior to LICM, at least).
> >>
> >> FWIW, I don't think that adding an SCEV dependency before LICM
> >> would be particularly problematic: Currently, LICM lives in the
> >> same loop pass manager instance as LoopSimplify, LoopRotate and
> >> LoopUnswitch, all of which preserve SE.
> >>
> >> Suggestions?
> >
> > I would be scared to enable SCEV AA because it's not well tested
> > and updating SCEV across transforms can be problematic. LICM would
> > require another run of SCEV (bad for compile time). As for other
> > reasons it's fundamentally flawed, Dan G. may remember.
> >
> > I would be tempted to go with #1 just to fix LICM, since LICM has
> > no need for generic dependence analysis.
> >
> > Of course, the vectorizer already uses SCEV to determine array
> > element dependence. It should have a strong method for dependence
> > analysis. Why does it miss this case?
>
> Like you said it *should*. The simple dependence analysis we
> currently have works by pair wise comparing (subtracting) the access
> SCEVS.
>
> It currently only handles constant dependences (SCEVConstant)
>
> The resulting distance from Hal's example is {4,+,4} ReadWrite and so
> should be safe.
>
> We just don't handle this case yet.
The problem is that having the loop vectorizer handle this case, unless we teach it to also do LICM, would mean turning it into a scalar load and splat on every iteration. This is still not great. Having LICM fix this would be much better.
-Hal
>
> Best,
> Arnold
>
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list