Lines Matching refs:APInt
22 function_ref<Optional<APInt>(const APInt &, const APInt &)>;
28 static ConstantIntRanges computeBoundsBy(ConstArithFn op, const APInt &minLeft, in computeBoundsBy()
29 const APInt &minRight, in computeBoundsBy()
30 const APInt &maxLeft, in computeBoundsBy()
31 const APInt &maxRight, bool isSigned) { in computeBoundsBy()
32 Optional<APInt> maybeMin = op(minLeft, minRight); in computeBoundsBy()
33 Optional<APInt> maybeMax = op(maxLeft, maxRight); in computeBoundsBy()
41 static ConstantIntRanges minMaxBy(ConstArithFn op, ArrayRef<APInt> lhs, in minMaxBy()
42 ArrayRef<APInt> rhs, bool isSigned) { in minMaxBy()
44 APInt min = in minMaxBy()
45 isSigned ? APInt::getSignedMaxValue(width) : APInt::getMaxValue(width); in minMaxBy()
46 APInt max = in minMaxBy()
47 isSigned ? APInt::getSignedMinValue(width) : APInt::getZero(width); in minMaxBy()
48 for (const APInt &left : lhs) { in minMaxBy()
49 for (const APInt &right : rhs) { in minMaxBy()
50 Optional<APInt> maybeThisResult = op(left, right); in minMaxBy()
53 APInt result = std::move(*maybeThisResult); in minMaxBy()
69 const APInt &value = constAttr.getValue(); in inferResultRanges()
81 ConstArithFn uadd = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
83 APInt result = a.uadd_ov(b, overflowed); in inferResultRanges()
84 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
86 ConstArithFn sadd = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
88 APInt result = a.sadd_ov(b, overflowed); in inferResultRanges()
89 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
107 ConstArithFn usub = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
109 APInt result = a.usub_ov(b, overflowed); in inferResultRanges()
110 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
112 ConstArithFn ssub = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
114 APInt result = a.ssub_ov(b, overflowed); in inferResultRanges()
115 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
132 ConstArithFn umul = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
134 APInt result = a.umul_ov(b, overflowed); in inferResultRanges()
135 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
137 ConstArithFn smul = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
139 APInt result = a.smul_ov(b, overflowed); in inferResultRanges()
140 return overflowed ? Optional<APInt>() : result; in inferResultRanges()
159 using DivisionFixupFn = function_ref<Optional<APInt>(
160 const APInt &lhs, const APInt &rhs, const APInt &result)>;
165 const APInt &lhsMin = lhs.umin(), &lhsMax = lhs.umax(), &rhsMin = rhs.umin(), in inferDivUIRange()
169 auto udiv = [&fixup](const APInt &a, const APInt &b) -> Optional<APInt> { in inferDivUIRange()
183 [](const APInt &lhs, const APInt &rhs, in inferResultRanges()
184 const APInt &result) { return result; })); in inferResultRanges()
194 const APInt &lhsMin = lhs.smin(), &lhsMax = lhs.smax(), &rhsMin = rhs.smin(), in inferDivSIRange()
199 auto sdiv = [&fixup](const APInt &a, const APInt &b) -> Optional<APInt> { in inferDivSIRange()
201 APInt result = a.sdiv_ov(b, overflowed); in inferDivSIRange()
202 return overflowed ? Optional<APInt>() : fixup(a, b, result); in inferDivSIRange()
214 [](const APInt &lhs, const APInt &rhs, in inferResultRanges()
215 const APInt &result) { return result; })); in inferResultRanges()
226 DivisionFixupFn ceilDivUIFix = [](const APInt &lhs, const APInt &rhs, in inferResultRanges()
227 const APInt &result) -> Optional<APInt> { in inferResultRanges()
230 APInt corrected = in inferResultRanges()
231 result.uadd_ov(APInt(result.getBitWidth(), 1), overflowed); in inferResultRanges()
232 return overflowed ? Optional<APInt>() : corrected; in inferResultRanges()
247 DivisionFixupFn ceilDivSIFix = [](const APInt &lhs, const APInt &rhs, in inferResultRanges()
248 const APInt &result) -> Optional<APInt> { in inferResultRanges()
251 APInt corrected = in inferResultRanges()
252 result.sadd_ov(APInt(result.getBitWidth(), 1), overflowed); in inferResultRanges()
253 return overflowed ? Optional<APInt>() : corrected; in inferResultRanges()
268 DivisionFixupFn floorDivSIFix = [](const APInt &lhs, const APInt &rhs, in inferResultRanges()
269 const APInt &result) -> Optional<APInt> { in inferResultRanges()
272 APInt corrected = in inferResultRanges()
273 result.ssub_ov(APInt(result.getBitWidth(), 1), overflowed); in inferResultRanges()
274 return overflowed ? Optional<APInt>() : corrected; in inferResultRanges()
288 const APInt &rhsMin = rhs.umin(), &rhsMax = rhs.umax(); in inferResultRanges()
291 APInt umin = APInt::getZero(width); in inferResultRanges()
292 APInt umax = APInt::getMaxValue(width); in inferResultRanges()
298 const APInt &lhsMin = lhs.umin(), &lhsMax = lhs.umax(); in inferResultRanges()
300 APInt minRem = lhsMin.urem(rhsMax); in inferResultRanges()
301 APInt maxRem = lhsMax.urem(rhsMax); in inferResultRanges()
319 const APInt &lhsMin = lhs.smin(), &lhsMax = lhs.smax(), &rhsMin = rhs.smin(), in inferResultRanges()
323 APInt smin = APInt::getSignedMinValue(width); in inferResultRanges()
324 APInt smax = APInt::getSignedMaxValue(width); in inferResultRanges()
328 APInt maxDivisor = rhsMin.isStrictlyPositive() ? rhsMax : rhsMin.abs(); in inferResultRanges()
331 APInt zero = APInt::getZero(maxDivisor.getBitWidth()); in inferResultRanges()
332 APInt maxPositiveResult = maxDivisor - 1; in inferResultRanges()
333 APInt minNegativeResult = -maxPositiveResult; in inferResultRanges()
339 APInt minRem = lhsMin.srem(maxDivisor); in inferResultRanges()
340 APInt maxRem = lhsMax.srem(maxDivisor); in inferResultRanges()
359 static std::tuple<APInt, APInt>
361 APInt leftVal = bound.umin(), rightVal = bound.umax(); in widenBitwiseBounds()
371 APInt lhsZeros, lhsOnes, rhsZeros, rhsOnes; in inferResultRanges()
374 auto andi = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
388 APInt lhsZeros, lhsOnes, rhsZeros, rhsOnes; in inferResultRanges()
391 auto ori = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
405 APInt lhsZeros, lhsOnes, rhsZeros, rhsOnes; in inferResultRanges()
408 auto xori = [](const APInt &a, const APInt &b) -> Optional<APInt> { in inferResultRanges()
424 const APInt &smin = lhs.smin().sgt(rhs.smin()) ? lhs.smin() : rhs.smin(); in inferResultRanges()
425 const APInt &smax = lhs.smax().sgt(rhs.smax()) ? lhs.smax() : rhs.smax(); in inferResultRanges()
437 const APInt &umin = lhs.umin().ugt(rhs.umin()) ? lhs.umin() : rhs.umin(); in inferResultRanges()
438 const APInt &umax = lhs.umax().ugt(rhs.umax()) ? lhs.umax() : rhs.umax(); in inferResultRanges()
450 const APInt &smin = lhs.smin().slt(rhs.smin()) ? lhs.smin() : rhs.smin(); in inferResultRanges()
451 const APInt &smax = lhs.smax().slt(rhs.smax()) ? lhs.smax() : rhs.smax(); in inferResultRanges()
463 const APInt &umin = lhs.umin().ult(rhs.umin()) ? lhs.umin() : rhs.umin(); in inferResultRanges()
464 const APInt &umax = lhs.umax().ult(rhs.umax()) ? lhs.umax() : rhs.umax(); in inferResultRanges()
476 APInt umin = argRanges[0].umin().zext(destWidth); in inferResultRanges()
477 APInt umax = argRanges[0].umax().zext(destWidth); in inferResultRanges()
488 APInt smin = range.smin().sext(destWidth); in extSIRange()
489 APInt smax = range.smax().sext(destWidth); in extSIRange()
506 APInt umin = range.umin().trunc(destWidth); in truncIRange()
507 APInt umax = range.umax().trunc(destWidth); in truncIRange()
508 APInt smin = range.smin().trunc(destWidth); in truncIRange()
509 APInt smax = range.smax().trunc(destWidth); in truncIRange()
558 Optional<APInt> lhsConst = lhs.getConstantValue(); in isStaticallyTrue()
559 Optional<APInt> rhsConst = rhs.getConstantValue(); in isStaticallyTrue()
582 APInt min = APInt::getZero(1); in inferResultRanges()
583 APInt max = APInt::getAllOnesValue(1); in inferResultRanges()
598 Optional<APInt> mbCondVal = argRanges[0].getConstantValue(); in inferResultRanges()
617 ConstArithFn shl = [](const APInt &l, const APInt &r) -> Optional<APInt> { in inferResultRanges()
618 return r.uge(r.getBitWidth()) ? Optional<APInt>() : l.shl(r); in inferResultRanges()
637 ConstArithFn lshr = [](const APInt &l, const APInt &r) -> Optional<APInt> { in inferResultRanges()
638 return r.uge(r.getBitWidth()) ? Optional<APInt>() : l.lshr(r); in inferResultRanges()
653 ConstArithFn ashr = [](const APInt &l, const APInt &r) -> Optional<APInt> { in inferResultRanges()
654 return r.uge(r.getBitWidth()) ? Optional<APInt>() : l.ashr(r); in inferResultRanges()