@@ -3701,31 +3701,28 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
37013701 if (!Phi || Phi->getNumIncomingValues () != 2u )
37023702 return false ;
37033703
3704- auto *Shuf0 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (0u ));
3705- auto *Shuf1 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (1u ));
3706- if (!Shuf0 || !Shuf1)
3707- return false ;
3708-
3709- Value *Op0 = nullptr ;
3710- Value *Op1 = nullptr ;
3704+ Value *Op = nullptr ;
3705+ ArrayRef<int > Mask0;
3706+ ArrayRef<int > Mask1;
37113707
3712- if (!match (Shuf0, m_OneUse (m_Shuffle (m_Value (Op0), m_Poison ()))) ||
3713- !match (Shuf1, m_OneUse (m_Shuffle (m_Value (Op1), m_Poison ()))) ||
3714- Op0 != Op1)
3708+ if (!match (Phi->getOperand (0u ),
3709+ m_OneUse (m_Shuffle (m_Value (Op), m_Poison (), m_Mask (Mask0)))) ||
3710+ !match (Phi->getOperand (1u ),
3711+ m_OneUse (m_Shuffle (m_Specific (Op), m_Poison (), m_Mask (Mask1)))))
37153712 return false ;
37163713
3714+ auto *Shuf = cast<ShuffleVectorInst>(Phi->getOperand (0u ));
3715+
37173716 // Ensure result vectors are wider than the argument vector.
3718- auto *InputVT = cast<FixedVectorType>(Op0 ->getType ());
3719- auto *ResultVT = cast<FixedVectorType>(Shuf0 ->getType ());
3717+ auto *InputVT = cast<FixedVectorType>(Op ->getType ());
3718+ auto *ResultVT = cast<FixedVectorType>(Shuf ->getType ());
37203719 auto const InputNumElements = InputVT->getNumElements ();
37213720
37223721 if (InputNumElements >= ResultVT->getNumElements ())
37233722 return false ;
37243723
37253724 // Take the difference of the two shuffle masks at each index. Ignore poison
37263725 // values at the same index in both masks.
3727- ArrayRef Mask0 = Shuf0->getShuffleMask ();
3728- ArrayRef Mask1 = Shuf1->getShuffleMask ();
37293726 SmallVector<int , 16 > NewMask;
37303727 NewMask.reserve (Mask0.size ());
37313728
@@ -3767,22 +3764,22 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
37673764
37683765 // Create new shuffles and narrowed phi.
37693766 auto Builder = IRBuilder (&I);
3770- Builder.SetInsertPoint (Shuf0 );
3771- Builder.SetCurrentDebugLocation (Shuf0 ->getDebugLoc ());
3767+ Builder.SetInsertPoint (Shuf );
3768+ Builder.SetCurrentDebugLocation (Shuf ->getDebugLoc ());
37723769 auto *PoisonVal = PoisonValue::get (InputVT);
3773- auto *NewShuf0 = Builder.CreateShuffleVector (Op0 , PoisonVal, NewMask);
3770+ auto *NewShuf0 = Builder.CreateShuffleVector (Op , PoisonVal, NewMask);
37743771
37753772 Builder.SetInsertPoint (Phi);
37763773 Builder.SetCurrentDebugLocation (Phi->getDebugLoc ());
37773774 auto *NewPhi = Builder.CreatePHI (NewShuf0->getType (), 2u );
37783775 NewPhi->addIncoming (NewShuf0, Phi->getIncomingBlock (0u ));
3779- NewPhi->addIncoming (Op1 , Phi->getIncomingBlock (1u ));
3776+ NewPhi->addIncoming (Op , Phi->getIncomingBlock (1u ));
37803777
37813778 Builder.SetInsertPoint (*NewPhi->getInsertionPointAfterDef ());
37823779 PoisonVal = PoisonValue::get (NewPhi->getType ());
3783- auto *NewShuf2 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
3780+ auto *NewShuf1 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
37843781
3785- replaceValue (*Phi, *NewShuf2 );
3782+ replaceValue (*Phi, *NewShuf1 );
37863783 return true ;
37873784}
37883785
0 commit comments