[llvm-dev] [RFC] Vector Predication (original) (raw)

David Greene via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 7 08:50:12 PST 2019


Simon Moll <moll at cs.uni-saarland.de> writes:

You are referring to the sub-vector sizes, if i am understanding correctly. I'd assume that the mask sub-vector length always has to be either 1 or the same as the data sub-vector length. For example, this is ok:

%result = call <scalable 3 x float> @llvm.evl.fsub.v4f32(<scalable 3 x_ _float> %x, <scalable 3 x float> %y, <scalable 1 x i1> %M, i32 %L)

What does <scalable 1 x i1> applied to <scalable 3 x float> mean? I would expect a requirement of <scalable 3 x i1>. At least that's how I understood the SVE proposal [1]. The n's in have to match. It would mean that the each mask bit M[i] applies to data lanes D[3i] to D[3i+2]. It has applications in graphics codes where the vector element type would be a short vector as in [2]: for(int i = 0; i < 1000; i++)_ _{_ _vec4 color = colors[i]; // <scalable 4 x float>  vec3 normal = normals[i]; // <scalable 3 x float> color.rgb *= fmax(0.0, dot(normal, lightdir)); colors[i] = color; }

Ok, thanks. The notation seems ambiguous to me. With SVE we have types like <scalable 4 x float>. I would expect a scalable "vector of vectors" type to be something like <scalable 1 x <3 x float>>, where "1" could take on various values, for example <scalable 4 x <3 x float>>, indicating the vector is at least 4 short vectors long. So in the example:

%result = call <scalable 1 x <3 x float>> @llvm.evl.fsub.v4f32( <scalable 1 x <3 x float>> %x, <scalable 1 x <3 x float>> %y, <scalable 1 x i1> %M, i32 %L)

Does this make sense?

                            -David


More information about the llvm-dev mailing list