Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index f38fb7d5e3d4312383c198cf23b25a7cf2f8f602..6b5d90f62a562b5db5f1a07ef34b4e83dbc395c2 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -2682,7 +2682,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; |
@@ -2699,6 +2704,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; |