Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index 8f8c59ea8c0f713a476a3e9061a2fd56debb29fc..a7ef23ce9bca170138a8418e3ab9fafa39bc4c37 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -2681,7 +2681,12 @@ bool HLoadKeyed::UsesMustHandleHole() const { |
return false; |
} |
- if (hole_mode() == ALLOW_RETURN_HOLE) return true; |
+ if (hole_mode() == ALLOW_RETURN_HOLE) { |
+ if (IsFastDoubleElementsKind(elements_kind())) { |
+ return AllUsesCanTreatHoleAsNaN(); |
+ } |
+ return true; |
+ } |
if (IsFastDoubleElementsKind(elements_kind())) { |
return false; |
@@ -2698,6 +2703,22 @@ bool HLoadKeyed::UsesMustHandleHole() const { |
} |
+bool HLoadKeyed::AllUsesCanTreatHoleAsNaN() const { |
+ if (!IsFastDoubleElementsKind(elements_kind())) { |
+ return false; |
+ } |
+ |
+ for (HUseIterator it(uses()); !it.Done(); it.Advance()) { |
+ HValue* use = it.value(); |
+ if (use->CheckFlag(HValue::kDeoptimizeOnUndefined)) { |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
+ |
bool HLoadKeyed::RequiresHoleCheck() const { |
if (IsFastPackedElementsKind(elements_kind())) { |
return false; |