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