From 0537955a89e51216f7d7581f5b1375b8d8d0f57f Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Wed, 29 Jan 2014 12:53:40 +0000 Subject: [PATCH] Extend ArrayPop hydrogen support to COW arrays and popping from empty arrays. R=mvstanton@chromium.org BUG= Review URL: https://codereview.chromium.org/148093009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18901 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen.cc | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 613c826..60da305 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -7684,23 +7684,31 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( Drop(expr->arguments()->length()); HValue* result; - HValue* checked_object; HValue* reduced_length; HValue* receiver = Pop(); + + HValue* checked_object = AddCheckMap(receiver, receiver_map); + HValue* length = Add( + checked_object, static_cast(NULL), + HObjectAccess::ForArrayLength(elements_kind)); + { NoObservableSideEffectsScope scope(this); - checked_object = AddCheckMap(receiver, receiver_map); + IfBuilder length_checker(this); + + HValue* bounds_check = length_checker.If( + length, graph()->GetConstant0(), Token::EQ); + length_checker.Then(); + + if (!ast_context()->IsEffect()) Push(graph()->GetConstantUndefined()); + + length_checker.Else(); HValue* elements = AddLoadElements(checked_object); // Ensure that we aren't popping from a copy-on-write array. if (IsFastSmiOrObjectElementsKind(elements_kind)) { - Add( - elements, isolate()->factory()->fixed_array_map(), top_info()); + elements = BuildCopyElementsOnWrite(checked_object, elements, + elements_kind, length); } - HValue* length = Add( - checked_object, static_cast(NULL), - HObjectAccess::ForArrayLength(elements_kind)); reduced_length = AddUncasted(length, graph()->GetConstant1()); - HValue* bounds_check = Add( - graph()->GetConstant0(), length); result = AddElementAccess(elements, reduced_length, NULL, bounds_check, elements_kind, false); Factory* factory = isolate()->factory(); @@ -7713,13 +7721,18 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( } AddElementAccess( elements, reduced_length, hole, bounds_check, elements_kind, true); + Add( + checked_object, HObjectAccess::ForArrayLength(elements_kind), + reduced_length, STORE_TO_INITIALIZED_ENTRY); + + if (!ast_context()->IsEffect()) Push(result); + + length_checker.End(); } - Add( - checked_object, HObjectAccess::ForArrayLength(elements_kind), - reduced_length, STORE_TO_INITIALIZED_ENTRY); - if (!ast_context()->IsEffect()) Push(result); + result = ast_context()->IsEffect() ? graph()->GetConstant0() : Top(); Add(expr->id(), REMOVABLE_SIMULATE); if (!ast_context()->IsEffect()) Drop(1); + ast_context()->ReturnValue(result); return true; } -- 2.7.4