[llvm-dev] Separate LoopVectorize LLVM pass
Alex Susu via llvm-dev
llvm-dev at lists.llvm.org
Tue Apr 18 16:06:03 PDT 2017
Hello.
I come back to this thread because I still have issues with my separate LoopVectorize
(same code, but without relying on PassManagerBuilder and -O3) LLVM pass.
More exactly, my LoopVectorize pass, when given the following reduction code:
short SumReduce(short *C, short N) {
short sum = 0;
for (short i = 0; i < N; ++i) {
sum += C[i];
}
return sum;
}
I get on the standard error of opt:
LV: Checking a loop in "SumReduce" from test.c:15:3
LV: Loop hints: force=? width=128 unroll=0
LV: Found a loop: for.body
LoopVectorize::canVectorizeInstrs(): PhiScev = {0,+,1}<nuw><nsw><%for.body>
LoopVectorize::canVectorizeInstrs(): AR = {0,+,1}<nuw><nsw><%for.body>
LV: Found an induction variable.
LoopVectorize::canVectorizeInstrs(): PhiScev = %sum.02
LV: PHI is not a poly recurrence.
LV: PHI is not a poly recurrence.
remark: <unknown>:0:0: loop not vectorized: value that could not be identified as
reduction is used outside the loop
LV: Found an unidentified PHI. %sum.02 = phi i32 [ %add, %for.body ], [ 0,
%for.body.preheader ]
LV: Can't vectorize the instructions or CFG
LV: Not vectorizing: Cannot prove legality.
Exiting LoopVectorize::runOnFunction()
Does anybody know what pass would be helpful for this issue (e.g. "PHI is not a poly
recurrence."), besides the passes presented below already.?
Thank you very much,
Alex
On 4/17/2017 1:01 PM, Alex Susu wrote:
> Hi.
> I managed to find the reason why my own LoopVectorize pass does not vectorize.
> Actually, the loop-simplify pass was getting executed, but because it did not run the
> passes loop-rotate and licm before it did not generate a proper loop preheader and the
> loops were not valid for vectorization.
>
> To make my own LoopVectorize pass vectorize I got inspired from the arguments
> displayed on stdout of:
> opt -debug-pass=Arguments -O3 ...
> and looked at what other passes are being executed before and after -loop-vectorize .
>
> So I chose the following:
> opt -mem2reg -loop-rotate -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa
> -instcombine -loops -loop-simplify \
> -force-vector-width=128 -load MyLoopVectorize.so -my-loop-vectorize \
> -loop-simplify -scalar-evolution -aa -loop-accesses -loop-load-elim -basicaa -aa
> -instcombine -scalar-evolution -demanded-bits -slp-vectorizer
>
>
> Best regards,
> Alex
>
> On 4/14/2017 11:04 PM, Alex Susu wrote:
>> Hello.
>> I am trying to create my own LoopVectorize.cpp pass as a separate pass from the LLVM
>> trunk, as described in http://llvm.org/docs/CMake.html#embedding-llvm-in-your-project. Did
>> anybody try something like this?
>> I added close to the end of the .cpp file:
>> /* this line seems to be required - it allows to run this pass
>> as an embedded pass by giving opt -my-loop-vectorize */
>> static RegisterPass<LoopVectorize> Z("my-loop-vectorize",
>> "Write comments in source file.");
>>
>> Note that I did NOT register my new pass in
>> llvm/lib/Transforms/IPO/PassManagerBuilder.cpp - the original LoopVectorize module is
>> registered there.
>>
>> However, when I give:
>> opt -debug -load NewLoopVectorize.so -my-loop-vectorize test.c
>> it does not vectorize a loop that was normally vectorized by the original
>> LoopVectorize module in LLVM. My module gives:
>> <<loop not vectorized: loop control flow is not understood by vectorizer
>> LV: Not vectorizing: Cannot prove legality.>>
>>
>> So I tried to explicitly run a few more passes before my new LoopVectorize to help it
>> (I think the most important one is -loop-simplify, which canonicalizes the loop):
>> opt -debug -loop-simplify -mem2reg -lcssa -load NewLoopVectorize.so
>> -my-loop-vectorize test.c
>> However, I do not see any line in the output of opt starting with "LoopSimplify" (when
>> I have success, when I give opt -O3, I get "LoopSimplify: Creating pre-header
>> for.body.preheader; LoopSimplify: Creating dedicated exit block for.end.loopexit" before
>> LoopVectorize) and my LoopVectorize still does not vectorize the loop.
>>
>> Can anybody help me run explicitly the LoopSimplify pass (before my LoopVectorize
>> pass)?
>>
>> Thank you. And wish you happy Easter holidays!
>> Alex
More information about the llvm-dev
mailing list