Line data Source code
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
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_
6 : #define V8_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_
7 :
8 : #include "src/ast/ast.h"
9 : #include "src/bit-vector.h"
10 : #include "src/zone/zone-containers.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 :
15 : class CompilationInfo;
16 : class Scope;
17 : class Variable;
18 :
19 : namespace compiler {
20 :
21 : // The result of analyzing loop assignments.
22 : class LoopAssignmentAnalysis : public ZoneObject {
23 : public:
24 834 : BitVector* GetVariablesAssignedInLoop(IterationStatement* loop) {
25 12680 : for (size_t i = 0; i < list_.size(); i++) {
26 : // TODO(turbofan): hashmap or binary search for loop assignments.
27 12680 : if (list_[i].first == loop) return list_[i].second;
28 : }
29 0 : UNREACHABLE(); // should never ask for loops that aren't here!
30 : return nullptr;
31 : }
32 :
33 : int GetAssignmentCountForTesting(DeclarationScope* scope, Variable* var);
34 :
35 : private:
36 : friend class AstLoopAssignmentAnalyzer;
37 : explicit LoopAssignmentAnalysis(Zone* zone) : list_(zone) {}
38 : ZoneVector<std::pair<IterationStatement*, BitVector*>> list_;
39 : };
40 :
41 :
42 : // The class that performs loop assignment analysis by walking the AST.
43 : class AstLoopAssignmentAnalyzer final
44 : : public AstVisitor<AstLoopAssignmentAnalyzer> {
45 : public:
46 : AstLoopAssignmentAnalyzer(Zone* zone, CompilationInfo* info);
47 :
48 : LoopAssignmentAnalysis* Analyze();
49 :
50 : #define DECLARE_VISIT(type) void Visit##type(type* node);
51 : AST_NODE_LIST(DECLARE_VISIT)
52 : #undef DECLARE_VISIT
53 :
54 : static int GetVariableIndex(DeclarationScope* scope, Variable* var);
55 :
56 : private:
57 : CompilationInfo* info_;
58 : Zone* zone_;
59 : ZoneDeque<BitVector*> loop_stack_;
60 : LoopAssignmentAnalysis* result_;
61 :
62 : CompilationInfo* info() { return info_; }
63 :
64 : void Enter(IterationStatement* loop);
65 : void Exit(IterationStatement* loop);
66 :
67 : void VisitIfNotNull(AstNode* node) {
68 201 : if (node != nullptr) Visit(node);
69 : }
70 :
71 : void AnalyzeAssignment(Variable* var);
72 :
73 992015 : DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
74 : DISALLOW_COPY_AND_ASSIGN(AstLoopAssignmentAnalyzer);
75 : };
76 : } // namespace compiler
77 : } // namespace internal
78 : } // namespace v8
79 :
80 : #endif // V8_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_
|