mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
Reorder shuffle and binary operation.
This patch enables transformations:
BinOp(shuffle(v1), shuffle(v2)) -> shuffle(BinOp(v1, v2))
BinOp(shuffle(v1), const1) -> shuffle(BinOp, const2)
They allow to eliminate extra shuffles in some cases.
Differential Revision: http://reviews.llvm.org/D3525
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208488 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -839,6 +839,20 @@ InstCombiner::EvaluateInDifferentElementOrder(Value *V, ArrayRef<int> Mask) {
|
||||
llvm_unreachable("failed to reorder elements of vector instruction!");
|
||||
}
|
||||
|
||||
static void RecognizeIdentityMask(const SmallVectorImpl<int> &Mask,
|
||||
bool &isLHSID, bool &isRHSID) {
|
||||
isLHSID = isRHSID = true;
|
||||
|
||||
for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
|
||||
if (Mask[i] < 0) continue; // Ignore undef values.
|
||||
// Is this an identity shuffle of the LHS value?
|
||||
isLHSID &= (Mask[i] == (int)i);
|
||||
|
||||
// Is this an identity shuffle of the RHS value?
|
||||
isRHSID &= (Mask[i]-e == i);
|
||||
}
|
||||
}
|
||||
|
||||
Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
Value *LHS = SVI.getOperand(0);
|
||||
Value *RHS = SVI.getOperand(1);
|
||||
@@ -902,16 +916,8 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
|
||||
if (VWidth == LHSWidth) {
|
||||
// Analyze the shuffle, are the LHS or RHS and identity shuffles?
|
||||
bool isLHSID = true, isRHSID = true;
|
||||
|
||||
for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
|
||||
if (Mask[i] < 0) continue; // Ignore undef values.
|
||||
// Is this an identity shuffle of the LHS value?
|
||||
isLHSID &= (Mask[i] == (int)i);
|
||||
|
||||
// Is this an identity shuffle of the RHS value?
|
||||
isRHSID &= (Mask[i]-e == i);
|
||||
}
|
||||
bool isLHSID, isRHSID;
|
||||
RecognizeIdentityMask(Mask, isLHSID, isRHSID);
|
||||
|
||||
// Eliminate identity shuffles.
|
||||
if (isLHSID) return ReplaceInstUsesWith(SVI, LHS);
|
||||
@@ -1106,5 +1112,14 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
return new ShuffleVectorInst(newLHS, newRHS, ConstantVector::get(Elts));
|
||||
}
|
||||
|
||||
// If the result mask is an identity, replace uses of this instruction with
|
||||
// corresponding argument.
|
||||
if (VWidth == LHSWidth) {
|
||||
bool isLHSID, isRHSID;
|
||||
RecognizeIdentityMask(newMask, isLHSID, isRHSID);
|
||||
if (isLHSID) return ReplaceInstUsesWith(SVI, newLHS);
|
||||
if (isRHSID) return ReplaceInstUsesWith(SVI, newRHS);
|
||||
}
|
||||
|
||||
return MadeChange ? &SVI : nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user