From ef4170ea03a80b21b2d8a65ce432efaa370fe2fa Mon Sep 17 00:00:00 2001 From: Ali Ijaz Sheikh Date: Wed, 20 Jan 2016 09:45:45 -0800 Subject: deps: upgrade to V8 4.8.271.17 Pick up V8 4.8 branch-head. This branch brings in @@isConcatSpreadable, @@toPrimitive and ToLength ES6 changes. For full details see: http://v8project.blogspot.de/2015/11/v8-release-48.html https://github.com/v8/v8/commit/fa163e2 Ref: https://github.com/nodejs/node/pull/4399 PR-URL: https://github.com/nodejs/node/pull/4785 Reviewed-By: bnoordhuis - Ben Noordhuis --- deps/v8/src/crankshaft/hydrogen-dehoist.cc | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 deps/v8/src/crankshaft/hydrogen-dehoist.cc (limited to 'deps/v8/src/crankshaft/hydrogen-dehoist.cc') diff --git a/deps/v8/src/crankshaft/hydrogen-dehoist.cc b/deps/v8/src/crankshaft/hydrogen-dehoist.cc new file mode 100644 index 0000000000..34de94afc5 --- /dev/null +++ b/deps/v8/src/crankshaft/hydrogen-dehoist.cc @@ -0,0 +1,72 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/crankshaft/hydrogen-dehoist.h" + +#include "src/base/safe_math.h" + +namespace v8 { +namespace internal { + +static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) { + HValue* index = array_operation->GetKey()->ActualValue(); + if (!index->representation().IsSmiOrInteger32()) return; + if (!index->IsAdd() && !index->IsSub()) return; + + HConstant* constant; + HValue* subexpression; + HBinaryOperation* binary_operation = HBinaryOperation::cast(index); + if (binary_operation->left()->IsConstant() && index->IsAdd()) { + subexpression = binary_operation->right(); + constant = HConstant::cast(binary_operation->left()); + } else if (binary_operation->right()->IsConstant()) { + subexpression = binary_operation->left(); + constant = HConstant::cast(binary_operation->right()); + } else { + return; + } + + if (!constant->HasInteger32Value()) return; + v8::base::internal::CheckedNumeric checked_value = + constant->Integer32Value(); + int32_t sign = binary_operation->IsSub() ? -1 : 1; + checked_value = checked_value * sign; + + // Multiply value by elements size, bailing out on overflow. + int32_t elements_kind_size = + 1 << ElementsKindToShiftSize(array_operation->elements_kind()); + checked_value = checked_value * elements_kind_size; + if (!checked_value.IsValid()) return; + int32_t value = checked_value.ValueOrDie(); + if (value < 0) return; + + // Ensure that the array operation can add value to existing base offset + // without overflowing. + if (!array_operation->TryIncreaseBaseOffset(value)) return; + + array_operation->SetKey(subexpression); + if (binary_operation->HasNoUses()) { + binary_operation->DeleteAndReplaceWith(NULL); + } + + array_operation->SetDehoisted(true); +} + + +void HDehoistIndexComputationsPhase::Run() { + const ZoneList* blocks(graph()->blocks()); + for (int i = 0; i < blocks->length(); ++i) { + for (HInstructionIterator it(blocks->at(i)); !it.Done(); it.Advance()) { + HInstruction* instr = it.Current(); + if (instr->IsLoadKeyed()) { + DehoistArrayIndex(HLoadKeyed::cast(instr)); + } else if (instr->IsStoreKeyed()) { + DehoistArrayIndex(HStoreKeyed::cast(instr)); + } + } + } +} + +} // namespace internal +} // namespace v8 -- cgit v1.2.1