diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2015-01-07 18:38:38 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2015-01-07 22:11:18 +0100 |
commit | dad73f645cde6920e79db956e7ef82ed640d7615 (patch) | |
tree | 7ba3f3fc7e0722c5f130065461b7c56f571af383 /deps/v8/src/compiler/load-elimination.cc | |
parent | 53ba494537259b18b346dc6150d6a100c557e08f (diff) | |
download | node-new-dad73f645cde6920e79db956e7ef82ed640d7615.tar.gz |
deps: upgrade v8 to 3.31.74.1
PR-URL: https://github.com/iojs/io.js/pull/243
Reviewed-By: Fedor Indutny <fedor@indutny.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'deps/v8/src/compiler/load-elimination.cc')
-rw-r--r-- | deps/v8/src/compiler/load-elimination.cc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/load-elimination.cc b/deps/v8/src/compiler/load-elimination.cc new file mode 100644 index 0000000000..fe0714ebc1 --- /dev/null +++ b/deps/v8/src/compiler/load-elimination.cc @@ -0,0 +1,76 @@ +// Copyright 2014 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/compiler/load-elimination.h" + +#include "src/compiler/node-properties-inl.h" +#include "src/compiler/simplified-operator.h" + +namespace v8 { +namespace internal { +namespace compiler { + +LoadElimination::~LoadElimination() {} + + +Reduction LoadElimination::Reduce(Node* node) { + switch (node->opcode()) { + case IrOpcode::kLoadField: + return ReduceLoadField(node); + default: + break; + } + return NoChange(); +} + + +Reduction LoadElimination::ReduceLoadField(Node* node) { + DCHECK_EQ(IrOpcode::kLoadField, node->opcode()); + FieldAccess const access = FieldAccessOf(node->op()); + Node* const object = NodeProperties::GetValueInput(node, 0); + for (Node* effect = NodeProperties::GetEffectInput(node);; + effect = NodeProperties::GetEffectInput(effect)) { + switch (effect->opcode()) { + case IrOpcode::kLoadField: { + if (object == NodeProperties::GetValueInput(effect, 0) && + access == FieldAccessOf(effect->op())) { + Node* const value = effect; + NodeProperties::ReplaceWithValue(node, value); + return Replace(value); + } + break; + } + case IrOpcode::kStoreField: { + if (access == FieldAccessOf(effect->op())) { + if (object == NodeProperties::GetValueInput(effect, 0)) { + Node* const value = NodeProperties::GetValueInput(effect, 1); + NodeProperties::ReplaceWithValue(node, value); + return Replace(value); + } + // TODO(turbofan): Alias analysis to the rescue? + return NoChange(); + } + break; + } + case IrOpcode::kStoreBuffer: + case IrOpcode::kStoreElement: { + // These can never interfere with field loads. + break; + } + default: { + if (!effect->op()->HasProperty(Operator::kNoWrite) || + effect->op()->EffectInputCount() != 1) { + return NoChange(); + } + break; + } + } + } + UNREACHABLE(); + return NoChange(); +} + +} // namespace compiler +} // namespace internal +} // namespace v8 |