[PATCH] D28550: [X86][AVX512] Fix PR31515 - Do not flip vselect condition if it's not a vXi1 mask
Elad Cohen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 11 02:29:14 PST 2017
eladcohen created this revision.
eladcohen added reviewers: igorb, m_zuckerman, craig.topper, RKSimon.
eladcohen added subscribers: llvm-commits, zvi, aymanmus, gadi.haber, guyblank.
r289653 added a case where
vselect <cond> <vector1> <all-zeros>
is transformed to:
vselect xor(cond, DAG.getConstant(1, DL, Cond.getValueType())) <all-zeros> <vector1>
This was not aimed to catch cases where Cond is not a vXi1 mask but it does (e.g. happens on KNL for select <16 x i1>). Moreover, when Cond type is VxiN (N > 1) then xor(cond, DAG.getConstant(1, DL, Cond.getValueType())) != NOT(cond).
This patch changes the above to xor with allones, and avoids entering the case for non-mask Conds.
https://reviews.llvm.org/D28550
Files:
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/avx512-select.ll
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -28742,17 +28742,20 @@
if (N->getOpcode() != ISD::VSELECT)
return SDValue();
+ assert(CondVT.isVector() && "Vector select expects a vector selector!");
+
bool FValIsAllZeros = ISD::isBuildVectorAllZeros(LHS.getNode());
- // Check if the first operand is all zeros.This situation only
- // applies to avx512.
- if (FValIsAllZeros && Subtarget.hasAVX512() && Cond.hasOneUse()) {
+ // Check if the first operand is all zeros and Cond type is vXi1.
+ // This situation only applies to avx512.
+ if (FValIsAllZeros && Subtarget.hasAVX512() && Cond.hasOneUse() &&
+ CondVT.getVectorElementType() == MVT::i1) {
//Invert the cond to not(cond) : xor(op,allones)=not(op)
SDValue CondNew = DAG.getNode(ISD::XOR, DL, Cond.getValueType(), Cond,
- DAG.getConstant(1, DL, Cond.getValueType()));
+ DAG.getConstant(APInt::getAllOnesValue(CondVT.getScalarSizeInBits()),
+ DL, CondVT));
//Vselect cond, op1, op2 = Vselect not(cond), op2, op1
return DAG.getNode(ISD::VSELECT, DL, VT, CondNew, RHS, LHS);
}
- assert(CondVT.isVector() && "Vector select expects a vector selector!");
// To use the condition operand as a bitwise mask, it must have elements that
// are the same size as the select elements. Ie, the condition operand must
Index: test/CodeGen/X86/avx512-select.ll
===================================================================
--- test/CodeGen/X86/avx512-select.ll
+++ test/CodeGen/X86/avx512-select.ll
@@ -179,3 +179,22 @@
%cond = select i1 %c, float %a, float %b
ret float %cond
}
+
+define <16 x i16> @pr31515(<16 x i1> %a, <16 x i1> %b, <16 x i16> %c) nounwind {
+; CHECK-LABEL: pr31515:
+; CHECK: ## BB#0:
+; CHECK-NEXT: vpmovsxbd %xmm1, %zmm1
+; CHECK-NEXT: vpslld $31, %zmm1, %zmm1
+; CHECK-NEXT: vpmovsxbd %xmm0, %zmm0
+; CHECK-NEXT: vpslld $31, %zmm0, %zmm0
+; CHECK-NEXT: vptestmd %zmm0, %zmm0, %k1
+; CHECK-NEXT: vptestmd %zmm1, %zmm1, %k1 {%k1}
+; CHECK-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; CHECK-NEXT: vpmovdw %zmm0, %ymm0
+; CHECK-NEXT: vpandn %ymm2, %ymm0, %ymm0
+; CHECK-NEXT: retq
+ %mask = and <16 x i1> %a, %b
+ %res = select <16 x i1> %mask, <16 x i16> zeroinitializer, <16 x i16> %c
+ ret <16 x i16> %res
+}
+
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28550.83929.patch
Type: text/x-patch
Size: 2488 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170111/fcb9139d/attachment.bin>
More information about the llvm-commits
mailing list