Skip to content

Commit b0b3f82

Browse files
committed
Revert "[X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero"
This reverts commit 239ab16. This causes crashes when compiling chromium with asan, attached reduced ir at: https://reviews.llvm.org/rG239ab16ec1213749a2228368298519b377d336bb#124559
1 parent c5dee18 commit b0b3f82

File tree

5 files changed

+63
-46
lines changed

5 files changed

+63
-46
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -53470,7 +53470,6 @@ static SDValue combineCMP(SDNode *N, SelectionDAG &DAG,
5347053470
SDLoc dl(N);
5347153471
SDValue Op = N->getOperand(0);
5347253472
EVT VT = Op.getValueType();
53473-
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
5347453473

5347553474
// If we have a constant logical shift that's only used in a comparison
5347653475
// against zero turn it into an equivalent AND. This allows turning it into
@@ -53494,41 +53493,12 @@ static SDValue combineCMP(SDNode *N, SelectionDAG &DAG,
5349453493
}
5349553494
}
5349653495

53497-
// If we're extracting from a avx512 bool vector and comparing against zero,
53498-
// then try to just bitcast the vector to an integer to use TEST/BT directly.
53499-
// (and (extract_elt (kshiftr vXi1, C), 0), 1) -> (and (bc vXi1), 1<<C)
53500-
if (Op.getOpcode() == ISD::AND && isOneConstant(Op.getOperand(1)) &&
53501-
Op.hasOneUse() && onlyZeroFlagUsed(SDValue(N, 0))) {
53502-
SDValue Src = Op.getOperand(0);
53503-
if (Src.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
53504-
isNullConstant(Src.getOperand(1)) &&
53505-
Src.getOperand(0).getValueType().getScalarType() == MVT::i1) {
53506-
SDValue BoolVec = Src.getOperand(0);
53507-
unsigned ShAmt = 0;
53508-
if (BoolVec.getOpcode() == X86ISD::KSHIFTR) {
53509-
ShAmt = BoolVec.getConstantOperandVal(1);
53510-
BoolVec = BoolVec.getOperand(0);
53511-
}
53512-
BoolVec = widenMaskVector(BoolVec, false, Subtarget, DAG, dl);
53513-
EVT VecVT = BoolVec.getValueType();
53514-
unsigned BitWidth = VecVT.getVectorNumElements();
53515-
EVT BCVT = EVT::getIntegerVT(*DAG.getContext(), BitWidth);
53516-
if (TLI.isTypeLegal(VecVT) && TLI.isTypeLegal(BCVT)) {
53517-
APInt Mask = APInt::getOneBitSet(BitWidth, ShAmt);
53518-
Op = DAG.getBitcast(BCVT, BoolVec);
53519-
Op = DAG.getNode(ISD::AND, dl, BCVT, Op,
53520-
DAG.getConstant(Mask, dl, BCVT));
53521-
return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op,
53522-
DAG.getConstant(0, dl, VT));
53523-
}
53524-
}
53525-
}
53526-
5352753496
// Peek through any zero-extend if we're only testing for a zero result.
5352853497
if (Op.getOpcode() == ISD::ZERO_EXTEND && onlyZeroFlagUsed(SDValue(N, 0))) {
5352953498
SDValue Src = Op.getOperand(0);
5353053499
EVT SrcVT = Src.getValueType();
53531-
if (SrcVT.getScalarSizeInBits() >= 8 && TLI.isTypeLegal(SrcVT))
53500+
if (SrcVT.getScalarSizeInBits() >= 8 &&
53501+
DAG.getTargetLoweringInfo().isTypeLegal(SrcVT))
5353253502
return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Src,
5353353503
DAG.getConstant(0, dl, SrcVT));
5353453504
}

