Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 1f5b358

Browse files
committed
[SelectionDAG] Add support for INSERT_SUBVECTOR to computeKnownBits
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316847 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 6804946 commit 1f5b358

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,6 +2207,40 @@ void SelectionDAG::computeKnownBits(SDValue Op, KnownBits &Known,
22072207
}
22082208
break;
22092209
}
2210+
case ISD::INSERT_SUBVECTOR: {
2211+
// If we know the element index, demand any elements from the subvector and
2212+
// the remainder from the src its inserted into, otherwise demand them all.
2213+
SDValue Src = Op.getOperand(0);
2214+
SDValue Sub = Op.getOperand(1);
2215+
ConstantSDNode *SubIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
2216+
unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
2217+
if (SubIdx && SubIdx->getAPIntValue().ule(NumElts - NumSubElts)) {
2218+
Known.One.setAllBits();
2219+
Known.Zero.setAllBits();
2220+
uint64_t Idx = SubIdx->getZExtValue();
2221+
APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
2222+
if (!!DemandedSubElts) {
2223+
computeKnownBits(Sub, Known, DemandedSubElts, Depth + 1);
2224+
if (Known.isUnknown())
2225+
break; // early-out.
2226+
}
2227+
APInt SubMask = APInt::getBitsSet(NumElts, Idx, Idx + NumSubElts);
2228+
APInt DemandedSrcElts = DemandedElts & ~SubMask;
2229+
if (!!DemandedSrcElts) {
2230+
computeKnownBits(Src, Known2, DemandedSrcElts, Depth + 1);
2231+
Known.One &= Known2.One;
2232+
Known.Zero &= Known2.Zero;
2233+
}
2234+
} else {
2235+
computeKnownBits(Sub, Known, Depth + 1);
2236+
if (Known.isUnknown())
2237+
break; // early-out.
2238+
computeKnownBits(Src, Known2, Depth + 1);
2239+
Known.One &= Known2.One;
2240+
Known.Zero &= Known2.Zero;
2241+
}
2242+
break;
2243+
}
22102244
case ISD::EXTRACT_SUBVECTOR: {
22112245
// If we know the element index, just demand that subvector elements,
22122246
// otherwise demand them all.

test/CodeGen/X86/vector-trunc.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,9 +1227,8 @@ define void @trunc16i16_16i8_lshr(<16 x i16> %a) {
12271227
; AVX1: # BB#0: # %entry
12281228
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
12291229
; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1
1230-
; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm1
1231-
; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
1232-
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1230+
; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
1231+
; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
12331232
; AVX1-NEXT: vmovdqu %xmm0, (%rax)
12341233
; AVX1-NEXT: vzeroupper
12351234
; AVX1-NEXT: retq
@@ -1953,15 +1952,12 @@ define void @PR34773(i16* %a0, i8* %a1) {
19531952
; AVX1-NEXT: vmovdqu 32(%rdi), %ymm1
19541953
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
19551954
; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
1956-
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1957-
; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
1958-
; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = <1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u>
1959-
; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0
1960-
; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm2
1961-
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1962-
; AVX1-NEXT: vpshufb %xmm4, %xmm1, %xmm1
1963-
; AVX1-NEXT: vpackuswb %xmm0, %xmm3, %xmm2
1964-
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1955+
; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
1956+
; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1957+
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1958+
; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
1959+
; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1
1960+
; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
19651961
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
19661962
; AVX1-NEXT: vmovups %ymm0, (%rsi)
19671963
; AVX1-NEXT: vzeroupper

0 commit comments

Comments
 (0)