[llvm-dev] [RFC][SVE] Supporting SIMD instruction sets with variable vector lengths
via llvm-dev
llvm-dev at lists.llvm.org
Tue Jun 5 10:38:36 PDT 2018
Renato Golin <renato.golin at linaro.org> writes:
>> This is another case where an Instruction might be better, for the same
>> reasons as with vscale.
>
> This is a side-effect of the original RFC a few years ago. The general
> feeling was that we can start with intrinsics and, if they work, we
> change the IR.
>
> We can have a work-in-progress implementation before fully committing
> SCEV and other more core ideas in, and then slowly, and with more
> certainty, move where it makes more sense.
Ok, that makes sense. I do think the goal should be making these proper
Instructions.
>> Also, "iota" is the name Cray has traditionally used for this operation
>> as it is the mathematical name for the concept. It's also used by C++
>> and go and so should be familiar to many people.
>
> That sounds better, but stepvector is more than C++'s iota and it's
> just a plain scalar evolution sequence like {start, op, step}. In
> C++'s iota (AFAICS), the step is always 1.
I thought stepvector was also always step one, as Graham states a
multiply by a constant splat must be used for other step values.
> Anyway, I don't mind any name, really. Whatever is more mnemonic.
Me neither. I was simply noting some of the history surrounding the
operation and naming in other familiar places.
>> ;; Create sequence for scalable vector
>> %stepvector = call <scalable 4 x i32> @llvm.experimental.vector.stepvector.nxv4i32()
>> %mulbystride = mul <scalable 4 x i32> %stepvector, %str_off
>> %addoffset = add <scalable 4 x i32> %mulbystride, %str_off
>
> Once stepvetor (or iota) becomes a proper IR instruction, I'd like to
> see this restricted to inlined syntax. The sequence { step*vec +
> offset } only makes sense in the scalable context and the intermediate
> results should not be used elsewhere.
I'm not so sure. iota is a generally useful operation and scaling it to
various step values is also useful. It's used often for strided memory
access, which would be done via gather/scatter in LLVM but generating a
vector GEP via stepvector would be convenient and convey more semantic
information than, say, loading a constant vector of indices to feed the
GEP.
-David
More information about the llvm-dev
mailing list