@@ -3674,6 +3674,52 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
3674
3674
foldAddLikeCommutative (I.getOperand (1 ), I.getOperand (0 ),
3675
3675
/* NSW=*/ true , /* NUW=*/ true ))
3676
3676
return R;
3677
+
3678
+ Value *Cond0 = nullptr , *Cond1 = nullptr ;
3679
+ const APInt *Op0Eq = nullptr , *Op0Ne = nullptr ;
3680
+ const APInt *Op1Eq = nullptr , *Op1Ne = nullptr ;
3681
+
3682
+ // (!(A & N) ? 0 : N * C) + (!(A & M) ? 0 : M * C) -> A & (N + M) * C
3683
+ if (match (I.getOperand (0 ),
3684
+ m_Select (m_Value (Cond0), m_APInt (Op0Eq), m_APInt (Op0Ne))) &&
3685
+ match (I.getOperand (1 ),
3686
+ m_Select (m_Value (Cond1), m_APInt (Op1Eq), m_APInt (Op1Ne)))) {
3687
+
3688
+ auto LHSDecompose =
3689
+ decomposeBitTest (Cond0, /* LookThruTrunc=*/ true ,
3690
+ /* AllowNonZeroC=*/ false , /* DecomposeAnd=*/ true );
3691
+ auto RHSDecompose =
3692
+ decomposeBitTest (Cond1, /* LookThruTrunc=*/ true ,
3693
+ /* AllowNonZeroC=*/ false , /* DecomposeAnd=*/ true );
3694
+
3695
+ if (LHSDecompose && RHSDecompose && LHSDecompose->X == RHSDecompose->X &&
3696
+ RHSDecompose->Mask .isPowerOf2 () && LHSDecompose->Mask .isPowerOf2 () &&
3697
+ LHSDecompose->Mask != RHSDecompose->Mask &&
3698
+ LHSDecompose->Mask .getBitWidth () == Op0Ne->getBitWidth () &&
3699
+ RHSDecompose->Mask .getBitWidth () == Op1Ne->getBitWidth ()) {
3700
+ assert (Op0Ne->getBitWidth () == Op1Ne->getBitWidth ());
3701
+ assert (ICmpInst::isEquality (LHSDecompose->Pred ));
3702
+ if (LHSDecompose->Pred == ICmpInst::ICMP_NE)
3703
+ std::swap (Op0Eq, Op0Ne);
3704
+ if (RHSDecompose->Pred == ICmpInst::ICMP_NE)
3705
+ std::swap (Op1Eq, Op1Ne);
3706
+
3707
+ if (!Op0Ne->isZero () && !Op1Ne->isZero () && Op0Eq->isZero () &&
3708
+ Op1Eq->isZero () && Op0Ne->urem (LHSDecompose->Mask ).isZero () &&
3709
+ Op1Ne->urem (RHSDecompose->Mask ).isZero () &&
3710
+ Op0Ne->udiv (LHSDecompose->Mask ) ==
3711
+ Op1Ne->udiv (RHSDecompose->Mask )) {
3712
+ auto NewAnd = Builder.CreateAnd (
3713
+ LHSDecompose->X ,
3714
+ ConstantInt::get (LHSDecompose->X ->getType (),
3715
+ (LHSDecompose->Mask + RHSDecompose->Mask )));
3716
+
3717
+ return BinaryOperator::CreateMul (
3718
+ NewAnd, ConstantInt::get (NewAnd->getType (),
3719
+ Op0Ne->udiv (LHSDecompose->Mask )));
3720
+ }
3721
+ }
3722
+ }
3677
3723
}
3678
3724
3679
3725
Value *X, *Y;
0 commit comments