@@ -4004,31 +4004,28 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
4004
4004
if (!Phi || Phi->getNumIncomingValues () != 2u )
4005
4005
return false ;
4006
4006
4007
- auto *Shuf0 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (0u ));
4008
- auto *Shuf1 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (1u ));
4009
- if (!Shuf0 || !Shuf1)
4010
- return false ;
4011
-
4012
- Value *Op0 = nullptr ;
4013
- Value *Op1 = nullptr ;
4007
+ Value *Op = nullptr ;
4008
+ ArrayRef<int > Mask0;
4009
+ ArrayRef<int > Mask1;
4014
4010
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)
4011
+ if (!match (Phi->getOperand (0u ),
4012
+ m_OneUse (m_Shuffle (m_Value (Op), m_Poison (), m_Mask (Mask0)))) ||
4013
+ !match (Phi->getOperand (1u ),
4014
+ m_OneUse (m_Shuffle (m_Specific (Op), m_Poison (), m_Mask (Mask1)))))
4018
4015
return false ;
4019
4016
4017
+ auto *Shuf = cast<ShuffleVectorInst>(Phi->getOperand (0u ));
4018
+
4020
4019
// Ensure result vectors are wider than the argument vector.
4021
- auto *InputVT = cast<FixedVectorType>(Op0 ->getType ());
4022
- auto *ResultVT = cast<FixedVectorType>(Shuf0 ->getType ());
4020
+ auto *InputVT = cast<FixedVectorType>(Op ->getType ());
4021
+ auto *ResultVT = cast<FixedVectorType>(Shuf ->getType ());
4023
4022
auto const InputNumElements = InputVT->getNumElements ();
4024
4023
4025
4024
if (InputNumElements >= ResultVT->getNumElements ())
4026
4025
return false ;
4027
4026
4028
4027
// Take the difference of the two shuffle masks at each index. Ignore poison
4029
4028
// values at the same index in both masks.
4030
- ArrayRef Mask0 = Shuf0->getShuffleMask ();
4031
- ArrayRef Mask1 = Shuf1->getShuffleMask ();
4032
4029
SmallVector<int , 16 > NewMask;
4033
4030
NewMask.reserve (Mask0.size ());
4034
4031
@@ -4070,22 +4067,22 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
4070
4067
4071
4068
// Create new shuffles and narrowed phi.
4072
4069
auto Builder = IRBuilder (&I);
4073
- Builder.SetInsertPoint (Shuf0 );
4074
- Builder.SetCurrentDebugLocation (Shuf0 ->getDebugLoc ());
4070
+ Builder.SetInsertPoint (Shuf );
4071
+ Builder.SetCurrentDebugLocation (Shuf ->getDebugLoc ());
4075
4072
auto *PoisonVal = PoisonValue::get (InputVT);
4076
- auto *NewShuf0 = Builder.CreateShuffleVector (Op0 , PoisonVal, NewMask);
4073
+ auto *NewShuf0 = Builder.CreateShuffleVector (Op , PoisonVal, NewMask);
4077
4074
4078
4075
Builder.SetInsertPoint (Phi);
4079
4076
Builder.SetCurrentDebugLocation (Phi->getDebugLoc ());
4080
4077
auto *NewPhi = Builder.CreatePHI (NewShuf0->getType (), 2u );
4081
4078
NewPhi->addIncoming (NewShuf0, Phi->getIncomingBlock (0u ));
4082
- NewPhi->addIncoming (Op1 , Phi->getIncomingBlock (1u ));
4079
+ NewPhi->addIncoming (Op , Phi->getIncomingBlock (1u ));
4083
4080
4084
4081
Builder.SetInsertPoint (*NewPhi->getInsertionPointAfterDef ());
4085
4082
PoisonVal = PoisonValue::get (NewPhi->getType ());
4086
- auto *NewShuf2 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
4083
+ auto *NewShuf1 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
4087
4084
4088
- replaceValue (*Phi, *NewShuf2 );
4085
+ replaceValue (*Phi, *NewShuf1 );
4089
4086
return true ;
4090
4087
}
4091
4088
0 commit comments