Skip to content

Commit 2d7f0b1

Browse files
committed
[X86] Fold ANDNP(undef,x)/ANDNP(x,undef) -> 0
Matches the fold in DAGCombiner::visitANDLike.
1 parent d5ee20f commit 2d7f0b1

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50665,6 +50665,11 @@ static SDValue combineAndnp(SDNode *N, SelectionDAG &DAG,
5066550665
SDValue N1 = N->getOperand(1);
5066650666
MVT VT = N->getSimpleValueType(0);
5066750667

50668+
// ANDNP(undef, x) -> 0
50669+
// ANDNP(x, undef) -> 0
50670+
if (N0.isUndef() || N1.isUndef())
50671+
return DAG.getConstant(0, SDLoc(N), VT);
50672+
5066850673
// ANDNP(0, x) -> x
5066950674
if (ISD::isBuildVectorAllZeros(N0.getNode()))
5067050675
return N1;

llvm/test/CodeGen/X86/pr55158.ll

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,20 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=x86_64-linux -opaque-pointers -mcpu=ivybridge -mattr=+avx2 | FileCheck %s --check-prefixes=IVB
3-
; RUN: llc < %s -mtriple=x86_64-linux -opaque-pointers -mcpu=haswell | FileCheck %s --check-prefixes=HSW
2+
; RUN: llc < %s -mtriple=x86_64-linux -opaque-pointers -mcpu=ivybridge -mattr=+avx2 | FileCheck %s
3+
; RUN: llc < %s -mtriple=x86_64-linux -opaque-pointers -mcpu=haswell | FileCheck %s
44

55
define <2 x i64> @PR55158(ptr %0) {
6-
; IVB-LABEL: PR55158:
7-
; IVB: # %bb.0:
8-
; IVB-NEXT: vmovdqa 64(%rdi), %xmm0
9-
; IVB-NEXT: vmovdqa 128(%rdi), %xmm1
10-
; IVB-NEXT: vpmovsxbd (%rdi), %xmm2
11-
; IVB-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
12-
; IVB-NEXT: vphsubw %xmm0, %xmm0, %xmm0
13-
; IVB-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
14-
; IVB-NEXT: vpxor %xmm2, %xmm2, %xmm2
15-
; IVB-NEXT: vpsrlvq %xmm1, %xmm2, %xmm1
16-
; IVB-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
17-
; IVB-NEXT: retq
18-
;
19-
; HSW-LABEL: PR55158:
20-
; HSW: # %bb.0:
21-
; HSW-NEXT: vmovdqa 64(%rdi), %xmm0
22-
; HSW-NEXT: vmovdqa 128(%rdi), %xmm1
23-
; HSW-NEXT: vpmovsxbd (%rdi), %xmm2
24-
; HSW-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
25-
; HSW-NEXT: vphsubw %xmm0, %xmm0, %xmm0
26-
; HSW-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
27-
; HSW-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
28-
; HSW-NEXT: vpsrlvq %xmm1, %xmm2, %xmm1
29-
; HSW-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
30-
; HSW-NEXT: retq
6+
; CHECK-LABEL: PR55158:
7+
; CHECK: # %bb.0:
8+
; CHECK-NEXT: vmovdqa 64(%rdi), %xmm0
9+
; CHECK-NEXT: vmovdqa 128(%rdi), %xmm1
10+
; CHECK-NEXT: vpmovsxbd (%rdi), %xmm2
11+
; CHECK-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm1
12+
; CHECK-NEXT: vphsubw %xmm0, %xmm0, %xmm0
13+
; CHECK-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
14+
; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2
15+
; CHECK-NEXT: vpsrlvq %xmm1, %xmm2, %xmm1
16+
; CHECK-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
17+
; CHECK-NEXT: retq
3118
%2 = load <16 x i8>, ptr %0, align 16
3219
%3 = getelementptr inbounds i32, ptr %0, i64 16
3320
%4 = load <8 x i16>, ptr %3, align 16

0 commit comments

Comments
 (0)