Skip to content

Commit

Permalink
[X86] isGuaranteedNotToBeUndefOrPoisonForTargetNode - generalize shuf…
Browse files Browse the repository at this point in the history
…fle decoding to support more target shuffles in the future.
  • Loading branch information
RKSimon committed Mar 15, 2024
1 parent 092999e commit c957715
Showing 1 changed file with 22 additions and 10 deletions.
32 changes: 22 additions & 10 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42665,23 +42665,35 @@ SDValue X86TargetLowering::SimplifyMultipleUseDemandedBitsForTargetNode(
bool X86TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
bool PoisonOnly, unsigned Depth) const {
unsigned EltsBits = Op.getScalarValueSizeInBits();
unsigned NumElts = DemandedElts.getBitWidth();

// TODO: Add more target shuffles.
switch (Op.getOpcode()) {
case X86ISD::PSHUFD:
case X86ISD::VPERMILPI: {
SmallVector<int, 8> Mask;
DecodePSHUFMask(NumElts, EltsBits, Op.getConstantOperandVal(1), Mask);

APInt DemandedSrcElts = APInt::getZero(NumElts);
for (unsigned I = 0; I != NumElts; ++I)
if (DemandedElts[I])
DemandedSrcElts.setBit(Mask[I]);

return DAG.isGuaranteedNotToBeUndefOrPoison(
Op.getOperand(0), DemandedSrcElts, PoisonOnly, Depth + 1);
SmallVector<SDValue, 2> Ops;
if (getTargetShuffleMask(Op.getNode(), Op.getSimpleValueType(), true, Ops,
Mask)) {
SmallVector<APInt, 2> DemandedSrcElts(Ops.size(),
APInt::getZero(NumElts));
for (auto M : enumerate(Mask)) {
if (!DemandedElts[M.index()] || M.value() == SM_SentinelZero)
continue;
if (M.value() == SM_SentinelUndef)
return false;
assert(0 <= M.value() && M.value() < (int)(Ops.size() * NumElts) &&
"Shuffle mask index out of range");
DemandedSrcElts[M.value() / NumElts].setBit(M.value() % NumElts);
}
for (auto Op : enumerate(Ops))
if (!DemandedSrcElts[Op.index()].isZero() &&
!DAG.isGuaranteedNotToBeUndefOrPoison(
Op.value(), DemandedSrcElts[Op.index()], PoisonOnly, Depth + 1))
return false;
return true;
}
break;
}
}
return TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
Expand Down

0 comments on commit c957715

Please sign in to comment.