mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[X86] combineAndShuffleNot - ensure the type is legal before create X86ISD::ANDNP target nodes
Fixes #84660 (cherry picked from commit 862c7e0218f27b55a5b75ae59a4f73cd4610448d)
This commit is contained in:
parent
39e3ba8a38
commit
fcc33dca02
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user