[llvm] [InstCombine] Fold its select user into select (PR #83405)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 8 08:34:22 PST 2024


================
@@ -500,6 +500,42 @@ static bool isSelect01(const APInt &C1I, const APInt &C2I) {
   return C1I.isOne() || C1I.isAllOnes() || C2I.isOne() || C2I.isAllOnes();
 }
 
+/// Try to simplify a select instruction when the user of its select user
+/// indicates the condition.
+static bool simplifySeqSelectWithSameCond(SelectInst &SI,
+                                          const SimplifyQuery &SQ,
+                                          InstCombinerImpl &IC) {
+  Value *CondVal = SI.getCondition();
+  Type *CondType = CondVal->getType();
+
+  SelectInst *SINext = &SI;
+  Type *SelType = SINext->getType();
+  Value *FalseVal = SINext->getFalseValue();
+  Value *CondNext;
+  Value *FalseNext;
+  while (match(FalseVal,
+               m_Select(m_Value(CondNext), m_Value(), m_Value(FalseNext)))) {
+    // If the type of select is not an integer type or if the condition and
+    // the selection type are not both scalar nor both vector types, there is no
+    // point in attempting to match these patterns.
+    if (!isa<Constant>(CondVal) && SelType->isIntOrIntVectorTy() &&
+        CondType->isVectorTy() == SelType->isVectorTy())
----------------
goldsteinn wrote:

Instead of all this why not just match `m_Select(m_Specific(CondVal), ...)`?

Also, why are you only chasing false val?

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


More information about the llvm-commits mailing list