================
@@ -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