| Index: src/crankshaft/hydrogen-instructions.cc
|
| diff --git a/src/crankshaft/hydrogen-instructions.cc b/src/crankshaft/hydrogen-instructions.cc
|
| index 6036d3fb68c6e99f250c8a1c22da9fe9aeefa79b..74a83c06a175fa13f4ee59f974eae8035c120c0d 100644
|
| --- a/src/crankshaft/hydrogen-instructions.cc
|
| +++ b/src/crankshaft/hydrogen-instructions.cc
|
| @@ -2195,7 +2195,11 @@ HConstant::HConstant(Handle<Object> object, Representation r)
|
| int32_value_ = DoubleToInt32(n);
|
| bit_field_ = HasSmiValueField::update(
|
| bit_field_, has_int32_value && Smi::IsValid(int32_value_));
|
| - double_value_ = n;
|
| + if (std::isnan(n)) {
|
| + double_value_ = std::numeric_limits<double>::quiet_NaN();
|
| + } else {
|
| + double_value_ = n;
|
| + }
|
| bit_field_ = HasDoubleValueField::update(bit_field_, true);
|
| }
|
|
|
| @@ -2248,7 +2252,6 @@ HConstant::HConstant(int32_t integer_value, Representation r,
|
| Initialize(r);
|
| }
|
|
|
| -
|
| HConstant::HConstant(double double_value, Representation r,
|
| bool is_not_in_new_space, Unique<Object> object)
|
| : object_(object),
|
| @@ -2262,8 +2265,7 @@ HConstant::HConstant(double double_value, Representation r,
|
| !std::isnan(double_value)) |
|
| IsUndetectableField::encode(false) |
|
| InstanceTypeField::encode(kUnknownInstanceType)),
|
| - int32_value_(DoubleToInt32(double_value)),
|
| - double_value_(double_value) {
|
| + int32_value_(DoubleToInt32(double_value)) {
|
| bit_field_ = HasSmiValueField::update(
|
| bit_field_, HasInteger32Value() && Smi::IsValid(int32_value_));
|
| // It's possible to create a constant with a value in Smi-range but stored
|
| @@ -2271,6 +2273,11 @@ HConstant::HConstant(double double_value, Representation r,
|
| bool could_be_heapobject = r.IsTagged() && !object.handle().is_null();
|
| bool is_smi = HasSmiValue() && !could_be_heapobject;
|
| set_type(is_smi ? HType::Smi() : HType::TaggedNumber());
|
| + if (std::isnan(double_value)) {
|
| + double_value_ = std::numeric_limits<double>::quiet_NaN();
|
| + } else {
|
| + double_value_ = double_value;
|
| + }
|
| Initialize(r);
|
| }
|
|
|
| @@ -3289,13 +3296,11 @@ bool HStoreKeyed::NeedsCanonicalization() {
|
| Representation from = HChange::cast(value())->from();
|
| return from.IsTagged() || from.IsHeapObject();
|
| }
|
| - case kLoadNamedField:
|
| - case kPhi: {
|
| - // Better safe than sorry...
|
| - return true;
|
| - }
|
| - default:
|
| + case kConstant:
|
| + // Double constants are canonicalized upon construction.
|
| return false;
|
| + default:
|
| + return !value()->IsBinaryOperation();
|
| }
|
| }
|
|
|
|
|