| Index: src/compiler/typer.cc
|
| diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
|
| index 15044ac5a07af35e4c6824839401812297ee260f..a36d6896f1876953c9c8cc5a25fe21c4f8c4baa5 100644
|
| --- a/src/compiler/typer.cc
|
| +++ b/src/compiler/typer.cc
|
| @@ -156,9 +156,7 @@ Typer::Typer(Isolate* isolate, Graph* graph, MaybeHandle<Context> context)
|
| graph_(graph),
|
| context_(context),
|
| decorator_(NULL),
|
| - cache_(new (graph->zone()) LazyTypeCache(isolate, graph->zone())),
|
| - weaken_min_limits_(graph->zone()),
|
| - weaken_max_limits_(graph->zone()) {
|
| + cache_(new (graph->zone()) LazyTypeCache(isolate, graph->zone())) {
|
| Zone* zone = this->zone();
|
| Factory* f = isolate->factory();
|
|
|
| @@ -202,20 +200,6 @@ Typer::Typer(Isolate* isolate, Graph* graph, MaybeHandle<Context> context)
|
| weakint_fun1_ = Type::Function(weakint, number, zone);
|
| random_fun_ = Type::Function(Type::OrderedNumber(), zone);
|
|
|
| - const int limits_count = 20;
|
| -
|
| - weaken_min_limits_.reserve(limits_count + 1);
|
| - weaken_max_limits_.reserve(limits_count + 1);
|
| -
|
| - double limit = 1 << 30;
|
| - weaken_min_limits_.push_back(0);
|
| - weaken_max_limits_.push_back(0);
|
| - for (int i = 0; i < limits_count; i++) {
|
| - weaken_min_limits_.push_back(-limit);
|
| - weaken_max_limits_.push_back(limit - 1);
|
| - limit *= 2;
|
| - }
|
| -
|
| decorator_ = new (zone) Decorator(this);
|
| graph_->AddDecorator(decorator_);
|
| }
|
| @@ -1305,6 +1289,22 @@ Bounds Typer::Visitor::TypeJSLoadNamed(Node* node) {
|
| // in the graph. In the current implementation, we are
|
| // increasing the limits to the closest power of two.
|
| Type* Typer::Visitor::Weaken(Type* current_type, Type* previous_type) {
|
| + static const double kWeakenMinLimits[] = {
|
| + 0.0, -1073741824.0, -2147483648.0, -4294967296.0, -8589934592.0,
|
| + -17179869184.0, -34359738368.0, -68719476736.0, -137438953472.0,
|
| + -274877906944.0, -549755813888.0, -1099511627776.0, -2199023255552.0,
|
| + -4398046511104.0, -8796093022208.0, -17592186044416.0, -35184372088832.0,
|
| + -70368744177664.0, -140737488355328.0, -281474976710656.0,
|
| + -562949953421312.0};
|
| + static const double kWeakenMaxLimits[] = {
|
| + 0.0, 1073741823.0, 2147483647.0, 4294967295.0, 8589934591.0,
|
| + 17179869183.0, 34359738367.0, 68719476735.0, 137438953471.0,
|
| + 274877906943.0, 549755813887.0, 1099511627775.0, 2199023255551.0,
|
| + 4398046511103.0, 8796093022207.0, 17592186044415.0, 35184372088831.0,
|
| + 70368744177663.0, 140737488355327.0, 281474976710655.0,
|
| + 562949953421311.0};
|
| + STATIC_ASSERT(arraysize(kWeakenMinLimits) == arraysize(kWeakenMaxLimits));
|
| +
|
| // If the types have nothing to do with integers, return the types.
|
| if (!current_type->Maybe(typer_->integer) ||
|
| !previous_type->Maybe(typer_->integer)) {
|
| @@ -1325,9 +1325,9 @@ Type* Typer::Visitor::Weaken(Type* current_type, Type* previous_type) {
|
| // minima (or negative infinity if there is no such entry).
|
| if (current_min != previous->Min()) {
|
| new_min = typer_->integer->AsRange()->Min();
|
| - for (const auto val : typer_->weaken_min_limits_) {
|
| - if (val <= current_min) {
|
| - new_min = val;
|
| + for (double const min : kWeakenMinLimits) {
|
| + if (min <= current_min) {
|
| + new_min = min;
|
| break;
|
| }
|
| }
|
| @@ -1339,9 +1339,9 @@ Type* Typer::Visitor::Weaken(Type* current_type, Type* previous_type) {
|
| // maxima (or infinity if there is no such entry).
|
| if (current_max != previous->Max()) {
|
| new_max = typer_->integer->AsRange()->Max();
|
| - for (const auto val : typer_->weaken_max_limits_) {
|
| - if (val >= current_max) {
|
| - new_max = val;
|
| + for (double const max : kWeakenMaxLimits) {
|
| + if (max >= current_max) {
|
| + new_max = max;
|
| break;
|
| }
|
| }
|
|
|