5 #ifndef V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_ 6 #define V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_ 8 #include "src/compiler/functional-list.h" 9 #include "src/compiler/node-aux-data.h" 10 #include "src/zone/zone-containers.h" 16 class CommonOperatorBuilder;
22 Node* phi()
const {
return phi_; }
23 Node* effect_phi()
const {
return effect_phi_; }
24 Node* arith()
const {
return arith_; }
25 Node* increment()
const {
return increment_; }
26 Node* init_value()
const {
return init_value_; }
28 enum ConstraintKind { kStrict, kNonStrict };
29 enum ArithmeticType { kAddition, kSubtraction };
31 Bound(
Node* bound, ConstraintKind kind) : bound(bound), kind(kind) {}
40 ArithmeticType
Type() {
return arithmeticType_; }
43 friend class LoopVariableOptimizer;
45 InductionVariable(Node* phi, Node* effect_phi, Node* arith, Node* increment,
46 Node* init_value, Zone* zone, ArithmeticType arithmeticType)
48 effect_phi_(effect_phi),
50 increment_(increment),
51 init_value_(init_value),
54 arithmeticType_(arithmeticType) {}
56 void AddUpperBound(Node* bound, ConstraintKind kind);
57 void AddLowerBound(Node* bound, ConstraintKind kind);
64 ZoneVector<Bound> lower_bounds_;
65 ZoneVector<Bound> upper_bounds_;
66 ArithmeticType arithmeticType_;
77 return induction_vars_;
80 void ChangeToInductionVariablePhis();
81 void ChangeToPhisAndInsertGuards();
84 const int kAssumedLoopEntryIndex = 0;
85 const int kFirstBackedge = 1;
89 InductionVariable::ConstraintKind kind;
92 bool operator!=(
const Constraint& other)
const {
93 return left != other.left || kind != other.kind || right != other.right;
99 void VisitBackedge(
Node* from,
Node* loop);
100 void VisitNode(
Node* node);
101 void VisitMerge(
Node* node);
102 void VisitLoop(
Node* node);
103 void VisitIf(
Node* node,
bool polarity);
104 void VisitStart(
Node* node);
105 void VisitLoopExit(
Node* node);
106 void VisitOtherControl(
Node* node);
109 InductionVariable::ConstraintKind kind,
bool polarity);
111 void TakeConditionsFromFirstControl(
Node* node);
114 void DetectInductionVariables(
Node* loop);
116 Graph* graph() {
return graph_; }
118 Zone* zone() {
return zone_; }
133 #endif // V8_COMPILER_LOOP_VARIABLE_OPTIMIZER_H_