[x86] improve codegen for non-splat bit-masked vector compare and select (PR46531)
authorSanjay Patel <spatel@rotateright.com>
Wed, 8 Jul 2020 12:20:49 +0000 (08:20 -0400)
committerSanjay Patel <spatel@rotateright.com>
Wed, 8 Jul 2020 12:20:49 +0000 (08:20 -0400)
commit91149002872f968673c8f01f641dfe11dc4a4d7c
treee9b658f74e40cd850f50144786bf165b9ac1dcdf
parent9c31da853855eb952bbad98b99978df8c515e9b2
[x86] improve codegen for non-splat bit-masked vector compare and select (PR46531)

vselect ((X & Pow2C) == 0), LHS, RHS --> vselect ((shl X, C') < 0), RHS, LHS

Follow-up to D83073 - the non-splat mask cases where we actually see an
improvement are quite limited from what I can tell. AVX1 needs multiply
and blend capabilities and AVX2 needs vector shift and blend capabilities.
The intersection of those 2 constraints is only vectors with 32-bit or
64-bit elements.

XOP is/was better.

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