OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_AST_GRAPH_BUILDER_H_ | 5 #ifndef V8_COMPILER_AST_GRAPH_BUILDER_H_ |
6 #define V8_COMPILER_AST_GRAPH_BUILDER_H_ | 6 #define V8_COMPILER_AST_GRAPH_BUILDER_H_ |
7 | 7 |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/liveness-analyzer.h" | 10 #include "src/compiler/liveness-analyzer.h" |
11 #include "src/compiler/state-values-utils.h" | 11 #include "src/compiler/state-values-utils.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
| 16 // Forward declarations. |
16 class BitVector; | 17 class BitVector; |
17 | 18 |
| 19 |
18 namespace compiler { | 20 namespace compiler { |
19 | 21 |
| 22 // Forward declarations. |
20 class ControlBuilder; | 23 class ControlBuilder; |
21 class Graph; | 24 class Graph; |
22 class LoopAssignmentAnalysis; | 25 class LoopAssignmentAnalysis; |
23 class LoopBuilder; | 26 class LoopBuilder; |
24 class Node; | 27 class Node; |
| 28 class TypeHintAnalysis; |
| 29 |
25 | 30 |
26 // The AstGraphBuilder produces a high-level IR graph, based on an | 31 // The AstGraphBuilder produces a high-level IR graph, based on an |
27 // underlying AST. The produced graph can either be compiled into a | 32 // underlying AST. The produced graph can either be compiled into a |
28 // stand-alone function or be wired into another graph for the purposes | 33 // stand-alone function or be wired into another graph for the purposes |
29 // of function inlining. | 34 // of function inlining. |
30 class AstGraphBuilder : public AstVisitor { | 35 class AstGraphBuilder : public AstVisitor { |
31 public: | 36 public: |
32 AstGraphBuilder(Zone* local_zone, CompilationInfo* info, JSGraph* jsgraph, | 37 AstGraphBuilder(Zone* local_zone, CompilationInfo* info, JSGraph* jsgraph, |
33 LoopAssignmentAnalysis* loop_assignment = NULL); | 38 LoopAssignmentAnalysis* loop_assignment = nullptr, |
| 39 TypeHintAnalysis* type_hint_analysis = nullptr); |
34 | 40 |
35 // Creates a graph by visiting the entire AST. | 41 // Creates a graph by visiting the entire AST. |
36 bool CreateGraph(bool stack_check = true); | 42 bool CreateGraph(bool stack_check = true); |
37 | 43 |
38 // Helpers to create new control nodes. | 44 // Helpers to create new control nodes. |
39 Node* NewIfTrue() { return NewNode(common()->IfTrue()); } | 45 Node* NewIfTrue() { return NewNode(common()->IfTrue()); } |
40 Node* NewIfFalse() { return NewNode(common()->IfFalse()); } | 46 Node* NewIfFalse() { return NewNode(common()->IfFalse()); } |
41 Node* NewMerge() { return NewNode(common()->Merge(1), true); } | 47 Node* NewMerge() { return NewNode(common()->Merge(1), true); } |
42 Node* NewLoop() { return NewNode(common()->Loop(1), true); } | 48 Node* NewLoop() { return NewNode(common()->Loop(1), true); } |
43 Node* NewBranch(Node* condition, BranchHint hint = BranchHint::kNone) { | 49 Node* NewBranch(Node* condition, BranchHint hint = BranchHint::kNone) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 | 105 |
100 // Optimization to cache loaded feedback vector. | 106 // Optimization to cache loaded feedback vector. |
101 SetOncePointer<Node> feedback_vector_; | 107 SetOncePointer<Node> feedback_vector_; |
102 | 108 |
103 // Control nodes that exit the function body. | 109 // Control nodes that exit the function body. |
104 ZoneVector<Node*> exit_controls_; | 110 ZoneVector<Node*> exit_controls_; |
105 | 111 |
106 // Result of loop assignment analysis performed before graph creation. | 112 // Result of loop assignment analysis performed before graph creation. |
107 LoopAssignmentAnalysis* loop_assignment_analysis_; | 113 LoopAssignmentAnalysis* loop_assignment_analysis_; |
108 | 114 |
| 115 // Result of type hint analysis performed before graph creation. |
| 116 TypeHintAnalysis* type_hint_analysis_; |
| 117 |
109 // Cache for StateValues nodes for frame states. | 118 // Cache for StateValues nodes for frame states. |
110 StateValuesCache state_values_cache_; | 119 StateValuesCache state_values_cache_; |
111 | 120 |
112 // Analyzer of local variable liveness. | 121 // Analyzer of local variable liveness. |
113 LivenessAnalyzer liveness_analyzer_; | 122 LivenessAnalyzer liveness_analyzer_; |
114 | 123 |
115 // Function info for frame state construction. | 124 // Function info for frame state construction. |
116 const FrameStateFunctionInfo* const frame_state_function_info_; | 125 const FrameStateFunctionInfo* const frame_state_function_info_; |
117 | 126 |
118 // Growth increment for the temporary buffer used to construct input lists to | 127 // Growth increment for the temporary buffer used to construct input lists to |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 BailoutId bailout_id); | 346 BailoutId bailout_id); |
338 | 347 |
339 // Builders for conditional errors. | 348 // Builders for conditional errors. |
340 Node* BuildThrowIfStaticPrototype(Node* name, BailoutId bailout_id); | 349 Node* BuildThrowIfStaticPrototype(Node* name, BailoutId bailout_id); |
341 | 350 |
342 // Builders for non-local control flow. | 351 // Builders for non-local control flow. |
343 Node* BuildReturn(Node* return_value); | 352 Node* BuildReturn(Node* return_value); |
344 Node* BuildThrow(Node* exception_value); | 353 Node* BuildThrow(Node* exception_value); |
345 | 354 |
346 // Builders for binary operations. | 355 // Builders for binary operations. |
347 Node* BuildBinaryOp(Node* left, Node* right, Token::Value op); | 356 Node* BuildBinaryOp(Node* left, Node* right, Token::Value op, |
| 357 TypeFeedbackId feedback_id); |
348 | 358 |
349 // Process arguments to a call by popping {arity} elements off the operand | 359 // Process arguments to a call by popping {arity} elements off the operand |
350 // stack and build a call node using the given call operator. | 360 // stack and build a call node using the given call operator. |
351 Node* ProcessArguments(const Operator* op, int arity); | 361 Node* ProcessArguments(const Operator* op, int arity); |
352 | 362 |
353 // =========================================================================== | 363 // =========================================================================== |
354 // The following build methods have the same contract as the above ones, but | 364 // The following build methods have the same contract as the above ones, but |
355 // they can also return {NULL} to indicate that no fragment was built. Note | 365 // they can also return {NULL} to indicate that no fragment was built. Note |
356 // that these are optimizations, disabling any of them should still produce | 366 // that these are optimizations, disabling any of them should still produce |
357 // correct graphs. | 367 // correct graphs. |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 | 581 |
572 // Prepare environment to be used as loop header. | 582 // Prepare environment to be used as loop header. |
573 void PrepareForLoop(BitVector* assigned, bool is_osr = false); | 583 void PrepareForLoop(BitVector* assigned, bool is_osr = false); |
574 }; | 584 }; |
575 | 585 |
576 } // namespace compiler | 586 } // namespace compiler |
577 } // namespace internal | 587 } // namespace internal |
578 } // namespace v8 | 588 } // namespace v8 |
579 | 589 |
580 #endif // V8_COMPILER_AST_GRAPH_BUILDER_H_ | 590 #endif // V8_COMPILER_AST_GRAPH_BUILDER_H_ |
OLD | NEW |