[llvm] [InstCombine] Fold select (A & Shift == 0 | B & Shift == 0), 0, Shift to Shift & A & B (PR #212132)
Shengxin Pei via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 29 01:22:05 PDT 2026
================
@@ -4511,6 +4511,47 @@ static Instruction *foldSelectNegNot(SelectInst &SI,
return nullptr;
}
+/// Fold select (A & Shift == 0 | B & Shift == 0), 0, Shift -> Shift & A & B
+/// where Shift is known to be a power of two.
+static Instruction *foldSelectAndOrPowerOfTwo(SelectInst &SI,
+ InstCombiner::BuilderTy &Builder,
+ const SimplifyQuery &SQ) {
+ Value *Cond = SI.getCondition();
+ Value *TrueVal = SI.getTrueValue();
+ Value *FalseVal = SI.getFalseValue();
+
+ Value *A, *B, *Shift;
+ CmpPredicate Pred1, Pred2;
+
+ bool Case1 =
+ match(TrueVal, m_Zero()) && match(FalseVal, m_Value(Shift)) &&
+ match(Cond, m_c_Or(m_c_ICmp(Pred1, m_And(m_Specific(Shift), m_Value(A)),
+ m_Zero()),
+ m_c_ICmp(Pred2, m_And(m_Specific(Shift), m_Value(B)),
+ m_Zero())));
+
+ bool Case2 =
+ match(FalseVal, m_Zero()) && match(TrueVal, m_Value(Shift)) &&
+ match(Cond, m_c_And(m_c_ICmp(Pred1, m_And(m_Specific(Shift), m_Value(A)),
+ m_Zero()),
+ m_c_ICmp(Pred2, m_And(m_Specific(Shift), m_Value(B)),
+ m_Zero())));
+
+ bool IsValid =
+ (Case1 && Pred1 == ICmpInst::ICMP_EQ && Pred2 == ICmpInst::ICMP_EQ) ||
+ (Case2 && Pred1 == ICmpInst::ICMP_NE && Pred2 == ICmpInst::ICMP_NE);
----------------
TPPPP72 wrote:
Oh, I think it might be better. So this is my first IR patch, feel free to point out any issues!
https://github.com/llvm/llvm-project/pull/212132
More information about the llvm-commits
mailing list