[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