[llvm-dev] Scalable Vector Types in IR - Next Steps?

Alex Susu via llvm-dev llvm-dev at lists.llvm.org
Sat Jul 13 06:32:17 PDT 2019


   Hello.
     I am very interested in adding scalable vector support in my LLVM 8.0 compiler for 
the Connex SIMD research processor - but the patches discussed on llvm-dev don't work 
well. So can you help me?
     The reason I need scalable vector types is our Connex SIMD/vector processor can be 
synthesized in different instances with different number of lanes. Using a non-scalable 
vector type in our Connex LLVM compiler can result in incorrect code, for example, for the 
following LLVM IR instruction:
         %res = icmp lt <8 x i16> stepvector, <8 x i16> <10, 10, 10, ..., 10>
       because the result should be different if we are to run this instruction for a 
Connex processor with 8 VS 16 lanes,
       but in this case with non-scalable vector type the result is a predicate vector of 
all true.

     More exactly, I don't care right now that the LoopVectorize pass generates scalable 
vector code. What I only want right now is that I give an LLVM IR program with scalable 
vector code (obtained normally from the ARM SVE LLVM compiler, built from the source code 
https://github.com/ARM-software/LLVM-SVE)
       to my standard LLVM distro + scalable vector support and it is able to:
           - parse the .ll LLVM IR program
           - then generate assembly code for my Connex back end, which I plan to use 
exclusively a scalable vector type like <vscale x 4 x i16>.


     I applied the 3 patches discussed in 
http://lists.llvm.org/pipermail/llvm-dev/2019-March/130852.html 
(https://reviews.llvm.org/D32530, https://reviews.llvm.org /D47770, and 
https://reviews.llvm.org/D53137).
     However, it seems there are quite a few features missing from this patch to add good 
scalable vector support in LLVM. For example the patches do not parse the stepvector.
     So I had to get inspired from the lib/AsmParser and lib/IR folders from 
https://github.com/ARM-software/LLVM-SVE (the ARM SVE LLVM compiler) and changed the 
following files in my LLVM 8.0 build:
        llvm/lib/AsmParser/LLLexer.cpp
        llvm/lib/AsmParser/LLParser.cpp
        llvm/lib/AsmParser/LLParser.h
        llvm/lib/AsmParser/LLToken.h
        llvm/lib/IR/Instructions.cpp
        llvm/include/llvm/IR/Constants.h
        llvm/include/llvm/IR/Value.def
        llvm/lib/IR/Constants.cpp

     However, things seems to be a bit more complicated - it seems I need to patch also 
files in the clang folder also (https://github.com/ARM-software/Clang-SVE, for example 
clang/lib/CodeGen/CGExpr.cpp) since I get errors like: 
<<tools/clang/lib/CodeGen/CGExpr.cpp:3337: clang::CodeGen::Address 
emitArraySubscriptGEP(clang::CodeGen::CodeGenFunction&, clang::CodeGen::Address, 
llvm::ArrayRef<llvm::Value*>, clang::QualType, bool, bool, clang::SourceLocation, const 
llvm::Twine&): Assertion `isa<llvm::ConstantInt>(idx) && 
cast<llvm::ConstantInt>(idx)->isZero()' failed.>>.

     So, since I have difficulties adding good scalable vector support in LLVM 8.0 (taken 
from the SVN repo in Mar 2019) I'd like to ask if anybody else has tried adding good 
scalable vector support in LLVM recently?

   Thank you,
     Alex


On 3/29/2019 6:33 PM, Sebastian Pop via llvm-dev wrote:
> I had a phone conversation yesterday with Graham, Francesco,
> and Kristof.
>
> There is one more reason to go with the native type change:
> ARM has already written the code with the SV types, and they
> have patches ready to be reviewed and integrated in LLVM.
>
> As I don't want to stand in the way of getting SVE in LLVM
> as soon as possible, I will also support the integration of the
> existing patches and I will help with the review.
>
> Sebastian
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>


More information about the llvm-dev mailing list