Skip to content

Commit b25adf5

Browse files
committed
[SelectionDAG] simplify vector select with undef operand(s)
llvm-svn: 347227
1 parent 22a04ef commit b25adf5

File tree

4 files changed

+13
-21
lines changed

4 files changed

+13
-21
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7816,9 +7816,8 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
78167816
SDValue N2 = N->getOperand(2);
78177817
SDLoc DL(N);
78187818

7819-
// fold (vselect C, X, X) -> X
7820-
if (N1 == N2)
7821-
return N1;
7819+
if (SDValue V = DAG.simplifySelect(N0, N1, N2))
7820+
return V;
78227821

78237822
// Canonicalize integer abs.
78247823
// vselect (setg[te] X, 0), X, -X ->

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5078,6 +5078,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
50785078
break;
50795079
}
50805080
case ISD::SELECT:
5081+
case ISD::VSELECT:
50815082
if (SDValue V = simplifySelect(N1, N2, N3))
50825083
return V;
50835084
break;
@@ -6790,11 +6791,18 @@ SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {
67906791
if (F.isUndef())
67916792
return T;
67926793

6793-
// fold (select true, T, F) -> T
6794-
// fold (select false, T, F) -> F
6794+
// select true, T, F --> T
6795+
// select false, T, F --> F
67956796
if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))
67966797
return CondC->isNullValue() ? F : T;
67976798

6799+
// TODO: This should simplify VSELECT with constant condition using something
6800+
// like this (but check boolean contents to be complete?):
6801+
// if (ISD::isBuildVectorAllOnes(Cond.getNode()))
6802+
// return T;
6803+
// if (ISD::isBuildVectorAllZeros(Cond.getNode()))
6804+
// return F;
6805+
67986806
// select ?, T, T --> T
67996807
if (T == F)
68006808
return T;

llvm/test/CodeGen/X86/pr30284.ll

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@
44
define void @undef_cond() {
55
; CHECK-LABEL: undef_cond:
66
; CHECK: # %bb.0:
7-
; CHECK-NEXT: vmovapd 0, %zmm0
8-
; CHECK-NEXT: vmovapd 64, %zmm1
9-
; CHECK-NEXT: vmovapd {{.*#+}} zmm2 = [0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16]
10-
; CHECK-NEXT: vorpd %zmm2, %zmm0, %zmm0 {%k1}
11-
; CHECK-NEXT: vorpd %zmm2, %zmm1, %zmm1 {%k1}
12-
; CHECK-NEXT: vmovapd %zmm1, 64
13-
; CHECK-NEXT: vmovapd %zmm0, 0
14-
; CHECK-NEXT: vzeroupper
157
; CHECK-NEXT: retl
168
%a_load22 = load <16 x i64>, <16 x i64>* null, align 1
179
%bitop = or <16 x i64> %a_load22, <i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736>

llvm/test/CodeGen/X86/pr37499.ll

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,7 @@
44
define <2 x i64> @undef_tval() {
55
; CHECK-LABEL: undef_tval:
66
; CHECK: # %bb.0:
7-
; CHECK-NEXT: vmovdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1]
8-
; CHECK-NEXT: movb $1, %al
9-
; CHECK-NEXT: kmovw %eax, %k1
10-
; CHECK-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
11-
; CHECK-NEXT: vmovdqa32 %ymm1, %ymm1 {%k1} {z}
12-
; CHECK-NEXT: vpmovdw %ymm1, %xmm1
13-
; CHECK-NEXT: vpblendvb %xmm1, %xmm0, %xmm0, %xmm0
14-
; CHECK-NEXT: vzeroupper
7+
; CHECK-NEXT: vmovaps {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1]
158
; CHECK-NEXT: retq
169
%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
1710
%2 = bitcast <8 x i16> %1 to <2 x i64>

0 commit comments

Comments
 (0)