[InstCombine] remove shuffle mask canonicalization that creates undef elements
This is NFC-intended because SimplifyDemandedVectorElts() does the same transform later. As discussed in D70641, we may want to change that behavior, so we need to isolate where it happens.
This commit is contained in:
@@ -1886,24 +1886,18 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
LHS, RHS, SVI.getMask(), SVI.getType(), SQ.getWithInstruction(&SVI)))
|
||||
return replaceInstUsesWith(SVI, V);
|
||||
|
||||
// Canonicalize shuffle(x ,x,mask) -> shuffle(x, undef,mask')
|
||||
// Canonicalize shuffle(undef,x,mask) -> shuffle(x, undef,mask').
|
||||
// shuffle x, x, mask --> shuffle x, undef, mask'
|
||||
unsigned VWidth = SVI.getType()->getVectorNumElements();
|
||||
unsigned LHSWidth = LHS->getType()->getVectorNumElements();
|
||||
SmallVector<int, 16> Mask = SVI.getShuffleMask();
|
||||
Type *Int32Ty = Type::getInt32Ty(SVI.getContext());
|
||||
if (LHS == RHS || isa<UndefValue>(LHS)) {
|
||||
if (LHS == RHS) {
|
||||
assert(!isa<UndefValue>(RHS) && "Shuffle with 2 undef ops not simplified?");
|
||||
// Remap any references to RHS to use LHS.
|
||||
SmallVector<Constant*, 16> Elts;
|
||||
for (unsigned i = 0; i != VWidth; ++i) {
|
||||
if (Mask[i] < 0) {
|
||||
Elts.push_back(UndefValue::get(Int32Ty));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Change select of undef to undef mask element or force to LHS.
|
||||
if (Mask[i] < (int)LHSWidth && isa<UndefValue>(LHS))
|
||||
// Propagate undef elements or force mask to LHS.
|
||||
if (Mask[i] < 0)
|
||||
Elts.push_back(UndefValue::get(Int32Ty));
|
||||
else
|
||||
Elts.push_back(ConstantInt::get(Int32Ty, Mask[i] % LHSWidth));
|
||||
@@ -1914,6 +1908,12 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
return &SVI;
|
||||
}
|
||||
|
||||
// shuffle undef, x, mask --> shuffle x, undef, mask'
|
||||
if (isa<UndefValue>(LHS)) {
|
||||
SVI.commute();
|
||||
return &SVI;
|
||||
}
|
||||
|
||||
if (Instruction *I = canonicalizeInsertSplat(SVI, Builder))
|
||||
return I;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user