Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: src/compiler/bytecode-basic-block-analysis.h

Issue 1502243002: [Interpreter] Local flow control in the bytecode graph builder. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Build fix. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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_BYTECODE_BASIC_BLOCK_ANALYSIS_H_
6 #define V8_COMPILER_BYTECODE_BASIC_BLOCK_ANALYSIS_H_
7
8 #include "src/bit-vector.h"
9 #include "src/compiler.h"
10 #include "src/zone-containers.h"
11
12 namespace v8 {
13 namespace internal {
14 namespace compiler {
15
16 class BytecodeBasicBlock;
17
18 class BytecodeBasicBlockAnalysis {
19 public:
20 BytecodeBasicBlockAnalysis(Zone* zone, Handle<BytecodeArray> bytecode_array);
21 const ZoneVector<BytecodeBasicBlock*>* Analyze();
22
23 private:
24 void CreateBasicBlock(int start, int end);
25 void SplitBasicBlock(int offset);
26 void CreateBasicBlocks();
27 void LinkBasicBlocks();
28 void AssignRpoOrder();
29 void FindDominators();
30 void FindDependencyOrder();
31 void Dump();
32
33 Zone* zone() const { return zone_; }
34 BytecodeBasicBlock* start() { return block_map_[0]; }
35 BytecodeBasicBlock* exit() { return block_map_[bytecode_array_->length()]; }
36
37 Zone* zone_;
38 ZoneMap<int, BytecodeBasicBlock*> block_map_;
39 ZoneVector<BytecodeBasicBlock*> rpo_order_;
40 ZoneVector<BytecodeBasicBlock*> dependency_order_;
41 Handle<BytecodeArray> bytecode_array_;
42
43 DISALLOW_COPY_AND_ASSIGN(BytecodeBasicBlockAnalysis);
44 };
45
46 class BytecodeBasicBlock final : public ZoneObject {
47 public:
48 const int kInvalidOffset = -1;
49 static const int kUnassignedId = -1;
50
51 BytecodeBasicBlock(Zone* zone, int start, int end)
52 : start_(start),
53 end_(end),
54 last_bytecode_offset_(kInvalidOffset),
55 if_true_(nullptr),
56 if_false_(nullptr),
57 incoming_(zone),
58 rpo_id_(kUnassignedId),
59 dominator_rpo_ids_(nullptr) {}
60
61 int rpo_id() const { return rpo_id_; }
62 int start() const { return start_; }
63 int end() const { return end_; }
64 int last_bytecode_offset() const { return last_bytecode_offset_; }
65 BytecodeBasicBlock* if_true() const { return if_true_; }
66 BytecodeBasicBlock* if_false() const { return if_false_; }
67
68 bool ends_with_conditional_jump() const {
69 return if_true_ != nullptr && if_false_ != nullptr;
70 }
71
72 bool is_exit() const { return if_true_ == nullptr && if_false_ == nullptr; }
73
74 bool is_dominated_by(const BytecodeBasicBlock* block) const {
75 return dominator_rpo_ids_->Contains(block->rpo_id());
76 }
77
78 const BytecodeBasicBlock* incoming(size_t index) const {
79 return incoming_[index];
80 }
81 const size_t incoming_count() const { return incoming_.size(); }
rmcilroy 2015/12/08 13:25:07 nit - newline above
oth 2015/12/09 11:26:45 Done.
82
83 private:
84 ZoneVector<BytecodeBasicBlock*>* incoming() { return &incoming_; }
85 void add_incoming(BytecodeBasicBlock* incoming) {
rmcilroy 2015/12/08 13:25:07 nit - newlines between all these functions down to
oth 2015/12/09 11:26:45 Done.
86 incoming_.push_back(incoming);
87 }
88 void set_end(int end) {
89 DCHECK_GT(end, start_);
90 DCHECK_LE(end, end_);
91 end_ = end;
92 }
93 void set_last_bytecode_offset(int offset) { last_bytecode_offset_ = offset; }
94 void end_with_conditional_jump(BytecodeBasicBlock* if_true,
95 BytecodeBasicBlock* if_false) {
96 DCHECK_NOT_NULL(if_true);
97 DCHECK_NULL(if_true_);
98 DCHECK_NOT_NULL(if_false);
99 DCHECK_NULL(if_false_);
100 if_true_ = if_true;
101 if_false_ = if_false;
102 if_true->add_incoming(this);
103 if_false->add_incoming(this);
104 }
105 void end_with_block(BytecodeBasicBlock* if_true) {
106 DCHECK_NOT_NULL(if_true);
107 DCHECK_NULL(if_true_);
108 DCHECK_NULL(if_false_);
109 if_true_ = if_true;
110 if_true->add_incoming(this);
111 }
112
113 void set_rpo_id(int rpo_id) { rpo_id_ = rpo_id; }
114 BitVector* dominator_rpo_ids() { return dominator_rpo_ids_; }
115 void set_dominator_rpo_ids(BitVector* ids) { dominator_rpo_ids_ = ids; }
116
117 int start_;
118 int end_;
119 int last_bytecode_offset_;
120 BytecodeBasicBlock* if_true_;
121 BytecodeBasicBlock* if_false_;
122 ZoneVector<BytecodeBasicBlock*> incoming_;
123 int rpo_id_;
124 BitVector* dominator_rpo_ids_;
125
126 friend class BytecodeBasicBlockAnalysis;
127 };
128
129 } // namespace compiler
130 } // namespace internal
131 } // namespace v8
132
133 #endif // V8_COMPILER_BYTECODE_BASIC_BLOCK_ANALYSIS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698