[LLVMdev] Generalizing shuffle vector

Stefanus Du Toit stefanus.dutoit at rapidmind.com
Tue Sep 30 06:44:07 PDT 2008


Hi Mon Ping,

Generalizing shufflevector would be great. I have an additional  
suggestion below.

On 29-Sep-08, at 11:11 PM, Mon Ping Wang wrote:
> I am proposing to extend the shuffle vector definition to be
> <result> = shufflevector <n x <ty>> <v1>, <n x <ty>> <v2>, <m x i32>  
> <mask> ; yields <m x <ty>>
>
> The third argument is the shuffle mask and it is not required to  
> have the same number of elements as the other vector type but the  
> element type is still always 'i32'

I've previously proposed an even further generalization of  
shufflevector to:

<result> = shufflevector <n1 x <ty>> <v1>, <n2 x <ty>> <v2>, <m x i32>  
<mask> ; yields <m x <ty>>

where n1 does not have the be the same as n2. This makes shufflevector  
completely generic, and in fact allows even insertelement and  
extractelement to be represented using it (not that I necessarily  
think they should be, it's just a nice side effect).

If this is feasible, it would be nice to extend it all the way. This  
lets you do things like:

float3 x;
float4 y;

  // ...

y.xyz = x;

as a single shufflevector, e.g.:

   %y2 = shufflevector <4xf32> %y1, <3xf32> %x, <4, 5, 6, 3>

I assume my proposed generalization can't hurt codegen, since it could  
always be turned into a sequence of insert and extracts which would  
provide the same behaviour as today.

--
Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
   RapidMind Inc.
   phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463






More information about the llvm-dev mailing list