[llvm-dev] IR canonicalization: shufflevector or vector trunc?

Sanjay Patel via llvm-dev llvm-dev at lists.llvm.org
Thu Jan 12 09:04:48 PST 2017

It's time for another round of "What is the canonical IR?"

Credit for this episode to Zvi and PR31551. :)

define <4 x i16> @shuffle(<16 x i16> %x) {
  %shuf = shufflevector <16 x i16> %x, <16 x i16> undef, <4 x i32>
<i32 0, i32 4, i32 8, i32 12>
  ret <4 x i16> %shuf

define <4 x i16> @trunc(<16 x i16> %x) {
  %bc = bitcast <16 x i16> %x to <4 x i64>
  %tr = trunc <4 x i64> %bc to <4 x i16>
  ret <4 x i16> %tr

Potential reasons to prefer one or the other:
1. Shuffle is the most compact.
2. Trunc is easier to read.
3. One of these is easier for value tracking.
4. Compatibility with existing IR transforms (eg, InterleavedAccess
recognizes the shuffle form).
5. We don't create arbitrary shuffle masks in IR because that's bad for a
lot of targets (but maybe this mask pattern should always be recognized as
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170112/feacca26/attachment.html>

More information about the llvm-dev mailing list