@@ -3493,31 +3493,28 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
3493
3493
if (!Phi || Phi->getNumIncomingValues () != 2u )
3494
3494
return false ;
3495
3495
3496
- auto *Shuf0 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (0u ));
3497
- auto *Shuf1 = dyn_cast<ShuffleVectorInst>(Phi->getOperand (1u ));
3498
- if (!Shuf0 || !Shuf1)
3499
- return false ;
3500
-
3501
- Value *Op0 = nullptr ;
3502
- Value *Op1 = nullptr ;
3496
+ Value *Op = nullptr ;
3497
+ ArrayRef<int > Mask0;
3498
+ ArrayRef<int > Mask1;
3503
3499
3504
- if (!match (Shuf0, m_OneUse (m_Shuffle (m_Value (Op0), m_Poison ()))) ||
3505
- !match (Shuf1, m_OneUse (m_Shuffle (m_Value (Op1), m_Poison ()))) ||
3506
- Op0 != Op1)
3500
+ if (!match (Phi->getOperand (0u ),
3501
+ m_OneUse (m_Shuffle (m_Value (Op), m_Poison (), m_Mask (Mask0)))) ||
3502
+ !match (Phi->getOperand (1u ),
3503
+ m_OneUse (m_Shuffle (m_Specific (Op), m_Poison (), m_Mask (Mask1)))))
3507
3504
return false ;
3508
3505
3506
+ auto *Shuf = cast<ShuffleVectorInst>(Phi->getOperand (0u ));
3507
+
3509
3508
// Ensure result vectors are wider than the argument vector.
3510
- auto *InputVT = cast<FixedVectorType>(Op0 ->getType ());
3511
- auto *ResultVT = cast<FixedVectorType>(Shuf0 ->getType ());
3509
+ auto *InputVT = cast<FixedVectorType>(Op ->getType ());
3510
+ auto *ResultVT = cast<FixedVectorType>(Shuf ->getType ());
3512
3511
auto const InputNumElements = InputVT->getNumElements ();
3513
3512
3514
3513
if (InputNumElements >= ResultVT->getNumElements ())
3515
3514
return false ;
3516
3515
3517
3516
// Take the difference of the two shuffle masks at each index. Ignore poison
3518
3517
// values at the same index in both masks.
3519
- ArrayRef Mask0 = Shuf0->getShuffleMask ();
3520
- ArrayRef Mask1 = Shuf1->getShuffleMask ();
3521
3518
SmallVector<int , 16 > NewMask;
3522
3519
NewMask.reserve (Mask0.size ());
3523
3520
@@ -3559,22 +3556,22 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
3559
3556
3560
3557
// Create new shuffles and narrowed phi.
3561
3558
auto Builder = IRBuilder (&I);
3562
- Builder.SetInsertPoint (Shuf0 );
3563
- Builder.SetCurrentDebugLocation (Shuf0 ->getDebugLoc ());
3559
+ Builder.SetInsertPoint (Shuf );
3560
+ Builder.SetCurrentDebugLocation (Shuf ->getDebugLoc ());
3564
3561
auto *PoisonVal = PoisonValue::get (InputVT);
3565
- auto *NewShuf0 = Builder.CreateShuffleVector (Op0 , PoisonVal, NewMask);
3562
+ auto *NewShuf0 = Builder.CreateShuffleVector (Op , PoisonVal, NewMask);
3566
3563
3567
3564
Builder.SetInsertPoint (Phi);
3568
3565
Builder.SetCurrentDebugLocation (Phi->getDebugLoc ());
3569
3566
auto *NewPhi = Builder.CreatePHI (NewShuf0->getType (), 2u );
3570
3567
NewPhi->addIncoming (NewShuf0, Phi->getIncomingBlock (0u ));
3571
- NewPhi->addIncoming (Op1 , Phi->getIncomingBlock (1u ));
3568
+ NewPhi->addIncoming (Op , Phi->getIncomingBlock (1u ));
3572
3569
3573
3570
Builder.SetInsertPoint (*NewPhi->getInsertionPointAfterDef ());
3574
3571
PoisonVal = PoisonValue::get (NewPhi->getType ());
3575
- auto *NewShuf2 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
3572
+ auto *NewShuf1 = Builder.CreateShuffleVector (NewPhi, PoisonVal, Mask1);
3576
3573
3577
- replaceValue (*Phi, *NewShuf2 );
3574
+ replaceValue (*Phi, *NewShuf1 );
3578
3575
return true ;
3579
3576
}
3580
3577
0 commit comments