[x86] fold vector (X > -1) & Y to shift+andn (2nd try)
authorSanjay Patel <spatel@rotateright.com>
Mon, 15 Nov 2021 15:47:11 +0000 (10:47 -0500)
committerSanjay Patel <spatel@rotateright.com>
Mon, 15 Nov 2021 16:09:32 +0000 (11:09 -0500)
commit3d01507c2dec61121a1efcc84d3a2328ffc651cd
tree296ff2787204822289f7e8d3b96ec9c43a806fea
parent6efe64cf9f11b41f4b8b5b882f3402e5d32ba61e
[x86] fold vector (X > -1) & Y to shift+andn (2nd try)

The first try at this patch ( bf5748a1af0d ) was reverted ( 5be64d416481 )
because it could crash. The cause of that problem was failing to account
for the optional peek-through-bitcast in the enclosing function.

This version of the patch adds a clause to avoid the fold in case of
bitcasts because it is unlikely to be profitable in that scenario.

A test case based on https://llvm.org/PR52504 was added to make sure
we don't have that problem again.

Original commit message:

and (pcmpgt X, -1), Y --> pandn (vsrai X, BitWidth-1), Y

This avoids the -1 constant vector in favor of an arithmetic shift
instruction if it exists (the ISA is still not complete after all
these years...).

We catch this pattern late in combining by matching PCMPGT, so it
should not interfere with more general folds.

Differential Revision: https://reviews.llvm.org/D113603
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/vector-pcmp.ll
llvm/test/CodeGen/X86/vselect-zero.ll