[llvm] [VPlan] Fold common edges away in convertPhisToBlends (PR #150368)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 28 23:38:54 PDT 2025


================
@@ -227,6 +232,20 @@ void VPPredicator::createSwitchEdgeMasks(VPInstruction *SI) {
   setEdgeMask(Src, DefaultDst, DefaultMask);
 }
 
+VPValue *VPPredicator::findCommonEdgeMask(const VPWidenPHIRecipe *PhiR) const {
+  using namespace llvm::VPlanPatternMatch;
+  VPValue *EdgeMask = getEdgeMask(PhiR->getIncomingBlock(0), PhiR->getParent());
+  VPValue *CommonEdgeMask;
+  if (!EdgeMask ||
+      !match(EdgeMask, m_LogicalAnd(m_VPValue(CommonEdgeMask), m_VPValue())))
+    return nullptr;
+  for (unsigned In = 1; In < PhiR->getNumIncoming(); In++)
+    if (!match(getEdgeMask(PhiR->getIncomingBlock(In), PhiR->getParent()),
----------------
lukel97 wrote:

The asserts take place when getEdgeMask fails:

```c++
      VPValue *EdgeMask = getEdgeMask(Pred, VPBB);
      if (!EdgeMask) {
        assert(In == 0 && "Both null and non-null edge masks found");
        assert(all_equal(PhiR->operands()) &&
               "Distinct incoming values with one having a full mask");
        break;
      }
```

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


More information about the llvm-commits mailing list