@@ -1669,16 +1669,18 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
1669
1669
1670
1670
Value *X, *Y, *Z, *W;
1671
1671
bool IsCommutative = false ;
1672
- CmpPredicate Pred = CmpInst::BAD_ICMP_PREDICATE;
1672
+ CmpPredicate PredLHS = CmpInst::BAD_ICMP_PREDICATE;
1673
+ CmpPredicate PredRHS = CmpInst::BAD_ICMP_PREDICATE;
1673
1674
if (match (LHS, m_BinOp (m_Value (X), m_Value (Y))) &&
1674
1675
match (RHS, m_BinOp (m_Value (Z), m_Value (W)))) {
1675
1676
auto *BO = cast<BinaryOperator>(LHS);
1676
1677
// Don't introduce poison into div/rem.
1677
1678
if (llvm::is_contained (OldMask, PoisonMaskElem) && BO->isIntDivRem ())
1678
1679
return false ;
1679
1680
IsCommutative = BinaryOperator::isCommutative (BO->getOpcode ());
1680
- } else if (match (LHS, m_Cmp (Pred, m_Value (X), m_Value (Y))) &&
1681
- match (RHS, m_SpecificCmp (Pred, m_Value (Z), m_Value (W)))) {
1681
+ } else if (match (LHS, m_Cmp (PredLHS, m_Value (X), m_Value (Y))) &&
1682
+ match (RHS, m_Cmp (PredRHS, m_Value (Z), m_Value (W))) &&
1683
+ (CmpInst::Predicate)PredLHS == (CmpInst::Predicate)PredRHS) {
1682
1684
IsCommutative = cast<CmpInst>(LHS)->isCommutative ();
1683
1685
} else
1684
1686
return false ;
@@ -1727,14 +1729,14 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
1727
1729
TTI.getShuffleCost (SK0, BinOpTy, NewMask0, CostKind, 0 , nullptr , {X, Z}) +
1728
1730
TTI.getShuffleCost (SK1, BinOpTy, NewMask1, CostKind, 0 , nullptr , {Y, W});
1729
1731
1730
- if (Pred == CmpInst::BAD_ICMP_PREDICATE) {
1732
+ if (PredLHS == CmpInst::BAD_ICMP_PREDICATE) {
1731
1733
NewCost +=
1732
1734
TTI.getArithmeticInstrCost (LHS->getOpcode (), ShuffleDstTy, CostKind);
1733
1735
} else {
1734
1736
auto *ShuffleCmpTy =
1735
1737
FixedVectorType::get (BinOpTy->getElementType (), ShuffleDstTy);
1736
1738
NewCost += TTI.getCmpSelInstrCost (LHS->getOpcode (), ShuffleCmpTy,
1737
- ShuffleDstTy, Pred , CostKind);
1739
+ ShuffleDstTy, PredLHS , CostKind);
1738
1740
}
1739
1741
1740
1742
LLVM_DEBUG (dbgs () << " Found a shuffle feeding two binops: " << I
@@ -1750,10 +1752,10 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
1750
1752
1751
1753
Value *Shuf0 = Builder.CreateShuffleVector (X, Z, NewMask0);
1752
1754
Value *Shuf1 = Builder.CreateShuffleVector (Y, W, NewMask1);
1753
- Value *NewBO = Pred == CmpInst::BAD_ICMP_PREDICATE
1755
+ Value *NewBO = PredLHS == CmpInst::BAD_ICMP_PREDICATE
1754
1756
? Builder.CreateBinOp (
1755
1757
cast<BinaryOperator>(LHS)->getOpcode (), Shuf0, Shuf1)
1756
- : Builder.CreateCmp (Pred , Shuf0, Shuf1);
1758
+ : Builder.CreateCmp (PredLHS , Shuf0, Shuf1);
1757
1759
1758
1760
// Intersect flags from the old binops.
1759
1761
if (auto *NewInst = dyn_cast<Instruction>(NewBO)) {
0 commit comments