bool llvm::cannotBeMaxInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed) { unsigned BitWidth = cast<IntegerType>(S->getType())->getBitWidth(); APInt Max = Signed ? APInt::getSignedMaxValue(BitWidth) : APInt::getMaxValue(BitWidth); auto Predicate = Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT; return SE.isAvailableAtLoopEntry(S, L) && SE.isLoopEntryGuardedByCond(L, Predicate, S, SE.getConstant(Max)); }
bool llvm::isKnownNonNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE) { const SCEV *Zero = SE.getZero(S->getType()); return SE.isAvailableAtLoopEntry(S, L) && SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_SGE, S, Zero); }