Skip to content

Commit c957715

Browse files
committed
[X86] isGuaranteedNotToBeUndefOrPoisonForTargetNode - generalize shuffle decoding to support more target shuffles in the future.
1 parent 092999e commit c957715

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42665,23 +42665,35 @@ SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode(
4266542665
bool X86TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
4266642666
SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4266742667
bool PoisonOnly, unsigned Depth) const {
42668-
unsigned EltsBits = Op.getScalarValueSizeInBits();
4266942668
unsigned NumElts = DemandedElts.getBitWidth();
4267042669

4267142670
// TODO: Add more target shuffles.
4267242671
switch (Op.getOpcode()) {
4267342672
case X86ISD::PSHUFD:
4267442673
case X86ISD::VPERMILPI: {
4267542674
SmallVector<int, 8> Mask;
42676-
DecodePSHUFMask(NumElts, EltsBits, Op.getConstantOperandVal(1), Mask);
42677-
42678-
APInt DemandedSrcElts = APInt::getZero(NumElts);
42679-
for (unsigned I = 0; I != NumElts; ++I)
42680-
if (DemandedElts[I])
42681-
DemandedSrcElts.setBit(Mask[I]);
42682-
42683-
return DAG.isGuaranteedNotToBeUndefOrPoison(
42684-
Op.getOperand(0), DemandedSrcElts, PoisonOnly, Depth + 1);
42675+
SmallVector<SDValue, 2> Ops;
42676+
if (getTargetShuffleMask(Op.getNode(), Op.getSimpleValueType(), true, Ops,
42677+
Mask)) {
42678+
SmallVector<APInt, 2> DemandedSrcElts(Ops.size(),
42679+
APInt::getZero(NumElts));
42680+
for (auto M : enumerate(Mask)) {
42681+
if (!DemandedElts[M.index()] || M.value() == SM_SentinelZero)
42682+
continue;
42683+
if (M.value() == SM_SentinelUndef)
42684+
return false;
42685+
assert(0 <= M.value() && M.value() < (int)(Ops.size() * NumElts) &&
42686+
"Shuffle mask index out of range");
42687+
DemandedSrcElts[M.value() / NumElts].setBit(M.value() % NumElts);
42688+
}
42689+
for (auto Op : enumerate(Ops))
42690+
if (!DemandedSrcElts[Op.index()].isZero() &&
42691+
!DAG.isGuaranteedNotToBeUndefOrPoison(
42692+
Op.value(), DemandedSrcElts[Op.index()], PoisonOnly, Depth + 1))
42693+
return false;
42694+
return true;
42695+
}
42696+
break;
4268542697
}
4268642698
}
4268742699
return TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(

0 commit comments

Comments
 (0)