| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 4163b50045d8c61a114efbe119d5566e9f24db2e..11cc901b38ccfccf7a3607f99e1088b47b7f4ac9 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -2171,23 +2171,34 @@ void HLoadKeyed::PrintDataTo(StringStream* stream) {
|
| }
|
|
|
|
|
| -bool HLoadKeyed::RequiresHoleCheck() const {
|
| +bool HLoadKeyed::UsesMustHandleHole() const {
|
| if (IsFastPackedElementsKind(elements_kind())) {
|
| return false;
|
| }
|
|
|
| + if (hole_mode() == ALLOW_RETURN_HOLE) return true;
|
| +
|
| if (IsFastDoubleElementsKind(elements_kind())) {
|
| - return true;
|
| + return false;
|
| }
|
|
|
| for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
|
| HValue* use = it.value();
|
| if (!use->IsChange()) {
|
| - return true;
|
| + return false;
|
| }
|
| }
|
|
|
| - return false;
|
| + return true;
|
| +}
|
| +
|
| +
|
| +bool HLoadKeyed::RequiresHoleCheck() const {
|
| + if (IsFastPackedElementsKind(elements_kind())) {
|
| + return false;
|
| + }
|
| +
|
| + return !UsesMustHandleHole();
|
| }
|
|
|
|
|
| @@ -2461,6 +2472,11 @@ HType HAllocateObject::CalculateInferredType() {
|
| }
|
|
|
|
|
| +HType HAllocate::CalculateInferredType() {
|
| + return type_;
|
| +}
|
| +
|
| +
|
| HType HFastLiteral::CalculateInferredType() {
|
| // TODO(mstarzinger): Be smarter, could also be JSArray here.
|
| return HType::JSObject();
|
| @@ -2582,12 +2598,21 @@ HValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) {
|
|
|
|
|
| bool HStoreKeyed::NeedsCanonicalization() {
|
| - // If value is an integer or comes from the result of a keyed load
|
| - // then it will be a non-hole value: no need for canonicalization.
|
| - if (value()->IsLoadKeyed() ||
|
| - (value()->IsChange() && HChange::cast(value())->from().IsInteger32())) {
|
| + // If value is an integer or smi or comes from the result of a keyed load or
|
| + // constant then it is either be a non-hole value or in the case of a constant
|
| + // the hole is only being stored explicitly: no need for canonicalization.
|
| + if (value()->IsLoadKeyed() || value()->IsConstant()) {
|
| return false;
|
| }
|
| +
|
| + if (value()->IsChange()) {
|
| + if (HChange::cast(value())->from().IsInteger32()) {
|
| + return false;
|
| + }
|
| + if (HChange::cast(value())->value()->type().IsSmi()) {
|
| + return false;
|
| + }
|
| + }
|
| return true;
|
| }
|
|
|
|
|