forked from OSchip/llvm-project
Implement InstCombine/vec_shuffle.ll:%test7, simplifying shuffles with
undef operands. llvm-svn: 32899
This commit is contained in:
parent
e4f7c5cf35
commit
d7b6ea166d
llvm/lib/Transforms/Scalar
|
@ -8833,8 +8833,30 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
|||
if (isa<UndefValue>(SVI.getOperand(2)))
|
||||
return ReplaceInstUsesWith(SVI, UndefValue::get(SVI.getType()));
|
||||
|
||||
// TODO: If we have shuffle(x, undef, mask) and any elements of mask refer to
|
||||
// If we have shuffle(x, undef, mask) and any elements of mask refer to
|
||||
// the undef, change them to undefs.
|
||||
if (isa<UndefValue>(SVI.getOperand(1))) {
|
||||
// Scan to see if there are any references to the RHS. If so, replace them
|
||||
// with undef element refs and set MadeChange to true.
|
||||
for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
|
||||
if (Mask[i] >= e && Mask[i] != 2*e) {
|
||||
Mask[i] = 2*e;
|
||||
MadeChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (MadeChange) {
|
||||
// Remap any references to RHS to use LHS.
|
||||
std::vector<Constant*> Elts;
|
||||
for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
|
||||
if (Mask[i] == 2*e)
|
||||
Elts.push_back(UndefValue::get(Type::Int32Ty));
|
||||
else
|
||||
Elts.push_back(ConstantInt::get(Type::Int32Ty, Mask[i]));
|
||||
}
|
||||
SVI.setOperand(2, ConstantPacked::get(Elts));
|
||||
}
|
||||
}
|
||||
|
||||
// Canonicalize shuffle(x ,x,mask) -> shuffle(x, undef,mask')
|
||||
// Canonicalize shuffle(undef,x,mask) -> shuffle(x, undef,mask').
|
||||
|
|
Loading…
Reference in New Issue