[llvm] [InstCombine] Fold select (A & Shift == 0 | B & Shift == 0), 0, Shift to Shift & A & B (PR #212132)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 29 01:13:22 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);
----------------
Disservin wrote:

nit: maybe but up to your preference :D 
```c++
bool IsValid =
    Pred2 == Pred1 &&
    ((Case1 && Pred1 == ICmpInst::ICMP_EQ) ||
     (Case2 && Pred1 == ICmpInst::ICMP_NE));
```

https://github.com/llvm/llvm-project/pull/212132


More information about the llvm-commits mailing list