From 34874b98b3e4b03c2573227c3b1bf69258368bfc Mon Sep 17 00:00:00 2001 From: bmeurer Date: Mon, 1 Dec 2014 23:30:36 -0800 Subject: [PATCH] [turbofan] Workaround inconsistency of the type system. R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/770193002 Cr-Commit-Position: refs/heads/master@{#25594} --- src/compiler/js-typed-lowering.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc index 275dcd7..0015504 100644 --- a/src/compiler/js-typed-lowering.cc +++ b/src/compiler/js-typed-lowering.cc @@ -39,10 +39,22 @@ JSTypedLowering::JSTypedLowering(JSGraph* jsgraph) one_range_ = Type::Range(one, one, zone()); Handle thirtyone = factory->NewNumber(31.0); zero_thirtyone_range_ = Type::Range(zero, thirtyone, zone()); - for (size_t k = 0; k < arraysize(shifted_int32_ranges_); ++k) { - Handle min = factory->NewNumber(kMinInt / (1 << k)); - Handle max = factory->NewNumber(kMaxInt / (1 << k)); - shifted_int32_ranges_[k] = Type::Range(min, max, zone()); + // TODO(jarin): Can we have a correctification of the stupid type system? + // These stupid work-arounds are just stupid! + shifted_int32_ranges_[0] = Type::Signed32(); + if (SmiValuesAre31Bits()) { + shifted_int32_ranges_[1] = Type::SignedSmall(); + for (size_t k = 2; k < arraysize(shifted_int32_ranges_); ++k) { + Handle min = factory->NewNumber(kMinInt / (1 << k)); + Handle max = factory->NewNumber(kMaxInt / (1 << k)); + shifted_int32_ranges_[k] = Type::Range(min, max, zone()); + } + } else { + for (size_t k = 1; k < arraysize(shifted_int32_ranges_); ++k) { + Handle min = factory->NewNumber(kMinInt / (1 << k)); + Handle max = factory->NewNumber(kMaxInt / (1 << k)); + shifted_int32_ranges_[k] = Type::Range(min, max, zone()); + } } } -- 2.7.4