Skip to content

Commit f85c43c

Browse files
author
Leon Clark
committed
Address review comments.
1 parent 7304315 commit f85c43c

File tree

1 file changed

+30
-39
lines changed

1 file changed

+30
-39
lines changed

llvm/lib/Transforms/Vectorize/VectorCombine.cpp

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4009,23 +4009,16 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
40094009
if (!Shuf0 || !Shuf1)
40104010
return false;
40114011

4012-
if (!Shuf0->hasOneUse() && !Shuf1->hasOneUse())
4013-
return false;
4014-
4015-
auto *Shuf0Op0 = Shuf0->getOperand(0u);
4016-
auto *Shuf0Op1 = Shuf0->getOperand(1u);
4017-
auto *Shuf1Op0 = Shuf1->getOperand(0u);
4018-
auto *Shuf1Op1 = Shuf1->getOperand(1u);
4019-
4020-
auto IsPoison = [](Value *Val) -> bool {
4021-
return isa<PoisonValue>(Val) || isa<UndefValue>(Val);
4022-
};
4012+
Value *Op0 = nullptr;
4013+
Value *Op1 = nullptr;
40234014

4024-
if (Shuf0Op0 != Shuf1Op0 || !IsPoison(Shuf0Op1) || !IsPoison(Shuf1Op1))
4015+
if (!match(Shuf0, m_OneUse(m_Shuffle(m_Value(Op0), m_Poison()))) ||
4016+
!match(Shuf1, m_OneUse(m_Shuffle(m_Value(Op1), m_Poison()))) ||
4017+
Op0 != Op1)
40254018
return false;
40264019

40274020
// Ensure result vectors are wider than the argument vector.
4028-
auto *InputVT = cast<FixedVectorType>(Shuf0Op0->getType());
4021+
auto *InputVT = cast<FixedVectorType>(Op0->getType());
40294022
auto *ResultVT = cast<FixedVectorType>(Shuf0->getType());
40304023
auto const InputNumElements = InputVT->getNumElements();
40314024

@@ -4034,46 +4027,43 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
40344027

40354028
// Take the difference of the two shuffle masks at each index. Ignore poison
40364029
// values at the same index in both masks.
4037-
auto Mask0 = Shuf0->getShuffleMask();
4038-
auto Mask1 = Shuf1->getShuffleMask();
4039-
auto NewMask0 = std::vector<int>();
4040-
NewMask0.reserve(Mask0.size());
4030+
ArrayRef Mask0 = Shuf0->getShuffleMask();
4031+
ArrayRef Mask1 = Shuf1->getShuffleMask();
4032+
SmallVector<int, 16> NewMask;
4033+
NewMask.reserve(Mask0.size());
40414034

40424035
for (auto I = 0u; I < Mask0.size(); ++I) {
40434036
if (Mask0[I] >= 0 && Mask1[I] >= 0)
4044-
NewMask0.push_back(Mask0[I] - Mask1[I]);
4037+
NewMask.push_back(Mask0[I] - Mask1[I]);
40454038
else if (Mask0[I] == -1 && Mask1[I] == -1)
40464039
continue;
40474040
else
40484041
return false;
40494042
}
40504043

4051-
if (NewMask0.empty() ||
4052-
!std::equal(NewMask0.begin() + 1u, NewMask0.end(), NewMask0.begin()))
4044+
// Ensure all elements of the new mask are equal. If the difference between
4045+
// the incoming mask elements is the same, the two must be constant offsets
4046+
// of one another.
4047+
if (NewMask.empty() ||
4048+
!std::equal(NewMask.begin() + 1u, NewMask.end(), NewMask.begin()))
40534049
return false;
40544050

40554051
// Create new mask using difference of the two incoming masks.
4056-
auto MaskOffset = NewMask0[0u];
4057-
if (!Shuf0->hasOneUse()) {
4058-
std::swap(Shuf0, Shuf1);
4059-
std::swap(Mask0, Mask1);
4060-
MaskOffset *= -1;
4061-
}
4062-
4063-
auto Index = (InputNumElements - MaskOffset) % InputNumElements;
4064-
NewMask0.clear();
4052+
int MaskOffset = NewMask[0u];
4053+
unsigned Index = (InputNumElements - MaskOffset) % InputNumElements;
4054+
NewMask.clear();
40654055

4066-
for (auto I = 0u; I < InputNumElements; ++I) {
4067-
NewMask0.push_back(Index);
4056+
for (unsigned I = 0u; I < InputNumElements; ++I) {
4057+
NewMask.push_back(Index);
40684058
Index = (Index + 1u) % InputNumElements;
40694059
}
40704060

40714061
// Calculate costs for worst cases and compare.
40724062
auto const Kind = TTI::SK_PermuteSingleSrc;
4073-
auto OldCost = std::max(TTI.getShuffleCost(Kind, InputVT, ResultVT, Mask0, CostKind),
4074-
TTI.getShuffleCost(Kind, InputVT, ResultVT, Mask1, CostKind));
4075-
auto NewCost = TTI.getShuffleCost(Kind, InputVT, InputVT, NewMask0, CostKind) +
4076-
TTI.getShuffleCost(Kind, InputVT, ResultVT, Mask1, CostKind);
4063+
auto OldCost = std::max(TTI.getShuffleCost(Kind, InputVT, Mask0, CostKind),
4064+
TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind));
4065+
auto NewCost = TTI.getShuffleCost(Kind, InputVT, NewMask, CostKind) +
4066+
TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind);
40774067

40784068
if (NewCost > OldCost)
40794069
return false;
@@ -4082,17 +4072,18 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
40824072
auto Builder = IRBuilder(&I);
40834073
Builder.SetInsertPoint(Shuf0);
40844074
Builder.SetCurrentDebugLocation(Shuf0->getDebugLoc());
4085-
auto *NewShuf0 = Builder.CreateShuffleVector(Shuf0Op0, Shuf0Op1, NewMask0);
4075+
auto *PoisonVal = PoisonValue::get(InputVT);
4076+
auto *NewShuf0 = Builder.CreateShuffleVector(Op0, PoisonVal, NewMask);
40864077

40874078
Builder.SetInsertPoint(Phi);
40884079
Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
40894080
auto *NewPhi = Builder.CreatePHI(NewShuf0->getType(), 2u);
40904081
NewPhi->addIncoming(NewShuf0, Phi->getIncomingBlock(0u));
4091-
NewPhi->addIncoming(Shuf1Op0, Phi->getIncomingBlock(1u));
4082+
NewPhi->addIncoming(Op1, Phi->getIncomingBlock(1u));
40924083

40934084
Builder.SetInsertPoint(*NewPhi->getInsertionPointAfterDef());
4094-
auto *NewPoison = PoisonValue::get(NewPhi->getType());
4095-
auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, NewPoison, Mask1);
4085+
PoisonVal = PoisonValue::get(NewPhi->getType());
4086+
auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, PoisonVal, Mask1);
40964087

40974088
replaceValue(*Phi, *NewShuf2);
40984089
return true;

0 commit comments

Comments
 (0)