[llvm-dev] array fill idioms

Bagel via llvm-dev llvm-dev at lists.llvm.org
Thu Nov 10 13:25:43 PST 2016


I am asking for some collective wisdom/guidance.

What sort of IR construct should one use to implement filling each
element in an array (or vector) with the same value?  In C++, this
might arise in "std:fill" or "std:fill_n", when the element values in the
vector are identical.
In the D language, one can fill an array or a slice of an array
by an assignment, e.g.
  "A[2..10] = 42;"

1. What I would prefer is an explicit intrinsic, call it "llvm.fill.*" that
   would work similar to the "llvm.memset.*" intrinsic.  The memset intrinsic
   only works with byte arrays, but provides wonderful optimizations in the
   various code generators.  Hopefully, these similar optimizations would be
   implemented for "llvm.fill.*".

2. Given that I probably won't get my wish, I note that some front-ends use
   vector assignment:
   store <8 x i16> <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16
42>, <8 x i16>* %14, align 2
   Does this work well for architectures without SIMD?
   What chunk size should be used for the vector, and is that architecture
   dependent?

3. If vectors are not used, but rather an explicit loop of stores,
   element-by-element, will this be recognized as an idiom for
   architecture-dependent optimizations?

Thanks in advance.


More information about the llvm-dev mailing list