forked from OSchip/llvm-project
[InstCombine] add assert in SimplifyDemandedVectorElts and improve readability; NFC
This commit is contained in:
parent
d4e006e844
commit
4ae0a13256
|
@ -1247,28 +1247,31 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
|||
break;
|
||||
}
|
||||
case Instruction::ShuffleVector: {
|
||||
ShuffleVectorInst *Shuffle = cast<ShuffleVectorInst>(I);
|
||||
unsigned LHSVWidth =
|
||||
Shuffle->getOperand(0)->getType()->getVectorNumElements();
|
||||
APInt LeftDemanded(LHSVWidth, 0), RightDemanded(LHSVWidth, 0);
|
||||
auto *Shuffle = cast<ShuffleVectorInst>(I);
|
||||
assert(Shuffle->getOperand(0)->getType() ==
|
||||
Shuffle->getOperand(1)->getType() &&
|
||||
"Expected shuffle operands to have same type");
|
||||
unsigned OpWidth =
|
||||
Shuffle->getOperand(0)->getType()->getVectorNumElements();
|
||||
APInt LeftDemanded(OpWidth, 0), RightDemanded(OpWidth, 0);
|
||||
for (unsigned i = 0; i < VWidth; i++) {
|
||||
if (DemandedElts[i]) {
|
||||
unsigned MaskVal = Shuffle->getMaskValue(i);
|
||||
if (MaskVal != -1u) {
|
||||
assert(MaskVal < LHSVWidth * 2 &&
|
||||
assert(MaskVal < OpWidth * 2 &&
|
||||
"shufflevector mask index out of range!");
|
||||
if (MaskVal < LHSVWidth)
|
||||
if (MaskVal < OpWidth)
|
||||
LeftDemanded.setBit(MaskVal);
|
||||
else
|
||||
RightDemanded.setBit(MaskVal - LHSVWidth);
|
||||
RightDemanded.setBit(MaskVal - OpWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
APInt LHSUndefElts(LHSVWidth, 0);
|
||||
APInt LHSUndefElts(OpWidth, 0);
|
||||
simplifyAndSetOp(I, 0, LeftDemanded, LHSUndefElts);
|
||||
|
||||
APInt RHSUndefElts(LHSVWidth, 0);
|
||||
APInt RHSUndefElts(OpWidth, 0);
|
||||
simplifyAndSetOp(I, 1, RightDemanded, RHSUndefElts);
|
||||
|
||||
bool NewUndefElts = false;
|
||||
|
@ -1283,23 +1286,23 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
|||
} else if (!DemandedElts[i]) {
|
||||
NewUndefElts = true;
|
||||
UndefElts.setBit(i);
|
||||
} else if (MaskVal < LHSVWidth) {
|
||||
} else if (MaskVal < OpWidth) {
|
||||
if (LHSUndefElts[MaskVal]) {
|
||||
NewUndefElts = true;
|
||||
UndefElts.setBit(i);
|
||||
} else {
|
||||
LHSIdx = LHSIdx == -1u ? i : LHSVWidth;
|
||||
LHSValIdx = LHSValIdx == -1u ? MaskVal : LHSVWidth;
|
||||
LHSIdx = LHSIdx == -1u ? i : OpWidth;
|
||||
LHSValIdx = LHSValIdx == -1u ? MaskVal : OpWidth;
|
||||
LHSUniform = LHSUniform && (MaskVal == i);
|
||||
}
|
||||
} else {
|
||||
if (RHSUndefElts[MaskVal - LHSVWidth]) {
|
||||
if (RHSUndefElts[MaskVal - OpWidth]) {
|
||||
NewUndefElts = true;
|
||||
UndefElts.setBit(i);
|
||||
} else {
|
||||
RHSIdx = RHSIdx == -1u ? i : LHSVWidth;
|
||||
RHSValIdx = RHSValIdx == -1u ? MaskVal - LHSVWidth : LHSVWidth;
|
||||
RHSUniform = RHSUniform && (MaskVal - LHSVWidth == i);
|
||||
RHSIdx = RHSIdx == -1u ? i : OpWidth;
|
||||
RHSValIdx = RHSValIdx == -1u ? MaskVal - OpWidth : OpWidth;
|
||||
RHSUniform = RHSUniform && (MaskVal - OpWidth == i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1308,20 +1311,20 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
|||
// this constant vector to single insertelement instruction.
|
||||
// shufflevector V, C, <v1, v2, .., ci, .., vm> ->
|
||||
// insertelement V, C[ci], ci-n
|
||||
if (LHSVWidth == Shuffle->getType()->getNumElements()) {
|
||||
if (OpWidth == Shuffle->getType()->getNumElements()) {
|
||||
Value *Op = nullptr;
|
||||
Constant *Value = nullptr;
|
||||
unsigned Idx = -1u;
|
||||
|
||||
// Find constant vector with the single element in shuffle (LHS or RHS).
|
||||
if (LHSIdx < LHSVWidth && RHSUniform) {
|
||||
if (LHSIdx < OpWidth && RHSUniform) {
|
||||
if (auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(0))) {
|
||||
Op = Shuffle->getOperand(1);
|
||||
Value = CV->getOperand(LHSValIdx);
|
||||
Idx = LHSIdx;
|
||||
}
|
||||
}
|
||||
if (RHSIdx < LHSVWidth && LHSUniform) {
|
||||
if (RHSIdx < OpWidth && LHSUniform) {
|
||||
if (auto *CV = dyn_cast<ConstantVector>(Shuffle->getOperand(1))) {
|
||||
Op = Shuffle->getOperand(0);
|
||||
Value = CV->getOperand(RHSValIdx);
|
||||
|
|
Loading…
Reference in New Issue