[llvm] [InstCombine] Combine or-disjoint (and->mul), (and->mul) to and->mul (PR #136013)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed May 21 13:23:54 PDT 2025
================
@@ -3641,6 +3707,22 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
foldAddLikeCommutative(I.getOperand(1), I.getOperand(0),
/*NSW=*/true, /*NUW=*/true))
return R;
+
+ auto Decomp0 = matchBitmaskMul(I.getOperand(0));
+ auto Decomp1 = matchBitmaskMul(I.getOperand(1));
+
+ if (Decomp0 && Decomp1) {
+ if (Decomp0->X == Decomp1->X &&
+ (Decomp0->Mask & Decomp1->Mask).isZero() &&
+ Decomp0->Factor == Decomp1->Factor) {
+ auto NewAnd = Builder.CreateAnd(
+ Decomp0->X, ConstantInt::get(Decomp0->X->getType(),
+ (Decomp0->Mask + Decomp1->Mask)));
+
+ return BinaryOperator::CreateMul(
+ NewAnd, ConstantInt::get(NewAnd->getType(), Decomp1->Factor));
----------------
arsenm wrote:
It appears you can preserve flags on the muls: https://alive2.llvm.org/ce/z/FYMcPK
https://github.com/llvm/llvm-project/pull/136013
More information about the llvm-commits
mailing list