Alex Susu via llvm-dev
2016-Aug-01 00:29 UTC
[llvm-dev] LLVM Loop vectorizer - 2 vector.body blocks appear
Hello. Mikhail, with the more recent version of the LoopVectorize.cpp code (retrieved at the beginning of July 2016) I ran the following piece of C code: void foo(long *A, long *B, long *C, long N) { for (long i = 0; i < N; ++i) { C[i] = A[i] + B[i]; } } The vectorized LLVM program I obtain contains 2 vector.body blocks - one named "vector.body" and the other "vector.body34" for example. The code seems correct - the first "vector.body" block is responsible for the vector add of a number of vector elements multiple of VF * UF. There are 2 epilogues which makes things a bit strange - I am still trying to understand the code. Is it possible to explain to me where in LoopVectorize.cpp are created 2 vector.body blocks? I know that InnerLoopVectorizer::vectorize() calls InnerLoopVectorizer::createEmptyLoop() which creates the blocks required for vectorization, but I have difficulties to follow the classes instantiations. I ask because in fact, I would prefer having only one "vector.body" block for the above C program, as it was happening with LoopVectorize.cpp version of Nov 2015. Thank you very much, Alex
Michael Zolotukhin via llvm-dev
2016-Aug-05 23:15 UTC
[llvm-dev] LLVM Loop vectorizer - 2 vector.body blocks appear
Hi Alex, How do you compile this program? I compile it as follows, and don’t see extra vector-bodies:> bin/clang -O3 vec.c -S -o - |grep "##"_foo: ## @foo ## BB#0: ## %entry ## BB#1: ## %for.body.preheader ## BB#8: ## %min.iters.checked ## BB#9: ## %vector.memcheck ## BB#10: ## %vector.memcheck ## BB#11: ## %vector.body.preheader ## BB#12: ## %vector.body.prol LBB0_13: ## %vector.body.prol.loopexit ## BB#14: ## %vector.body.preheader.new LBB0_15: ## %vector.body ## =>This Inner Loop Header: Depth=1 LBB0_16: ## %middle.block LBB0_2: ## %for.body.preheader27 ## BB#3: ## %for.body.prol.preheader LBB0_4: ## %for.body.prol ## =>This Inner Loop Header: Depth=1 LBB0_5: ## %for.body.prol.loopexit ## BB#6: ## %for.body.preheader27.new LBB0_7: ## %for.body ## =>This Inner Loop Header: Depth=1 LBB0_17: ## %for.cond.cleanup Best regards, Michael> On Jul 31, 2016, at 5:29 PM, Alex Susu <alex.e.susu at gmail.com> wrote: > > Hello. > Mikhail, with the more recent version of the LoopVectorize.cpp code (retrieved at the beginning of July 2016) I ran the following piece of C code: > void foo(long *A, long *B, long *C, long N) { > for (long i = 0; i < N; ++i) { > C[i] = A[i] + B[i]; > } > } > > The vectorized LLVM program I obtain contains 2 vector.body blocks - one named "vector.body" and the other "vector.body34" for example. The code seems correct - the first "vector.body" block is responsible for the vector add of a number of vector elements multiple of VF * UF. There are 2 epilogues which makes things a bit strange - I am still trying to understand the code. > > > Is it possible to explain to me where in LoopVectorize.cpp are created 2 vector.body blocks? I know that InnerLoopVectorizer::vectorize() calls InnerLoopVectorizer::createEmptyLoop() which creates the blocks required for vectorization, but I have difficulties to follow the classes instantiations. > I ask because in fact, I would prefer having only one "vector.body" block for the above C program, as it was happening with LoopVectorize.cpp version of Nov 2015. > > Thank you very much, > Alex-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160805/bee75aa1/attachment.html>
Alex Susu via llvm-dev
2016-Aug-07 22:33 UTC
[llvm-dev] LLVM Loop vectorizer - 2 vector.body blocks appear
Hello. Michael, thank you for your answer - indeed, your command generates only 1 vector.body. I give the following commands to compile: $(LLVM_PATH)/clang -fvectorize -mllvm -force-vector-width=8 src.c -S -emit-llvm $(LLVM_PATH)/opt -debug -O3 -loop-vectorize -force-vector-width=8 src.ll -S >3better_after_opt.ll $(LLVM_PATH)/llc -print-after-all -debug -march=connex -O0 -asm-show-inst -asm-verbose src_after_opt.ll I'd like to mention I am using the version of LoopVectorize.cpp from beginning of Jul 2016. Best regards, Alex On 8/6/2016 2:15 AM, Michael Zolotukhin wrote:> Hi Alex, > > How do you compile this program? I compile it as follows, and don’t see extra vector-bodies: > >> bin/clang -O3 vec.c -S -o - |grep "##" > > _foo: ## @foo > ## BB#0: ## %entry > ## BB#1: ## %for.body.preheader > ## BB#8: ## %min.iters.checked > ## BB#9: ## %vector.memcheck > ## BB#10: ## %vector.memcheck > ## BB#11: ## %vector.body.preheader > ## BB#12: ## %vector.body.prol > LBB0_13: ## %vector.body.prol.loopexit > ## BB#14: ## %vector.body.preheader.new > LBB0_15: ## %vector.body > ## =>This Inner Loop Header: Depth=1 > LBB0_16: ## %middle.block > LBB0_2: ## %for.body.preheader27 > ## BB#3: ## %for.body.prol.preheader > LBB0_4: ## %for.body.prol > ## =>This Inner Loop Header: Depth=1 > LBB0_5: ## %for.body.prol.loopexit > ## BB#6: ## %for.body.preheader27.new > LBB0_7: ## %for.body > ## =>This Inner Loop Header: Depth=1 > LBB0_17: ## %for.cond.cleanup > > > > Best regards, > Michael > > >> On Jul 31, 2016, at 5:29 PM, Alex Susu <alex.e.susu at gmail.com >> <mailto:alex.e.susu at gmail.com>> wrote: >> >> Hello. >> Mikhail, with the more recent version of the LoopVectorize.cpp code (retrieved at the >> beginning of July 2016) I ran the following piece of C code: >> void foo(long *A, long *B, long *C, long N) { >> for (long i = 0; i < N; ++i) { >> C[i] = A[i] + B[i]; >> } >> } >> >> The vectorized LLVM program I obtain contains 2 vector.body blocks - one named >> "vector.body" and the other "vector.body34" for example. The code seems correct - the >> first "vector.body" block is responsible for the vector add of a number of vector >> elements multiple of VF * UF. There are 2 epilogues which makes things a bit strange - I >> am still trying to understand the code. >> >> >> Is it possible to explain to me where in LoopVectorize.cpp are created 2 vector.body >> blocks? I know that InnerLoopVectorizer::vectorize() calls >> InnerLoopVectorizer::createEmptyLoop() which creates the blocks required for >> vectorization, but I have difficulties to follow the classes instantiations. >> I ask because in fact, I would prefer having only one "vector.body" block for the >> above C program, as it was happening with LoopVectorize.cpp version of Nov 2015. >> >> Thank you very much, >> Alex >