llvm/test/CodeGen/X86/avx512-insert-extract.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,9 @@ define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) nounwind {
175175
; KNL-LABEL: test11:
176176
; KNL: ## %bb.0:
177177
; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0
178+
; KNL-NEXT: kshiftrw $4, %k0, %k0
178179
; KNL-NEXT: kmovw %k0, %eax
179-
; KNL-NEXT: testb $16, %al
180+
; KNL-NEXT: testb $1, %al
180181
; KNL-NEXT: je LBB10_2
181182
; KNL-NEXT: ## %bb.1: ## %A
182183
; KNL-NEXT: vmovdqa64 %zmm1, %zmm0
@@ -188,8 +189,9 @@ define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) nounwind {
188189
; SKX-LABEL: test11:
189190
; SKX: ## %bb.0:
190191
; SKX-NEXT: vpcmpltud %zmm1, %zmm0, %k0
192+
; SKX-NEXT: kshiftrw $4, %k0, %k0
191193
; SKX-NEXT: kmovd %k0, %eax
192-
; SKX-NEXT: testb $16, %al
194+
; SKX-NEXT: testb $1, %al
193195
; SKX-NEXT: je LBB10_2
194196
; SKX-NEXT: ## %bb.1: ## %A
195197
; SKX-NEXT: vmovdqa64 %zmm1, %zmm0
@@ -274,8 +276,9 @@ define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) nounwind {
274276
; KNL: ## %bb.0:
275277
; KNL-NEXT: movq %rdi, %rax
276278
; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0
279+
; KNL-NEXT: kshiftrw $4, %k0, %k0
277280
; KNL-NEXT: kmovw %k0, %ecx
278-
; KNL-NEXT: testb $16, %cl
281+
; KNL-NEXT: testb $1, %cl
279282
; KNL-NEXT: cmoveq %rsi, %rax
280283
; KNL-NEXT: vzeroupper
281284
; KNL-NEXT: retq
@@ -284,8 +287,9 @@ define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) nounwind {
284287
; SKX: ## %bb.0:
285288
; SKX-NEXT: movq %rdi, %rax
286289
; SKX-NEXT: vpcmpgtq %zmm0, %zmm1, %k0
290+
; SKX-NEXT: kshiftrb $4, %k0, %k0
287291
; SKX-NEXT: kmovd %k0, %ecx
288-
; SKX-NEXT: testb $16, %cl
292+
; SKX-NEXT: testb $1, %cl
289293
; SKX-NEXT: cmoveq %rsi, %rax
290294
; SKX-NEXT: vzeroupper
291295
; SKX-NEXT: retq

llvm/test/CodeGen/X86/movmsk-cmp.ll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4350,8 +4350,14 @@ define i32 @PR39665_c_ray(<2 x double> %x, <2 x double> %y) {
43504350
; KNL-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
43514351
; KNL-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
43524352
; KNL-NEXT: vcmpltpd %zmm0, %zmm1, %k0
4353+
; KNL-NEXT: kshiftrw $1, %k0, %k1
4354+
; KNL-NEXT: kmovw %k1, %eax
43534355
; KNL-NEXT: kmovw %k0, %ecx
4356+
<<<<<<< HEAD
43544357
; KNL-NEXT: testb $2, %cl
4358+
=======
4359+
; KNL-NEXT: testb $1, %al
4360+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
43554361
; KNL-NEXT: movl $42, %eax
43564362
; KNL-NEXT: movl $99, %edx
43574363
; KNL-NEXT: cmovel %edx, %eax
@@ -4363,8 +4369,14 @@ define i32 @PR39665_c_ray(<2 x double> %x, <2 x double> %y) {
43634369
; SKX-LABEL: PR39665_c_ray:
43644370
; SKX: # %bb.0:
43654371
; SKX-NEXT: vcmpltpd %xmm0, %xmm1, %k0
4372+
; SKX-NEXT: kshiftrb $1, %k0, %k1
4373+
; SKX-NEXT: kmovd %k1, %eax
43664374
; SKX-NEXT: kmovd %k0, %ecx
4375+
<<<<<<< HEAD
43674376
; SKX-NEXT: testb $2, %cl
4377+
=======
4378+
; SKX-NEXT: testb $1, %al
4379+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
43684380
; SKX-NEXT: movl $42, %eax
43694381
; SKX-NEXT: movl $99, %edx
43704382
; SKX-NEXT: cmovel %edx, %eax

llvm/test/CodeGen/X86/pr33349.ll

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,36 @@ target triple = "x86_64-unknown-linux-gnu"
1111
; KNL-NEXT: vpslld $31, %xmm0, %xmm0
1212
; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0
1313
; KNL-NEXT: kshiftrw $2, %k0, %k1
14+
; KNL-NEXT: kshiftrw $1, %k1, %k2
1415
; KNL-NEXT: kmovw %k1, %eax
1516
; KNL-NEXT: testb $1, %al
1617
; KNL-NEXT: fld1
1718
; KNL-NEXT: fldz
1819
; KNL-NEXT: fld %st(0)
1920
; KNL-NEXT: fcmovne %st(2), %st
20-
; KNL-NEXT: testb $2, %al
21+
; KNL-NEXT: kmovw %k2, %eax
22+
; KNL-NEXT: testb $1, %al
2123
; KNL-NEXT: fld %st(1)
2224
; KNL-NEXT: fcmovne %st(3), %st
25+
<<<<<<< HEAD
2326
; KNL-NEXT: kmovw %k0, %eax
27+
=======
28+
; KNL-NEXT: kshiftrw $1, %k0, %k1
29+
; KNL-NEXT: kmovw %k1, %eax
30+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
2431
; KNL-NEXT: testb $1, %al
2532
; KNL-NEXT: fld %st(2)
2633
; KNL-NEXT: fcmovne %st(4), %st
27-
; KNL-NEXT: testb $2, %al
34+
; KNL-NEXT: kmovw %k0, %eax
35+
; KNL-NEXT: testb $1, %al
2836
; KNL-NEXT: fxch %st(3)
2937
; KNL-NEXT: fcmovne %st(4), %st
3038
; KNL-NEXT: fstp %st(4)
3139
; KNL-NEXT: fxch %st(3)
32-
; KNL-NEXT: fstpt 10(%rdi)
33-
; KNL-NEXT: fxch %st(1)
3440
; KNL-NEXT: fstpt (%rdi)
3541
; KNL-NEXT: fxch %st(1)
42+
; KNL-NEXT: fstpt 10(%rdi)
43+
; KNL-NEXT: fxch %st(1)
3644
; KNL-NEXT: fstpt 30(%rdi)
3745
; KNL-NEXT: fstpt 20(%rdi)
3846
; KNL-NEXT: vzeroupper
@@ -43,28 +51,36 @@ target triple = "x86_64-unknown-linux-gnu"
4351
; SKX-NEXT: vpslld $31, %xmm0, %xmm0
4452
; SKX-NEXT: vpmovd2m %xmm0, %k0
4553
; SKX-NEXT: kshiftrb $2, %k0, %k1
54+
; SKX-NEXT: kshiftrb $1, %k1, %k2
4655
; SKX-NEXT: kmovd %k1, %eax
4756
; SKX-NEXT: testb $1, %al
4857
; SKX-NEXT: fld1
4958
; SKX-NEXT: fldz
5059
; SKX-NEXT: fld %st(0)
5160
; SKX-NEXT: fcmovne %st(2), %st
52-
; SKX-NEXT: testb $2, %al
61+
; SKX-NEXT: kmovd %k2, %eax
62+
; SKX-NEXT: testb $1, %al
5363
; SKX-NEXT: fld %st(1)
5464
; SKX-NEXT: fcmovne %st(3), %st
65+
<<<<<<< HEAD
5566
; SKX-NEXT: kmovd %k0, %eax
67+
=======
68+
; SKX-NEXT: kshiftrb $1, %k0, %k1
69+
; SKX-NEXT: kmovd %k1, %eax
70+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
5671
; SKX-NEXT: testb $1, %al
5772
; SKX-NEXT: fld %st(2)
5873
; SKX-NEXT: fcmovne %st(4), %st
59-
; SKX-NEXT: testb $2, %al
74+
; SKX-NEXT: kmovd %k0, %eax
75+
; SKX-NEXT: testb $1, %al
6076
; SKX-NEXT: fxch %st(3)
6177
; SKX-NEXT: fcmovne %st(4), %st
6278
; SKX-NEXT: fstp %st(4)
6379
; SKX-NEXT: fxch %st(3)
64-
; SKX-NEXT: fstpt 10(%rdi)
65-
; SKX-NEXT: fxch %st(1)
6680
; SKX-NEXT: fstpt (%rdi)
6781
; SKX-NEXT: fxch %st(1)
82+
; SKX-NEXT: fstpt 10(%rdi)
83+
; SKX-NEXT: fxch %st(1)
6884
; SKX-NEXT: fstpt 30(%rdi)
6985
; SKX-NEXT: fstpt 20(%rdi)
7086
; SKX-NEXT: retq

llvm/test/CodeGen/X86/pr34177.ll

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,35 @@ define void @test(<4 x i64> %a, <4 x x86_fp80> %b, ptr %c) local_unnamed_addr {
4949
; AVX512VL-LABEL: test:
5050
; AVX512VL: # %bb.0:
5151
; AVX512VL-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k0
52+
<<<<<<< HEAD
5253
; AVX512VL-NEXT: kshiftrb $2, %k0, %k1
5354
; AVX512VL-NEXT: kmovd %k0, %eax
5455
; AVX512VL-NEXT: testb $2, %al
56+
=======
57+
; AVX512VL-NEXT: kshiftrb $1, %k0, %k1
58+
; AVX512VL-NEXT: kshiftrb $2, %k0, %k2
59+
; AVX512VL-NEXT: kmovd %k0, %eax
60+
; AVX512VL-NEXT: testb $1, %al
61+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
5562
; AVX512VL-NEXT: fld1
5663
; AVX512VL-NEXT: fldz
5764
; AVX512VL-NEXT: fld %st(0)
5865
; AVX512VL-NEXT: fcmovne %st(2), %st
66+
; AVX512VL-NEXT: kmovd %k1, %eax
5967
; AVX512VL-NEXT: testb $1, %al
6068
; AVX512VL-NEXT: fld %st(1)
6169
; AVX512VL-NEXT: fcmovne %st(3), %st
70+
<<<<<<< HEAD
6271
; AVX512VL-NEXT: kmovd %k1, %eax
6372
; AVX512VL-NEXT: testb $2, %al
73+
=======
74+
; AVX512VL-NEXT: kshiftrb $1, %k2, %k0
75+
; AVX512VL-NEXT: kmovd %k0, %eax
76+
; AVX512VL-NEXT: testb $1, %al
77+
>>>>>>> parent of 239ab16ec121 ([X86] combineCMP - attempt to simplify KSHIFTR mask element extractions when just comparing against zero)
6478
; AVX512VL-NEXT: fld %st(2)
6579
; AVX512VL-NEXT: fcmovne %st(4), %st
80+
; AVX512VL-NEXT: kmovd %k2, %eax
6681
; AVX512VL-NEXT: testb $1, %al
6782
; AVX512VL-NEXT: fxch %st(3)
6883
; AVX512VL-NEXT: fcmovne %st(4), %st
@@ -77,10 +92,10 @@ define void @test(<4 x i64> %a, <4 x x86_fp80> %b, ptr %c) local_unnamed_addr {
7792
; AVX512VL-NEXT: fstpt 10(%rdi)
7893
; AVX512VL-NEXT: fxch %st(1)
7994
; AVX512VL-NEXT: fadd %st, %st(0)
80-
; AVX512VL-NEXT: fstpt 20(%rdi)
81-
; AVX512VL-NEXT: fadd %st, %st(0)
8295
; AVX512VL-NEXT: fstpt (%rdi)
8396
; AVX512VL-NEXT: fadd %st, %st(0)
97+
; AVX512VL-NEXT: fstpt 20(%rdi)
98+
; AVX512VL-NEXT: fadd %st, %st(0)
8499
; AVX512VL-NEXT: fstpt 60(%rdi)
85100
; AVX512VL-NEXT: fadd %st, %st(0)
86101
; AVX512VL-NEXT: fstpt 40(%rdi)

0 commit comments

Comments
 (0)