[PATCH] D47025: [X86] Directly legalize v16i16/v8i16 vselect to vXi8 vselect to use VPBLENDVB
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 17 12:26:12 PDT 2018
craig.topper created this revision.
craig.topper added reviewers: spatel, RKSimon.
The intrinsic legalization for masked truncate uses ISD::TRUNCATE which can be constant folded by getNode. This prevents getVectorMaskingNode from seeing the ISD::TRUNCATE special case where it should emit X86ISD::SELECT instead of ISD::VSELECT. This causes a vselect with a v16i1 or v8i1 condition to be emitted during vector legalization. but vector legalization doesn't revisit nodes it creates. DAG combine will then promote this condition to match the result type. Then op legalization will try to legalize it, but the custom lowering hook returned SDValue(). But op legalization doesn't have an Expand for VSELECT because it expects vector legalization to have taken care of it. So the operation sticks around and fails in isel.
This patch adds a custom legalization hook to morph it to a vXi8 vselect instead.
This also simplifies the normal vXi16 vselect handling because vector legalization was normally expanding to AND/ANDN/OR and DAG combine was turning that into VBLENDVB. So we can skip a step by doing it directly.
Fixes PR37499
https://reviews.llvm.org/D47025
Files:
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/pr37499.ll
Index: test/CodeGen/X86/pr37499.ll
===================================================================
--- /dev/null
+++ test/CodeGen/X86/pr37499.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-- -mattr=avx512vl | FileCheck %s
+
+define <2 x i64> @foo() {
+; CHECK-LABEL: foo:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vmovdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1]
+; CHECK-NEXT: movb $1, %al
+; CHECK-NEXT: kmovw %eax, %k1
+; CHECK-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; CHECK-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z}
+; CHECK-NEXT: vpmovdw %ymm1, %xmm1
+; CHECK-NEXT: vpblendvb %xmm1, %xmm0, %xmm0, %xmm0
+; CHECK-NEXT: vzeroupper
+; CHECK-NEXT: retq
+ %1 = tail call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> undef, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, i8 1) #3
+ %2 = bitcast <8 x i16> %1 to <2 x i64>
+ ret <2 x i64> %2
+}
+
+define <4 x i64> @goo() {
+; CHECK-LABEL: goo:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vmovdqa {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
+; CHECK-NEXT: movw $1, %ax
+; CHECK-NEXT: kmovw %eax, %k1
+; CHECK-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
+; CHECK-NEXT: vpmovdw %zmm1, %ymm1
+; CHECK-NEXT: vpblendvb %ymm1, %ymm0, %ymm0, %ymm0
+; CHECK-NEXT: retq
+ %1 = tail call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> undef, <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, i16 1) #3
+ %2 = bitcast <16 x i16> %1 to <4 x i64>
+ ret <4 x i64> %2
+}
+
+declare <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64>, <8 x i16>, i8)
+declare <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32>, <16 x i16>, i16)
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -15032,10 +15032,15 @@
return SDValue();
case MVT::v8i16:
- case MVT::v16i16:
- // FIXME: We should custom lower this by fixing the condition and using i8
- // blends.
- return SDValue();
+ case MVT::v16i16: {
+ // Bitcast everything to the vXi8 type and use a vXi8 vselect.
+ MVT CastVT = MVT::getVectorVT(MVT::i8, VT.getVectorNumElements() * 2);
+ SDValue Cond = DAG.getBitcast(CastVT, Op->getOperand(0));
+ SDValue LHS = DAG.getBitcast(CastVT, Op->getOperand(1));
+ SDValue RHS = DAG.getBitcast(CastVT, Op->getOperand(2));
+ SDValue Select = DAG.getNode(ISD::VSELECT, dl, CastVT, Cond, LHS, RHS);
+ return DAG.getBitcast(VT, Select);
+ }
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47025.147369.patch
Type: text/x-patch
Size: 2705 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180517/e1615ab9/attachment.bin>
More information about the llvm-commits
mailing list