================ @@ -1824,6 +1835,94 @@ RangeSet SymbolicRangeInferrer::VisitBinaryOperator<BO_Rem>(Range LHS, return {RangeFactory, ValueFactory.getValue(Min), ValueFactory.getValue(Max)}; } +RangeSet SymbolicRangeInferrer::handleConcreteModulo(Range LHS, + llvm::APSInt Modulo, + QualType T) { + APSIntType ResultType = ValueFactory.getAPSIntType(T); + llvm::APSInt Zero = ResultType.getZeroValue(); + llvm::APSInt One = ResultType.getValue(1); + + if (Modulo == Zero) + return RangeFactory.getEmptySet(); + if (Modulo < 0) + Modulo = -Modulo; + + auto ComputeModuloN = [&](llvm::APSInt From, llvm::APSInt To, + llvm::APSInt N) -> RangeSet { + assert(N > Zero && "Non-positive N!"); + bool NonNegative = From >= Zero; + assert(NonNegative == (To >= Zero) && "Signedness mismatch!"); + + if (From > To) + return RangeFactory.getEmptySet(); + + llvm::APSInt N1 = N - One; ---------------- danix800 wrote:
This is a problem if N is INT_MIN like value, fixed with quick return on such values. https://github.com/llvm/llvm-project/pull/65448 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits