[cfe-dev] [llvm-dev] generate vectorized code

Mehdi Amini via cfe-dev cfe-dev at lists.llvm.org
Fri Mar 18 13:40:49 PDT 2016

> On Mar 18, 2016, at 1:37 PM, Rail Shafigulin <rail at esenciatech.com> wrote:
>> I think you created a cycle, this is easy to do with SelectionDAG :)
>> Basically SelecitonDAG will iterate until it does not see anything to change. So if you insert a transformation on a pattern A, that generates pattern B, while you have another transformation that matches B and generates somehow A, you run into an infinite loop.
>>> I'm doing a lot of guess work in trying to understand what is going on. I would really appreciate any help on this.
>> Here is how I started with SelectionDAG: 
>> - small IR (bugpoint can help)
>> - the magic flag: -debug 
>> - read the output of SelectionDAG debugging (especially with cycles)
>> - matching the log to source code
>> - single stepping in a debugger sometimes.
> Also: try to run your experiments with llc so you can easily tweak the input IR to SelectionDAG.
> -- 
> Mehdi
> I ran a very simple test using llc and the following .ll file
> target datalayout = "E-m:e-p:32:32-i64:32-f64:32-v64:32-v128:32-a:0:32-n32"
> target triple = "esencia"
> ; Function Attrs: nounwind uwtable
> define i32 @main() {
> entry:
>    %z = alloca <4 x i32>
>    %a = alloca <4 x i32>
>    %b = alloca <4 x i32>
>    %a.l = load <4 x i32>* %a
>    %b.l = load <4 x i32>* %b
>    %z.l = add <4 x i32> %a.l, %b.l
>    store <4 x i32> %z.l, <4 x i32>* %z
>    ret i32 0
> }
> The test ran successfully (by successfully I mean genration of correct assembly for my target) without any modifications to the code, i.e. I didn't have to add any
>   setOperationAction(ISD::BUILD_VECTOR,      MVT::v4i32, Expand);
>   setOperationAction(ISD::EXTRACT_VECTOR_ELT,      MVT::v4i32, Expand);
>   setOperationAction(ISD::VECTOR_SHUFFLE,      MVT::v4i32, Expand);

Yes this IR does not build or shuffle any vector. Try to write a function that takes 8 ints and a pointer to a <4xi32>, builds two vectors with the 8 ints, sum them, and store the result to the pointer.

> In other words I left the code as is. 
> However if I use a .c code and run it through clang, I don't see any vector instructions. I'm puzzled. What am I doing wrong? There seems to be a step missing, the one that will generate vectorized IR, but I can't seem to find how to do it.

Try: clang -O3 -emit-llvm -S test.c


> Any help on this is really appreciated.
> -- 
> Rail Shafigulin
> Software Engineer 
> Esencia Technologies

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160318/70c74c9a/attachment.html>

More information about the cfe-dev mailing list