Decouple LoopVectorizer from O3

Hello,

I am trying out the LoopVectorizer(LV) pass and would like to decouple it from O3 which is currently required to run LV. I want to do this because I want to understand the behaviour of LV by trying simple loops but the O3 mostly optimises away the loop body.

Any ideas would be appreciated.

Best,
Anadi.

You can take unoptimized bitcode and run it through ‘opt’ to have complete flexibility in which passes get run. It may take some fiddling to find out the pass sequence and ordering that does what you want, as some passes rely on previous passes to canonicaplize code into a form it can effectively work with.

-Jim

Hi Anadi,

In the file PassManagerBuilder.cpp you can change the lines below to get rid of the O3 restriction.

189 if (LoopVectorize && OptLevel > 2)
190 MPM.add(createLoopVectorizePass());

Nadav

Thanks for the suggestion Jim. I already tried to do it by ‘opt’ but it also requires O3. BTW I think that if I invoke ‘opt’ with ‘-vectorize-loops’ option, it will figure out the passes required for LV since every pass mentions what other passes are prerequisite. Am I correct?

I think that you can disable passes that have already been setup.

This avoids having to actually edit code to remove a pass.

You should be able do this in the TargetPassConfig class for your target.

Hi Nadav,

I tried your suggestion by changing the condition to :

189 if (LoopVectorize && OptLevel >= 0)
190 MPM.add(createLoopVectorizePass());

and compiled. Then I used the following command:

opt -mtriple=x86_64-linux-gnu -vectorize-loops
-vectorizer-min-trip-count=6 -debug-only=loop-vectorize -O1-S -o
example1_vect.s example1.s

where example1.s is IR generated by

clang -S -emit-llvm example1.c

example1.c contains the following loop:

for(int i=0;i<SIZE;i++)
        {
                aa[i] = bb[i] + count;
                count++;
                printf("a[%d] is %d", i,aa[i]);
        }

LV runs and says "LV: Found too many inductions".

I am guessing that this because some of the loop passes are missing.
Could you please shed some light on what passes should be used to
prepare the IR for LV?

Best,
Anadi

Hi Anadi,

Yes, this is a bug in the loop vectorizer. The loop vectorizer expects only one loop counter (integer with step=1). There is no reason why we should not handle the case below, and it should be easy to fix. Interestingly enough if you reverse the order of iterations and count from SIZE to zero, the loop vectorizer would vectorize it. If you open a bugzilla report and assign it to me I will look at it.

Example:

int foo(int *aa, int *bb, int SIZE) {
int count = 190;
for(int i=SIZE;i > 0;i–) {
aa[i] = bb[i] + count;
count++;
}
}

Thanks,
Nadav

The loop vectorizer has some LSR-like capabilities for merging multiple induction variables into a

Done.

Best,
Anadi.

Just an FYI: it’s often handy to mention the PR number when a thread is concluded by filing a bug. That way other people reading (now, or more importantly, later) can follow the issue through to the bug and its resolution

Hi David,

Thanks for the suggestion, here is the link for the bug report.

http://llvm.org/bugs/show_bug.cgi?id=15720

Best,
Anadi.