aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2024-03-10 16:23:51 +0000
committerTom Stellard <tstellar@redhat.com>2024-03-12 22:30:11 -0700
commitfcc33dca02d1f22d3dad5c4558ddff4926aef9d9 (patch)
tree14ecdacc3ed70ef23d65a35a0820b004d4a4638d
parent39e3ba8a383e05af376d613594373c482f72bb3e (diff)
downloadllvm-fcc33dca02d1f22d3dad5c4558ddff4926aef9d9.zip
llvm-fcc33dca02d1f22d3dad5c4558ddff4926aef9d9.tar.gz
llvm-fcc33dca02d1f22d3dad5c4558ddff4926aef9d9.tar.bz2
[X86] combineAndShuffleNot - ensure the type is legal before create X86ISD::ANDNP target nodes
Fixes #84660 (cherry picked from commit 862c7e0218f27b55a5b75ae59a4f73cd4610448d)
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp11
-rw-r--r--llvm/test/CodeGen/X86/combine-and.ll19
2 files changed, 28 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a071c5a..9e64726 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47878,6 +47878,7 @@ static SDValue combineAndShuffleNot(SDNode *N, SelectionDAG &DAG,
SDValue X, Y;
SDValue N0 = N->getOperand(0);
SDValue N1 = N->getOperand(1);
+ const TargetLowering &TLI = DAG.getTargetLoweringInfo();
if (SDValue Not = GetNot(N0)) {
X = Not;
@@ -47891,9 +47892,11 @@ static SDValue combineAndShuffleNot(SDNode *N, SelectionDAG &DAG,
X = DAG.getBitcast(VT, X);
Y = DAG.getBitcast(VT, Y);
SDLoc DL(N);
+
// We do not split for SSE at all, but we need to split vectors for AVX1 and
// AVX2.
- if (!Subtarget.useAVX512Regs() && VT.is512BitVector()) {
+ if (!Subtarget.useAVX512Regs() && VT.is512BitVector() &&
+ TLI.isTypeLegal(VT.getHalfNumVectorElementsVT(*DAG.getContext()))) {
SDValue LoX, HiX;
std::tie(LoX, HiX) = splitVector(X, DAG, DL);
SDValue LoY, HiY;
@@ -47903,7 +47906,11 @@ static SDValue combineAndShuffleNot(SDNode *N, SelectionDAG &DAG,
SDValue HiV = DAG.getNode(X86ISD::ANDNP, DL, SplitVT, {HiX, HiY});
return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, {LoV, HiV});
}
- return DAG.getNode(X86ISD::ANDNP, DL, VT, {X, Y});
+
+ if (TLI.isTypeLegal(VT))
+ return DAG.getNode(X86ISD::ANDNP, DL, VT, {X, Y});
+
+ return SDValue();
}
// Try to widen AND, OR and XOR nodes to VT in order to remove casts around
diff --git a/llvm/test/CodeGen/X86/combine-and.ll b/llvm/test/CodeGen/X86/combine-and.ll
index d223b75..294fcd6 100644
--- a/llvm/test/CodeGen/X86/combine-and.ll
+++ b/llvm/test/CodeGen/X86/combine-and.ll
@@ -1171,6 +1171,25 @@ define <4 x i32> @neg_scalar_broadcast_two_uses(i32 %a0, <4 x i32> %a1, ptr %a2)
ret <4 x i32> %4
}
+; PR84660 - check for illegal types
+define <2 x i128> @neg_scalar_broadcast_illegaltype(i128 %arg) {
+; CHECK-LABEL: neg_scalar_broadcast_illegaltype:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movq %rdi, %rax
+; CHECK-NEXT: notl %esi
+; CHECK-NEXT: andl $1, %esi
+; CHECK-NEXT: movq %rsi, 16(%rdi)
+; CHECK-NEXT: movq %rsi, (%rdi)
+; CHECK-NEXT: movq $0, 24(%rdi)
+; CHECK-NEXT: movq $0, 8(%rdi)
+; CHECK-NEXT: retq
+ %i = xor i128 %arg, 1
+ %i1 = insertelement <2 x i128> zeroinitializer, i128 %i, i64 0
+ %i2 = shufflevector <2 x i128> %i1, <2 x i128> zeroinitializer, <2 x i32> zeroinitializer
+ %i3 = and <2 x i128> <i128 1, i128 1>, %i2
+ ret <2 x i128> %i3
+}
+
define <2 x i64> @andnp_xx(<2 x i64> %v0) nounwind {
; SSE-LABEL: andnp_xx:
; SSE: # %bb.0: