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

Sanjay Patel via llvm-dev llvm-dev at lists.llvm.org
Sun Aug 28 12:37:47 PDT 2016


A vector select with a constant vector condition operand:

define <4 x i32> @foo(<4 x i32> %a, <4 x i32> %b) {
  %sel = select <4 x i1> <i1 true, i1 false, i1 false, i1 true>, <4 x i32>
%a, <4 x i32> %b
  ret <4 x i32> %sel
}


...is equivalent to a shufflevector:

define <4 x i32> @goo(<4 x i32> %a, <4 x i32> %b) {
  %shuf = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32
5, i32 6, i32 3>
  ret <4 x i32> %shuf
}


For the goal of canonicalization in IR, which of these should we prefer?
Some backend / lowering differences for AArch64 and PPC are noted in:
https://llvm.org/bugs/show_bug.cgi?id=28530
https://llvm.org/bugs/show_bug.cgi?id=28531

x86 converts either form optimally in all cases I've looked at.

This question first came up in D22114 ( https://reviews.llvm.org/D22114 )
and is extended in D23886 ( https://reviews.llvm.org/D23886 ) with a
constant value example.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160828/87f526c2/attachment.html>


More information about the llvm-dev mailing list