@@ -1669,16 +1669,18 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
16691669
16701670 Value *X, *Y, *Z, *W;
16711671 bool IsCommutative = false ;
1672- CmpPredicate Pred = CmpInst::BAD_ICMP_PREDICATE;
1672+ CmpPredicate PredLHS = CmpInst::BAD_ICMP_PREDICATE;
1673+ CmpPredicate PredRHS = CmpInst::BAD_ICMP_PREDICATE;
16731674 if (match (LHS, m_BinOp (m_Value (X), m_Value (Y))) &&
16741675 match (RHS, m_BinOp (m_Value (Z), m_Value (W)))) {
16751676 auto *BO = cast<BinaryOperator>(LHS);
16761677 // Don't introduce poison into div/rem.
16771678 if (llvm::is_contained (OldMask, PoisonMaskElem) && BO->isIntDivRem ())
16781679 return false ;
16791680 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) {
16821684 IsCommutative = cast<CmpInst>(LHS)->isCommutative ();
16831685 } else
16841686 return false ;
@@ -1727,14 +1729,14 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
17271729 TTI.getShuffleCost (SK0, BinOpTy, NewMask0, CostKind, 0 , nullptr , {X, Z}) +
17281730 TTI.getShuffleCost (SK1, BinOpTy, NewMask1, CostKind, 0 , nullptr , {Y, W});
17291731
1730- if (Pred == CmpInst::BAD_ICMP_PREDICATE) {
1732+ if (PredLHS == CmpInst::BAD_ICMP_PREDICATE) {
17311733 NewCost +=
17321734 TTI.getArithmeticInstrCost (LHS->getOpcode (), ShuffleDstTy, CostKind);
17331735 } else {
17341736 auto *ShuffleCmpTy =
17351737 FixedVectorType::get (BinOpTy->getElementType (), ShuffleDstTy);
17361738 NewCost += TTI.getCmpSelInstrCost (LHS->getOpcode (), ShuffleCmpTy,
1737- ShuffleDstTy, Pred , CostKind);
1739+ ShuffleDstTy, PredLHS , CostKind);
17381740 }
17391741
17401742 LLVM_DEBUG (dbgs () << " Found a shuffle feeding two binops: " << I
@@ -1750,10 +1752,10 @@ bool VectorCombine::foldShuffleOfBinops(Instruction &I) {
17501752
17511753 Value *Shuf0 = Builder.CreateShuffleVector (X, Z, NewMask0);
17521754 Value *Shuf1 = Builder.CreateShuffleVector (Y, W, NewMask1);
1753- Value *NewBO = Pred == CmpInst::BAD_ICMP_PREDICATE
1755+ Value *NewBO = PredLHS == CmpInst::BAD_ICMP_PREDICATE
17541756 ? Builder.CreateBinOp (
17551757 cast<BinaryOperator>(LHS)->getOpcode (), Shuf0, Shuf1)
1756- : Builder.CreateCmp (Pred , Shuf0, Shuf1);
1758+ : Builder.CreateCmp (PredLHS , Shuf0, Shuf1);
17571759
17581760 // Intersect flags from the old binops.
17591761 if (auto *NewInst = dyn_cast<Instruction>(NewBO)) {
0 commit comments