[LLVMdev] SIMD Projects with LLVM

Nadav Rotem nrotem at apple.com
Wed Apr 2 22:04:11 PDT 2014


Hi Rob, 

This is a codegen bug. At the moment we don’t support bitcasting or storing/loading memory of 'illegal' vector element types that are smaller than i8. 

Thanks,
Nadav

On Apr 2, 2014, at 6:52 PM, Rob Cameron <cameron at cs.sfu.ca> wrote:

> Hi everyone.   After lurking for a while, this is my
> first post to the list.
> 
> I am working with some graduate students on the general
> topic of compiler support for SIMD programming and specific
> projects related to LLVM and my own Parabix technology
> (parabix.costar.sfu.ca).
> 
> Right now we have a few course projects on the go and
> already a question arising out of one of them (SSE2 Hoisting).
> We're not sure how much has been tried before, or even
> makes sense, but we're eager to learn.
> 
> Briefly the projects are:
> 
> SSE2 Hoisting: translating programs that directly use SSE2
> intrinsics into platform-independent code expressed with LLVM IR.
> 
> Long integer support: systematic support for i128, i256, ... targetting
> SIMD registers.  
> 
> Systematic strategies for the shufflevector operation.   This
> is a very powerful operation that can be used to code for arbitrary
> rearrangement of data in SIMD registers.   No architecture we
> know of supports it in its full generaility.   But there are
> many special cases that are recognized in code generation and
> potentially many more that might be.
> 
> Systematic support for all power-of-2 field widths with
> vector types.   For example, we are interested in <64 x i2> being
> a legal type with appropriate expansion operations.   A student
> has made a GSoC submission for this project.
> 
> The question I have right now actually relates to the i2 type.
> In our SSE2 hoisting, we found an issue with the movemask_pd
> operation, which extracts the sign bits of the 2 doubles in
> a <2 x double> and returns them as an int32.   We would
> like to use the icmp slt as the LLVM IR operation for this,
> but have a problem when we bitcast the <2 x i1> vector to i2,
> it seems.  We use the following LLVM IR code.
> 
> define i32 @signmaskd(<2 x double> %a) alwaysinline #5
> {
>        %bits = bitcast <2 x double> %a to <2 x i64>
>        %b = icmp slt <2 x i64> %bits, zeroinitializer
>        %c = bitcast <2 x i1> %b to i2
>        %result = zext i2 %c to i32
>        ret i32 %result
> }
> 
> Unfortunately, we only get 1 bit of data out; the assembly language
> output seems to confirm that the individual bit extractions take
> place, but the second one clobbers the first.   We are using the 3.4
> tool chain.
> 
> There is more detail at the following URL.
> http://parabix.costar.sfu.ca/wiki/I2Result
> 
> Anyway the question is whether we should just try to treat
> this as a bug to be fixed or whether our idea of working with
> i2 types is misguided in a more fundamental way.
> 
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list