[llvm-dev] Auto-vectorization option

Matt P. Dziubinski via llvm-dev llvm-dev at lists.llvm.org
Fri May 14 05:23:05 PDT 2021


On 5/14/2021 13:30, Sudakshina Dutta via llvm-dev wrote:
> Dear all,
> 
> Thanks to all of you. I have executed the following commands on the code 
> given above.
> 
> clang -O3 -S -c find_max.c -Rpass=vector -Rpass-analysis=vector -o 
> find_max.ll
> 
> However, the generated code is an assembly code (attached). Is there any 
> way to generate a vectorized IR (.ll) file ?

To get LLVM IR from the frontend (Clang) use -emit-llvm 
-fno-discard-value-names, e.g., https://godbolt.org/z/aWz37qYdW

If you don't need debugger intrinsics (llvm.dbg.*) add -g0, e.g., 
https://godbolt.org/z/aWz37qYdW

As Sjoerd has mentioned, passing -mllvm -print-before-all to Clang is 
usedful to get pre-vectorized LLVM IR (as well as observe the effects of 
consecutive transformations); Example: https://godbolt.org/z/4za6h6fqo

You can then extract the unoptimized LLVM IR and play with it in "opt" 
(the middle-end optimizer tool) to get the LLVM IR optimized by the 
middle-end passes (including loop vectorizer); note that now you can 
just pass -print-before-all directly: https://llvm.godbolt.org/z/P7E3PGE61

In particular, the LLVM IR displayed under "*** IR Dump Before 
LoopVectorizePass on _Z1fPim ***" is a good baseline for comparisons.

Add "-mllvm -print-module-scope" to get the LLVM IR for the full module 
(translation unit): https://godbolt.org/z/Go7zK8vsW

Then, pass this LLVM (right before LoopVectorizePass) to "opt" using 
options "-loop-vectorize -debug-only=loop-vectorize" to observe the loop 
vectorization pass in action:
https://llvm.godbolt.org/z/WMa1qosoq

Note that you need a binary built with assertions enabled to use -debug 
options.

Last but not least you can give the optimized LLVM IR to "llc" (the 
backend tool) to get the final assembly: 
https://llvm.godbolt.org/z/hxevcqKEG

Best,
Matt


More information about the llvm-dev mailing list