diff options
author | Michaël Zasso <targos@protonmail.com> | 2016-09-06 22:49:51 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2016-09-22 09:51:19 +0200 |
commit | ec02b811a8a5c999bab4de312be2d732b7d9d50b (patch) | |
tree | ca3068017254f238cf413a451c57a803572983a4 /deps/v8/src/compiler/loop-variable-optimizer.h | |
parent | d2eb7ce0105369a9cad82787cb33a665e9bd00ad (diff) | |
download | node-new-ec02b811a8a5c999bab4de312be2d732b7d9d50b.tar.gz |
deps: update V8 to 5.4.500.27
Pick up latest commit from the 5.4-lkgr branch.
deps: edit V8 gitignore to allow trace event copy
deps: update V8 trace event to 315bf1e2d45be7d53346c31cfcc37424a32c30c8
deps: edit V8 gitignore to allow gtest_prod.h copy
deps: update V8 gtest to 6f8a66431cb592dad629028a50b3dd418a408c87
PR-URL: https://github.com/nodejs/node/pull/8317
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Diffstat (limited to 'deps/v8/src/compiler/loop-variable-optimizer.h')
-rw-r--r-- | deps/v8/src/compiler/loop-variable-optimizer.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/loop-variable-optimizer.h b/deps/v8/src/compiler/loop-variable-optimizer.h new file mode 100644 index 0000000000..a5c1ad448d --- /dev/null +++ b/deps/v8/src/compiler/loop-variable-optimizer.h @@ -0,0 +1,117 @@ +// Copyright 2016 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. + +#ifndef V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_ +#define V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_ + +#include "src/zone-containers.h" + +namespace v8 { +namespace internal { +namespace compiler { + +class CommonOperatorBuilder; +class Graph; +class Node; + +class InductionVariable : public ZoneObject { + public: + Node* phi() const { return phi_; } + Node* arith() const { return arith_; } + Node* increment() const { return increment_; } + Node* init_value() const { return init_value_; } + + enum ConstraintKind { kStrict, kNonStrict }; + enum ArithmeticType { kAddition, kSubtraction }; + struct Bound { + Bound(Node* bound, ConstraintKind kind) : bound(bound), kind(kind) {} + + Node* bound; + ConstraintKind kind; + }; + + const ZoneVector<Bound>& lower_bounds() { return lower_bounds_; } + const ZoneVector<Bound>& upper_bounds() { return upper_bounds_; } + + ArithmeticType Type() { return arithmeticType_; } + + private: + friend class LoopVariableOptimizer; + + InductionVariable(Node* phi, Node* arith, Node* increment, Node* init_value, + Zone* zone, ArithmeticType arithmeticType) + : phi_(phi), + arith_(arith), + increment_(increment), + init_value_(init_value), + lower_bounds_(zone), + upper_bounds_(zone), + arithmeticType_(arithmeticType) {} + + void AddUpperBound(Node* bound, ConstraintKind kind); + void AddLowerBound(Node* bound, ConstraintKind kind); + + Node* phi_; + Node* arith_; + Node* increment_; + Node* init_value_; + ZoneVector<Bound> lower_bounds_; + ZoneVector<Bound> upper_bounds_; + ArithmeticType arithmeticType_; +}; + +class LoopVariableOptimizer { + public: + void Run(); + + LoopVariableOptimizer(Graph* graph, CommonOperatorBuilder* common, + Zone* zone); + + const ZoneMap<int, InductionVariable*>& induction_variables() { + return induction_vars_; + } + + void ChangeToInductionVariablePhis(); + void ChangeToPhisAndInsertGuards(); + + private: + const int kAssumedLoopEntryIndex = 0; + const int kFirstBackedge = 1; + + class Constraint; + class VariableLimits; + + void VisitBackedge(Node* from, Node* loop); + void VisitNode(Node* node); + void VisitMerge(Node* node); + void VisitLoop(Node* node); + void VisitIf(Node* node, bool polarity); + void VisitStart(Node* node); + void VisitLoopExit(Node* node); + void VisitOtherControl(Node* node); + + void AddCmpToLimits(VariableLimits* limits, Node* node, + InductionVariable::ConstraintKind kind, bool polarity); + + void TakeConditionsFromFirstControl(Node* node); + const InductionVariable* FindInductionVariable(Node* node); + InductionVariable* TryGetInductionVariable(Node* phi); + void DetectInductionVariables(Node* loop); + + Graph* graph() { return graph_; } + CommonOperatorBuilder* common() { return common_; } + Zone* zone() { return zone_; } + + Graph* graph_; + CommonOperatorBuilder* common_; + Zone* zone_; + ZoneMap<int, const VariableLimits*> limits_; + ZoneMap<int, InductionVariable*> induction_vars_; +}; + +} // namespace compiler +} // namespace internal +} // namespace v8 + +#endif // V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_ |