21 Type truncating_to_zero = Type::MinusZeroOrNaN();
22 DCHECK(!truncating_to_zero.
Maybe(Type::Integral32()));
48 static const double kWeakenMinLimits[] = {0.0,
69 static const double kWeakenMaxLimits[] = {0.0,
92 double current_min = current_range.
Min();
93 double new_min = current_min;
96 if (current_min != previous_range.
Min()) {
98 for (
double const min : kWeakenMinLimits) {
99 if (min <= current_min) {
106 double current_max = current_range.
Max();
107 double new_max = current_max;
110 if (current_max != previous_range.
Max()) {
112 for (
double const max : kWeakenMaxLimits) {
113 if (max >= current_max) {
124 if (type.IsRange())
return type;
139 for (
size_t i = 0;
i <
n; ++
i) {
140 if (!std::isnan(a[
i])) {
141 x = std::min(a[
i],
x);
145 return x == 0 ? 0 :
x;
154 for (
size_t i = 0;
i <
n; ++
i) {
155 if (!std::isnan(a[
i])) {
156 x = std::max(a[
i],
x);
160 return x == 0 ? 0 :
x;
168 results[0] = lhs_min + rhs_min;
169 results[1] = lhs_min + rhs_max;
170 results[2] = lhs_max + rhs_min;
171 results[3] = lhs_max + rhs_max;
177 for (
int i = 0;
i < 4; ++
i) {
178 if (std::isnan(results[
i])) ++nans;
180 if (nans == 4)
return Type::NaN();
192 double rhs_min,
double rhs_max) {
194 results[0] = lhs_min - rhs_min;
195 results[1] = lhs_min - rhs_max;
196 results[2] = lhs_max - rhs_min;
197 results[3] = lhs_max - rhs_max;
203 for (
int i = 0;
i < 4; ++
i) {
204 if (std::isnan(results[
i])) ++nans;
206 if (nans == 4)
return Type::NaN();
217 double rhs_min,
double rhs_max) {
219 results[0] = lhs_min * rhs_min;
220 results[1] = lhs_min * rhs_max;
221 results[2] = lhs_max * rhs_min;
222 results[3] = lhs_max * rhs_max;
227 for (
int i = 0;
i < 4; ++
i) {
228 if (std::isnan(results[
i])) {
235 if (min <= 0.0 && 0.0 <= max && (lhs_min < 0.0 || rhs_min < 0.0)) {
240 (rhs_min <= 0.0 && 0.0 <= rhs_max)) ||
242 (lhs_min <= 0.0 && 0.0 <= lhs_max))) {
248Type OperationTyper::ConvertReceiver(
Type type) {
249 if (type.Is(Type::Receiver()))
return type;
250 bool const maybe_primitive = type.
Maybe(Type::Primitive());
252 if (maybe_primitive) {
262 if (type.Is(Type::Number()))
return type;
268 if (type.Maybe(Type::StringOrReceiver()))
return Type::Number();
277 DCHECK(type.Is(Type::NumberOrOddball()));
278 if (type.Maybe(Type::Null())) {
282 if (type.Maybe(Type::Undefined())) {
301 type.
Maybe(Type::BigInt()) || type.Maybe(Type::Receiver());
309 if (type.Is(Type::BigInt())) {
313 return Type::BigInt();
317 if (type.Is(Type::Unsigned32OrMinusZero())) {
318 return Type::UnsignedBigInt63();
319 }
else if (type.Is(Type::Signed32OrMinusZero())) {
320 return Type::SignedBigInt64();
324 type.
Maybe(Type::Number()) || type.Maybe(Type::Receiver());
332 if (type.Maybe(Type::Receiver())) {
339Type OperationTyper::NumberAbs(
Type type) {
340 DCHECK(type.Is(Type::Number()));
341 if (type.IsNone())
return type;
343 bool const maybe_nan = type.Maybe(Type::NaN());
344 bool const maybe_minuszero = type.Maybe(Type::MinusZero());
347 if (!type.IsNone()) {
348 double const max = type.Max();
349 double const min = type.Min();
355 type = Type::PlainNumber();
360 if (maybe_minuszero) {
369Type OperationTyper::NumberAcos(Type type) {
370 DCHECK(type.Is(Type::Number()));
371 return Type::Number();
374Type OperationTyper::NumberAcosh(Type type) {
375 DCHECK(type.Is(Type::Number()));
376 return Type::Number();
379Type OperationTyper::NumberAsin(Type type) {
380 DCHECK(type.Is(Type::Number()));
381 return Type::Number();
384Type OperationTyper::NumberAsinh(Type type) {
385 DCHECK(type.Is(Type::Number()));
386 return Type::Number();
389Type OperationTyper::NumberAtan(Type type) {
390 DCHECK(type.Is(Type::Number()));
391 return Type::Number();
394Type OperationTyper::NumberAtanh(Type type) {
395 DCHECK(type.Is(Type::Number()));
396 return Type::Number();
399Type OperationTyper::NumberCbrt(Type type) {
400 DCHECK(type.Is(Type::Number()));
401 return Type::Number();
404Type OperationTyper::NumberCeil(Type type) {
405 DCHECK(type.Is(Type::Number()));
412Type OperationTyper::NumberClz32(Type type) {
413 DCHECK(type.Is(Type::Number()));
417Type OperationTyper::NumberCos(Type type) {
418 DCHECK(type.Is(Type::Number()));
419 return Type::Number();
422Type OperationTyper::NumberCosh(Type type) {
423 DCHECK(type.Is(Type::Number()));
424 return Type::Number();
427Type OperationTyper::NumberExp(Type type) {
428 DCHECK(type.Is(Type::Number()));
432Type OperationTyper::NumberExpm1(Type type) {
433 DCHECK(type.Is(Type::Number()));
434 return Type::Number();
437Type OperationTyper::NumberFloor(Type type) {
438 DCHECK(type.Is(Type::Number()));
445Type OperationTyper::NumberFround(Type type) {
446 DCHECK(type.Is(Type::Number()));
447 return Type::Number();
450Type OperationTyper::NumberLog(Type type) {
451 DCHECK(type.Is(Type::Number()));
452 return Type::Number();
455Type OperationTyper::NumberLog1p(Type type) {
456 DCHECK(type.Is(Type::Number()));
457 return Type::Number();
460Type OperationTyper::NumberLog2(Type type) {
461 DCHECK(type.Is(Type::Number()));
462 return Type::Number();
465Type OperationTyper::NumberLog10(Type type) {
466 DCHECK(type.Is(Type::Number()));
467 return Type::Number();
470Type OperationTyper::NumberRound(Type type) {
471 DCHECK(type.Is(Type::Number()));
478Type OperationTyper::NumberSign(Type type) {
479 DCHECK(type.Is(Type::Number()));
481 bool maybe_minuszero = type.Maybe(Type::MinusZero());
482 bool maybe_nan = type.Maybe(Type::NaN());
486 }
else if (type.Max() < 0.0) {
488 }
else if (type.Max() <= 0.0) {
490 }
else if (type.Min() > 0.0) {
492 }
else if (type.Min() >= 0.0) {
497 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
503Type OperationTyper::NumberSin(Type type) {
504 DCHECK(type.Is(Type::Number()));
505 return Type::Number();
508Type OperationTyper::NumberSinh(Type type) {
509 DCHECK(type.Is(Type::Number()));
510 return Type::Number();
513Type OperationTyper::NumberSqrt(Type type) {
514 DCHECK(type.Is(Type::Number()));
515 return Type::Number();
518Type OperationTyper::NumberTan(Type type) {
519 DCHECK(type.Is(Type::Number()));
520 return Type::Number();
523Type OperationTyper::NumberTanh(Type type) {
524 DCHECK(type.Is(Type::Number()));
525 return Type::Number();
528Type OperationTyper::NumberTrunc(Type type) {
529 DCHECK(type.Is(Type::Number()));
536Type OperationTyper::NumberToBoolean(Type type) {
537 DCHECK(type.Is(Type::Number()));
538 if (type.IsNone())
return type;
540 if (type.Is(Type::PlainNumber()) && (type.Max() < 0 || 0 < type.Min())) {
543 return Type::Boolean();
546Type OperationTyper::NumberToInt32(Type type) {
547 DCHECK(type.Is(Type::Number()));
549 if (type.Is(Type::Signed32()))
return type;
553 Type::Signed32(),
zone());
555 return Type::Signed32();
558Type OperationTyper::NumberToString(Type type) {
559 DCHECK(type.Is(Type::Number()));
560 if (type.IsNone())
return type;
563 return Type::String();
566Type OperationTyper::NumberToUint32(Type type) {
567 DCHECK(type.Is(Type::Number()));
569 if (type.Is(Type::Unsigned32()))
return type;
573 Type::Unsigned32(),
zone());
575 return Type::Unsigned32();
578Type OperationTyper::NumberToUint8Clamped(Type type) {
579 DCHECK(type.Is(Type::Number()));
585Type OperationTyper::Integral32OrMinusZeroToBigInt(Type type) {
586 DCHECK(type.Is(Type::Number()));
588 if (type.Is(Type::Unsigned32OrMinusZero())) {
589 return Type::UnsignedBigInt63();
591 if (type.Is(Type::Signed32OrMinusZero())) {
592 return Type::SignedBigInt64();
594 return Type::BigInt();
597Type OperationTyper::NumberSilenceNaN(Type type) {
598 DCHECK(type.Is(Type::Number()));
602 if (type.Maybe(Type::NaN()))
return Type::Number();
606Type OperationTyper::SpeculativeBigIntAsIntN(Type) {
607 return Type::SignedBigInt64();
610Type OperationTyper::SpeculativeBigIntAsUintN(Type) {
611 return Type::UnsignedBigInt64();
614Type OperationTyper::CheckBigInt(Type type) {
return Type::BigInt(); }
616Type OperationTyper::CheckedBigIntToBigInt64(Type type) {
617 return Type::SignedBigInt64();
620Type OperationTyper::NumberAdd(Type lhs, Type rhs) {
621 DCHECK(lhs.Is(Type::Number()));
622 DCHECK(rhs.Is(Type::Number()));
624 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
628 bool maybe_nan = lhs.Maybe(Type::NaN()) || rhs.Maybe(Type::NaN());
631 bool maybe_minuszero =
true;
632 if (lhs.Maybe(Type::MinusZero())) {
635 maybe_minuszero =
false;
637 if (rhs.Maybe(Type::MinusZero())) {
640 maybe_minuszero =
false;
647 if (!lhs.IsNone() && !rhs.IsNone()) {
649 type =
AddRanger(lhs.Min(), lhs.Max(), rhs.Min(), rhs.Max());
655 type = Type::PlainNumber();
660 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
665Type OperationTyper::NumberSubtract(Type lhs, Type rhs) {
666 DCHECK(lhs.Is(Type::Number()));
667 DCHECK(rhs.Is(Type::Number()));
669 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
673 bool maybe_nan = lhs.Maybe(Type::NaN()) || rhs.Maybe(Type::NaN());
677 bool maybe_minuszero =
false;
678 if (lhs.Maybe(Type::MinusZero())) {
682 if (rhs.Maybe(Type::MinusZero())) {
690 if (!lhs.IsNone() && !rhs.IsNone()) {
692 type =
SubtractRanger(lhs.Min(), lhs.Max(), rhs.Min(), rhs.Max());
698 type = Type::PlainNumber();
703 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
708Type OperationTyper::SpeculativeAdditiveSafeIntegerAdd(Type lhs, Type rhs) {
709 Type
result = SpeculativeNumberAdd(lhs, rhs);
717Type OperationTyper::SpeculativeAdditiveSafeIntegerSubtract(Type lhs,
719 Type
result = SpeculativeNumberSubtract(lhs, rhs);
727Type OperationTyper::SpeculativeSmallIntegerAdd(Type lhs, Type rhs) {
728 Type
result = SpeculativeNumberAdd(lhs, rhs);
737Type OperationTyper::SpeculativeSmallIntegerSubtract(Type lhs, Type rhs) {
738 Type
result = SpeculativeNumberSubtract(lhs, rhs);
747Type OperationTyper::NumberMultiply(Type lhs, Type rhs) {
748 DCHECK(lhs.Is(Type::Number()));
749 DCHECK(rhs.Is(Type::Number()));
751 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
752 if (lhs.Is(Type::NaN()) || rhs.Is(Type::NaN()))
return Type::NaN();
757 bool maybe_nan = lhs.Maybe(Type::NaN()) || rhs.Maybe(Type::NaN()) ||
768 bool maybe_minuszero = lhs.Maybe(Type::MinusZero()) ||
769 rhs.Maybe(Type::MinusZero()) ||
772 if (lhs.Maybe(Type::MinusZero())) {
776 if (rhs.Maybe(Type::MinusZero())) {
784 : Type::OrderedNumber();
787 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
792Type OperationTyper::NumberDivide(Type lhs, Type rhs) {
793 DCHECK(lhs.Is(Type::Number()));
794 DCHECK(rhs.Is(Type::Number()));
796 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
797 if (lhs.Is(Type::NaN()) || rhs.Is(Type::NaN()))
return Type::NaN();
800 bool maybe_nan = lhs.Maybe(Type::NaN()) || rhs.Maybe(
cache_->
kZeroish) ||
809 bool maybe_minuszero =
815 Type type = Type::PlainNumber();
816 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
821Type OperationTyper::NumberModulus(Type lhs, Type rhs) {
822 DCHECK(lhs.Is(Type::Number()));
823 DCHECK(rhs.Is(Type::Number()));
825 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
829 bool maybe_nan = lhs.Maybe(Type::NaN()) || rhs.Maybe(
cache_->
kZeroish) ||
833 bool maybe_minuszero =
false;
834 if (lhs.Maybe(Type::MinusZero())) {
835 maybe_minuszero =
true;
838 if (rhs.Maybe(Type::MinusZero())) {
851 double const lmin = lhs.Min();
852 double const lmax = lhs.Max();
853 double const rmin = rhs.Min();
854 double const rmax = rhs.Max();
857 if (lmin < 0.0) maybe_minuszero =
true;
861 double labs = std::max(std::abs(lmin), std::abs(lmax));
862 double rabs = std::max(std::abs(rmin), std::abs(rmax)) - 1;
863 double abs = std::min(labs, rabs);
864 double min = 0.0, max = 0.0;
869 }
else if (lmax <= 0.0) {
880 type = Type::PlainNumber();
885 if (maybe_minuszero) type =
Type::Union(type, Type::MinusZero(),
zone());
890Type OperationTyper::NumberBitwiseOr(Type lhs, Type rhs) {
891 DCHECK(lhs.Is(Type::Number()));
892 DCHECK(rhs.Is(Type::Number()));
897 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
899 double lmin = lhs.Min();
900 double rmin = rhs.Min();
901 double lmax = lhs.Max();
902 double rmax = rhs.Max();
906 lmin >= 0 && rmin >= 0 ? std::max(lmin, rmin) :
std::min(lmin, rmin);
910 if (rmin == 0 && rmax == 0) {
914 if (lmin == 0 && lmax == 0) {
919 if (lmax < 0 || rmax < 0) {
922 max = std::min(max, -1.0);
927Type OperationTyper::NumberBitwiseAnd(Type lhs, Type rhs) {
928 DCHECK(lhs.Is(Type::Number()));
929 DCHECK(rhs.Is(Type::Number()));
934 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
936 double lmin = lhs.Min();
937 double rmin = rhs.Min();
938 double lmax = lhs.Max();
939 double rmax = rhs.Max();
944 lmin >= 0 && rmin >= 0 ? std::min(lmax, rmax) :
std::max(lmax, rmax);
949 max = std::min(max, lmax);
953 max = std::min(max, rmax);
958Type OperationTyper::NumberBitwiseXor(Type lhs, Type rhs) {
959 DCHECK(lhs.Is(Type::Number()));
960 DCHECK(rhs.Is(Type::Number()));
965 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
967 double lmin = lhs.Min();
968 double rmin = rhs.Min();
969 double lmax = lhs.Max();
970 double rmax = rhs.Max();
971 if ((lmin >= 0 && rmin >= 0) || (lmax < 0 && rmax < 0)) {
973 return Type::Unsigned31();
975 if ((lmax < 0 && rmin >= 0) || (lmin >= 0 && rmax < 0)) {
978 return Type::Negative32();
980 return Type::Signed32();
983Type OperationTyper::NumberShiftLeft(Type lhs, Type rhs) {
984 DCHECK(lhs.Is(Type::Number()));
985 DCHECK(rhs.Is(Type::Number()));
990 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
994 uint32_t min_rhs = rhs.Min();
995 uint32_t max_rhs = rhs.Max();
1002 if (max_lhs > (
kMaxInt >> max_rhs) || min_lhs < (
kMinInt >> max_rhs)) {
1004 return Type::Signed32();
1008 std::min(
static_cast<int32_t>(
static_cast<uint32_t
>(min_lhs) << min_rhs),
1009 static_cast<int32_t>(
static_cast<uint32_t
>(min_lhs) << max_rhs));
1011 std::max(
static_cast<int32_t>(
static_cast<uint32_t
>(max_lhs) << min_rhs),
1012 static_cast<int32_t>(
static_cast<uint32_t
>(max_lhs) << max_rhs));
1018Type OperationTyper::NumberShiftRight(Type lhs, Type rhs) {
1019 DCHECK(lhs.Is(Type::Number()));
1020 DCHECK(rhs.Is(Type::Number()));
1025 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
1029 uint32_t min_rhs = rhs.Min();
1030 uint32_t max_rhs = rhs.Max();
1036 double min = std::min(min_lhs >> min_rhs, min_lhs >> max_rhs);
1037 double max = std::max(max_lhs >> min_rhs, max_lhs >> max_rhs);
1043Type OperationTyper::NumberShiftRightLogical(Type lhs, Type rhs) {
1044 DCHECK(lhs.Is(Type::Number()));
1045 DCHECK(rhs.Is(Type::Number()));
1050 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
1052 uint32_t min_lhs = lhs.Min();
1053 uint32_t max_lhs = lhs.Max();
1054 uint32_t min_rhs = rhs.Min();
1055 uint32_t max_rhs = rhs.Max();
1062 double min = min_lhs >> max_rhs;
1063 double max = max_lhs >> min_rhs;
1067 if (min == 0 && max ==
kMaxInt)
return Type::Unsigned31();
1068 if (min == 0 && max ==
kMaxUInt32)
return Type::Unsigned32();
1072Type OperationTyper::NumberAtan2(Type lhs, Type rhs) {
1073 DCHECK(lhs.Is(Type::Number()));
1074 DCHECK(rhs.Is(Type::Number()));
1075 return Type::Number();
1078Type OperationTyper::NumberImul(Type lhs, Type rhs) {
1079 DCHECK(lhs.Is(Type::Number()));
1080 DCHECK(rhs.Is(Type::Number()));
1082 return Type::Signed32();
1085Type OperationTyper::NumberMax(Type lhs, Type rhs) {
1086 DCHECK(lhs.Is(Type::Number()));
1087 DCHECK(rhs.Is(Type::Number()));
1089 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
1090 if (lhs.Is(Type::NaN()) || rhs.Is(Type::NaN()))
return Type::NaN();
1093 if (lhs.Maybe(Type::NaN()) || rhs.Maybe(Type::NaN())) {
1096 if (lhs.Maybe(Type::MinusZero()) || rhs.Maybe(Type::MinusZero())) {
1113 double min = std::max(lhs.Min(), rhs.Min());
1114 double max = std::max(lhs.Max(), rhs.Max());
1120Type OperationTyper::NumberMin(Type lhs, Type rhs) {
1121 DCHECK(lhs.Is(Type::Number()));
1122 DCHECK(rhs.Is(Type::Number()));
1124 if (lhs.IsNone() || rhs.IsNone())
return Type::None();
1125 if (lhs.Is(Type::NaN()) || rhs.Is(Type::NaN()))
return Type::NaN();
1128 if (lhs.Maybe(Type::NaN()) || rhs.Maybe(Type::NaN())) {
1131 if (lhs.Maybe(Type::MinusZero()) || rhs.Maybe(Type::MinusZero())) {
1148 double min = std::min(lhs.Min(), rhs.Min());
1149 double max = std::min(lhs.Max(), rhs.Max());
1155Type OperationTyper::NumberPow(Type lhs, Type rhs) {
1156 DCHECK(lhs.Is(Type::Number()));
1157 DCHECK(rhs.Is(Type::Number()));
1159 return Type::Number();
1162#define SPECULATIVE_NUMBER_BINOP(Name) \
1163 Type OperationTyper::Speculative##Name(Type lhs, Type rhs) { \
1164 lhs = SpeculativeToNumber(lhs); \
1165 rhs = SpeculativeToNumber(rhs); \
1166 return Name(lhs, rhs); \
1180#undef SPECULATIVE_NUMBER_BINOP
1182#define MACHINE_BINOP(Name) \
1183 Type OperationTyper::Name(Type, Type) { return Type::Machine(); }
1188 return Type::Machine();
1191#define BIGINT_BINOP(Name) \
1192 Type OperationTyper::Name(Type lhs, Type rhs) { \
1193 DCHECK(lhs.Is(Type::BigInt())); \
1194 DCHECK(rhs.Is(Type::BigInt())); \
1195 if (lhs.IsNone() || rhs.IsNone()) return Type::None(); \
1196 return Type::BigInt(); \
1201Type OperationTyper::BigIntNegate(Type type) {
1202 DCHECK(type.Is(Type::BigInt()));
1204 if (type.IsNone())
return type;
1205 return Type::BigInt();
1208#define SPECULATIVE_BIGINT_BINOP(Name) \
1209 Type OperationTyper::Name(Type lhs, Type rhs) { \
1210 if (lhs.IsNone() || rhs.IsNone()) return Type::None(); \
1211 return Type::BigInt(); \
1214#undef SPECULATIVE_BIGINT_BINOP
1216Type OperationTyper::SpeculativeBigIntNegate(Type type) {
1217 if (type.IsNone())
return type;
1218 return Type::BigInt();
1221Type OperationTyper::SpeculativeToBigInt(Type type) {
1225Type OperationTyper::SpeculativeToNumber(Type type) {
1230 if (type.Is(Type::Primitive())) {
1233 return Type::Primitive();
1237 DCHECK(type.Is(Type::Boolean()));
1238 CHECK(!type.IsNone());
1267 if (type.Is(Type::Boolean()))
return Type::Boolean();
1268 if (type.Is(Type::String()))
return Type::String();
1269 if (type.Is(Type::Number()))
return Type::Number();
1270 if (type.Is(Type::BigInt()))
return Type::BigInt();
1271 if (type.Is(Type::Undefined()))
return Type::Undefined();
1272 if (type.Is(Type::Null()))
return Type::Null();
1273 if (type.Is(Type::Symbol()))
return Type::Symbol();
1274 if (type.Is(Type::Receiver()))
return Type::Receiver();
1283 if (lhs.
Is(Type::NaN())) {
1286 }
else if (rhs.
Is(Type::NaN())) {
1289 if (lhs.
Is(Type::MinusZero())) {
1292 }
else if (rhs.
Is(Type::MinusZero())) {
1295 if (lhs.
Is(Type::OrderedNumber()) && rhs.
Is(Type::OrderedNumber()) &&
1299 return Type::Boolean();
1314 if (lhs.
Is(Type::Number()) && rhs.
Is(Type::Number()) &&
1324 if ((lhs.
Is(Type::Unique()) || rhs.
Is(Type::Unique())) && !lhs.
Maybe(rhs)) {
1328 return Type::Boolean();
1335 if (index.Maybe(Type::String()))
return upper_bound;
1336 if (index.Maybe(Type::MinusZero())) {
1343 if (type.Maybe(Type::Hole())) {
1364 if (input.Maybe(Type::Hole())) {
1373 if (type.Is(Type::Boolean()))
return type;
1376 if (type.Is(Type::Number())) {
1377 return NumberToBoolean(type);
1379 return Type::Boolean();
OperationTyper(JSHeapBroker *broker, Zone *zone)
Type SameValue(Type lhs, Type rhs)
Type StrictEqual(Type lhs, Type rhs)
Type TypeTypeGuard(const Operator *sigma_op, Type input)
Type CheckFloat64Hole(Type type)
Type AddRanger(double lhs_min, double lhs_max, double rhs_min, double rhs_max)
Type CheckNumber(Type type)
Type ToBigIntConvertNumber(Type type)
Type ToNumeric(Type type)
Type FalsifyUndefined(ComparisonOutcome)
Type Merge(Type left, Type right)
Type ChangeUint32ToUint64(Type input)
ComparisonOutcome Invert(ComparisonOutcome)
Type WeakenRange(Type current_range, Type previous_range)
Type ToNumberConvertBigInt(Type type)
Type ConvertTaggedHoleToUndefined(Type type)
Type SubtractRanger(double lhs_min, double lhs_max, double rhs_min, double rhs_max)
Type singleton_false() const
Type SameValueNumbersOnly(Type lhs, Type rhs)
Type singleton_true() const
Type singleton_empty_string_
Type singleton_zero_string_
Type MultiplyRanger(double lhs_min, double lhs_max, double rhs_min, double rhs_max)
Type ToPrimitive(Type type)
Type CheckBounds(Type index, Type length)
Type ToBoolean(Type type)
Type singleton_NaN_string_
Type CheckNumberFitsInt32(Type type)
Type const kSafeIntegerOrMinusZero
Type const kZeroToThirtyTwo
Type const kAdditiveSafeInteger
Type const kIntegerOrMinusZero
Type const kIntegerOrMinusZeroOrNaN
Type const kSingletonMinusOne
Type const kMinusOneOrZero
Type const kZeroOrMinusZero
Type const kPositiveSafeInteger
Type const kSingletonZero
static Type Union(Type type1, Type type2, Zone *zone)
bool Maybe(Type that) const
static Type Constant(JSHeapBroker *broker, Handle< i::Object > value, Zone *zone)
static Type Intersect(Type type1, Type type2, Zone *zone)
static Type Range(double min, double max, Zone *zone)
ZoneVector< RpoNumber > & result
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
T array_min(const std::array< T, N > &a)
T array_max(const std::array< T, N > &a)
Type TypeGuardTypeOf(Operator const *op)
uint32_t NumberToUint32(Tagged< Object > number)
int32_t NumberToInt32(Tagged< Object > number)
constexpr uint32_t kMaxUInt32
#define SIMPLIFIED_BIGINT_BINOP_LIST(V)
#define SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(V)
#define SPECULATIVE_BIGINT_BINOP(Name)
#define SPECULATIVE_NUMBER_BINOP(Name)
#define MACHINE_BINOP(Name)
#define BIGINT_BINOP(Name)
#define TYPER_SUPPORTED_MACHINE_BINOP_LIST(V)
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)