mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-28 06:29:45 +00:00
remove some harmful code that would turn an insertelement on an undef
into a shuffle even if it was used by another insertelement. If the visitation order of instcombine was wrong, this would turn a chain of insertelements into a chain of shufflevectors, which was quite painful. Since CollectShuffleElements handles these cases, the code can just be nuked. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83810 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aca471f3a5
commit
2ad8cf5555
@ -12472,28 +12472,6 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) {
|
|||||||
if (EI->getOperand(0) == VecOp && ExtractedIdx == InsertedIdx)
|
if (EI->getOperand(0) == VecOp && ExtractedIdx == InsertedIdx)
|
||||||
return ReplaceInstUsesWith(IE, VecOp);
|
return ReplaceInstUsesWith(IE, VecOp);
|
||||||
|
|
||||||
// We could theoretically do this for ANY input. However, doing so could
|
|
||||||
// turn chains of insertelement instructions into a chain of shufflevector
|
|
||||||
// instructions, and right now we do not merge shufflevectors. As such,
|
|
||||||
// only do this in a situation where it is clear that there is benefit.
|
|
||||||
if (isa<UndefValue>(VecOp) || isa<ConstantAggregateZero>(VecOp)) {
|
|
||||||
// Turn this into shuffle(EIOp0, VecOp, Mask). The result has all of
|
|
||||||
// the values of VecOp, except then one read from EIOp0.
|
|
||||||
// Build a new shuffle mask.
|
|
||||||
std::vector<Constant*> Mask;
|
|
||||||
if (isa<UndefValue>(VecOp))
|
|
||||||
Mask.assign(NumVectorElts, UndefValue::get(Type::getInt32Ty(*Context)));
|
|
||||||
else {
|
|
||||||
assert(isa<ConstantAggregateZero>(VecOp) && "Unknown thing");
|
|
||||||
Mask.assign(NumVectorElts, ConstantInt::get(Type::getInt32Ty(*Context),
|
|
||||||
NumVectorElts));
|
|
||||||
}
|
|
||||||
Mask[InsertedIdx] =
|
|
||||||
ConstantInt::get(Type::getInt32Ty(*Context), ExtractedIdx);
|
|
||||||
return new ShuffleVectorInst(EI->getOperand(0), VecOp,
|
|
||||||
ConstantVector::get(Mask));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this insertelement isn't used by some other insertelement, turn it
|
// If this insertelement isn't used by some other insertelement, turn it
|
||||||
// (and any insertelements it points to), into one big shuffle.
|
// (and any insertelements it points to), into one big shuffle.
|
||||||
if (!IE.hasOneUse() || !isa<InsertElementInst>(IE.use_back())) {
|
if (!IE.hasOneUse() || !isa<InsertElementInst>(IE.use_back())) {
|
||||||
|
Loading…
Reference in New Issue
Block a user