[llvm-dev] [RFC] Introduce a new stepvector operation
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Thu Jan 21 12:19:49 PST 2021
Just a thought on another approach.
Unless I'm missing something, a step vector is simply a prefix sum over
a constant vector. Do we have clean ways with scalable vectors of
representing those concepts? If we do, we don't need a separate
intrinsic. If we don't, we probably need them anyways?
Slightly more specifically:
allones = broadcast 0
sum = prefix_sum allones
stepvec = sum - allones
Out of those, the only tricky one is the prefix sum. Have we explored that?
Philip
On 1/20/21 8:03 AM, David Sherwood via llvm-dev wrote:
>
> Hi,
>
> As part of adding support for scalable vectorization we need to update
> llvm::InnerLoopVectorizer::getStepVector for scalable vectors.
> Currently this just returns a constant vector with the sequence <0, 1,
> 2, 3, ..>, however this assumes we are using fixed length vectors. For
> scalable vectors we need an operation that does the same thing, but
> without having to explicitly initalise all the elements. Any new
> stepvector operation we provide could also be used for fixed length
> vectors too if desired.
>
> I believe the desirable properties of the operation should be:
>
> 1. The operation requires no arguments and simply returns a vector
> with the numeric sequence <0, 1, 2, …>
>
> 2. For types with a large number of elements, e.g. <vscale x 32 x i8>
> (vscale = 16), there is the possibility of the sequence value
> exceeding the limit of the type midway through the vector. In such
> cases we define the operation such that those elements are undefined
> or poison values.
>
> A simple ‘stepvector’ operation (however we choose to implement it)
> with the properties described above can then be used together with
> additional ‘mul’ and ‘add’ instructions to create any arbitrary linear
> sequence, i.e. <0, 2, 4, 6, …> or <1, 3, 5, 7, …>
>
> The first possible implementation with the properties as described
> above involves using a new llvm.stepvector() intrinsic with no
> arguments that simply returns a vector sequence <0, 1, 2, …> of the
> requested type, i.e.
>
> declare <vscale x 4 x i32> @llvm.stepvector.nxv4i32()
>
> Introducing a new intrinsic is simple to implement and we can easily
> come up with an appropriate cost model – cheap for fixed width vectors
> or scalable vectors using SVE where we have the ‘index’ instruction.
>
> However, since such an intrinsic is effectively returning a constant
> vector sequence we could instead implement it using a new ‘stepvector’
> constant in a similar way to how ‘zeroinitializer’ works. This would
> be done using a new ConstantStepVector class similar to
> ConstantAggregateZero and would return a vector with the numeric
> sequence <0, 1, 2, …>. The main advantages of using a constant over an
> intrinsic are:
>
> 1. It is easy to write tests in LLVM IR since ‘stepvector’ would work
> in the same way as ‘zeroinitializer’, i.e. “%1 = add <4 x i32> %0,
> stepvector”
>
> 2. Creation of the node is easy with the simple interface:
>
> static Constant *ConstantStepVector::get(Type Ty)
>
> 3. It is easy to do optimisations, e.g. CSE, and pattern matching in IR.
>
> The main disadvantages are:
>
> 1. A scalable constant cannot be represented as well in the .data
> section, although we can still create a constant based on the
> architectural maximum for vscale. It’s worth pointing out that this
> problem also exists for zeroinitializer too – we’re just more likely
> to have cheap instructions to do the job.
>
> 2. Harder to fit into the cost model due to it being a constant.
>
> 3. There are some concerns that we might then have to support
> stepvector as a constant in the shufflevector operation too and that
> it should be restricted to zeroinitializer only.
>
> Any thoughts or feedback you have would be much appreciated!
>
> Kind Regards,
>
> David Sherwood.
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210121/f43fc76f/attachment.html>
More information about the llvm-dev
mailing list