================
@@ -892,3 +892,37 @@ VPValue *VPSCEVExpander::tryToExpand(const SCEV *S) {
     return nullptr;
   }
 }
+
+VPValue *VPSCEVExpander::tryToExpandPredicate(const SCEVPredicate *Pred) {
+  if (auto *CmpPred = dyn_cast<SCEVComparePredicate>(Pred)) {
+    VPValue *LHS = tryToExpand(CmpPred->getLHS());
+    if (!LHS)
+      return nullptr;
+    VPValue *RHS = tryToExpand(CmpPred->getRHS());
+    if (!RHS)
+      return nullptr;
+    // Match SCEVExpander::expandComparePredicate behavior:
+    auto InvPred = CmpInst::getInversePredicate(CmpPred->getPredicate());
+    return Builder.createICmp(InvPred, LHS, RHS, DL);
+  }
+
+  if (auto *UnionPred = dyn_cast<SCEVUnionPredicate>(Pred)) {
+    SmallVector<VPValue *, 4> Checks;
+    for (const auto *Pred : UnionPred->getPredicates()) {
+      VPValue *Check = tryToExpandPredicate(Pred);
+      if (!Check)
+        return nullptr;
+      Checks.push_back(Check);
+    }
+
+    if (Checks.empty())
+      return Builder.getPlan().getFalse();
----------------
artagnon wrote:

How can this happen? Can UnionPredicate be empty? We do return nullptr when 
expansion fails in the loop?

https://github.com/llvm/llvm-project/pull/182595
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to