OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_HYDROGEN_FLOW_ENGINE_H_ | 5 #ifndef V8_HYDROGEN_FLOW_ENGINE_H_ |
6 #define V8_HYDROGEN_FLOW_ENGINE_H_ | 6 #define V8_HYDROGEN_FLOW_ENGINE_H_ |
7 | 7 |
8 #include "src/hydrogen.h" | 8 #include "src/hydrogen.h" |
9 #include "src/hydrogen-instructions.h" | 9 #include "src/hydrogen-instructions.h" |
10 #include "src/zone.h" | 10 #include "src/zone.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 95 |
96 // Iterate all dominated blocks starting from the given start block. | 96 // Iterate all dominated blocks starting from the given start block. |
97 for (int i = root->block_id(); i < graph_->blocks()->length(); i++) { | 97 for (int i = root->block_id(); i < graph_->blocks()->length(); i++) { |
98 HBasicBlock* block = graph_->blocks()->at(i); | 98 HBasicBlock* block = graph_->blocks()->at(i); |
99 | 99 |
100 // Skip blocks not dominated by the root node. | 100 // Skip blocks not dominated by the root node. |
101 if (SkipNonDominatedBlock(root, block)) continue; | 101 if (SkipNonDominatedBlock(root, block)) continue; |
102 State* state = State::Finish(StateAt(block), block, zone_); | 102 State* state = State::Finish(StateAt(block), block, zone_); |
103 | 103 |
104 if (block->IsReachable()) { | 104 if (block->IsReachable()) { |
105 ASSERT(state != NULL); | 105 DCHECK(state != NULL); |
106 if (block->IsLoopHeader()) { | 106 if (block->IsLoopHeader()) { |
107 // Apply loop effects before analyzing loop body. | 107 // Apply loop effects before analyzing loop body. |
108 ComputeLoopEffects(block)->Apply(state); | 108 ComputeLoopEffects(block)->Apply(state); |
109 } else { | 109 } else { |
110 // Must have visited all predecessors before this block. | 110 // Must have visited all predecessors before this block. |
111 CheckPredecessorCount(block); | 111 CheckPredecessorCount(block); |
112 } | 112 } |
113 | 113 |
114 // Go through all instructions of the current block, updating the state. | 114 // Go through all instructions of the current block, updating the state. |
115 for (HInstructionIterator it(block); !it.Done(); it.Advance()) { | 115 for (HInstructionIterator it(block); !it.Done(); it.Advance()) { |
(...skipping 16 matching lines...) Expand all Loading... |
132 State::Merge(StateAt(succ), succ, state, block, zone_)); | 132 State::Merge(StateAt(succ), succ, state, block, zone_)); |
133 } | 133 } |
134 } | 134 } |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 private: | 138 private: |
139 // Computes and caches the loop effects for the loop which has the given | 139 // Computes and caches the loop effects for the loop which has the given |
140 // block as its loop header. | 140 // block as its loop header. |
141 Effects* ComputeLoopEffects(HBasicBlock* block) { | 141 Effects* ComputeLoopEffects(HBasicBlock* block) { |
142 ASSERT(block->IsLoopHeader()); | 142 DCHECK(block->IsLoopHeader()); |
143 Effects* effects = loop_effects_[block->block_id()]; | 143 Effects* effects = loop_effects_[block->block_id()]; |
144 if (effects != NULL) return effects; // Already analyzed this loop. | 144 if (effects != NULL) return effects; // Already analyzed this loop. |
145 | 145 |
146 effects = new(zone_) Effects(zone_); | 146 effects = new(zone_) Effects(zone_); |
147 loop_effects_[block->block_id()] = effects; | 147 loop_effects_[block->block_id()] = effects; |
148 if (effects->Disabled()) return effects; // No effects for this analysis. | 148 if (effects->Disabled()) return effects; // No effects for this analysis. |
149 | 149 |
150 HLoopInformation* loop = block->loop_information(); | 150 HLoopInformation* loop = block->loop_information(); |
151 int end = loop->GetLastBackEdge()->block_id(); | 151 int end = loop->GetLastBackEdge()->block_id(); |
152 // Process the blocks between the header and the end. | 152 // Process the blocks between the header and the end. |
153 for (int i = block->block_id(); i <= end; i++) { | 153 for (int i = block->block_id(); i <= end; i++) { |
154 HBasicBlock* member = graph_->blocks()->at(i); | 154 HBasicBlock* member = graph_->blocks()->at(i); |
155 if (i != block->block_id() && member->IsLoopHeader()) { | 155 if (i != block->block_id() && member->IsLoopHeader()) { |
156 // Recursively compute and cache the effects of the nested loop. | 156 // Recursively compute and cache the effects of the nested loop. |
157 ASSERT(member->loop_information()->parent_loop() == loop); | 157 DCHECK(member->loop_information()->parent_loop() == loop); |
158 Effects* nested = ComputeLoopEffects(member); | 158 Effects* nested = ComputeLoopEffects(member); |
159 effects->Union(nested, zone_); | 159 effects->Union(nested, zone_); |
160 // Skip the nested loop's blocks. | 160 // Skip the nested loop's blocks. |
161 i = member->loop_information()->GetLastBackEdge()->block_id(); | 161 i = member->loop_information()->GetLastBackEdge()->block_id(); |
162 } else { | 162 } else { |
163 // Process all the effects of the block. | 163 // Process all the effects of the block. |
164 if (member->IsUnreachable()) continue; | 164 if (member->IsUnreachable()) continue; |
165 ASSERT(member->current_loop() == loop); | 165 DCHECK(member->current_loop() == loop); |
166 for (HInstructionIterator it(member); !it.Done(); it.Advance()) { | 166 for (HInstructionIterator it(member); !it.Done(); it.Advance()) { |
167 effects->Process(it.Current(), zone_); | 167 effects->Process(it.Current(), zone_); |
168 } | 168 } |
169 } | 169 } |
170 } | 170 } |
171 return effects; | 171 return effects; |
172 } | 172 } |
173 | 173 |
174 inline bool SkipNonDominatedBlock(HBasicBlock* root, HBasicBlock* other) { | 174 inline bool SkipNonDominatedBlock(HBasicBlock* root, HBasicBlock* other) { |
175 if (root->block_id() == 0) return false; // Visit the whole graph. | 175 if (root->block_id() == 0) return false; // Visit the whole graph. |
(...skipping 12 matching lines...) Expand all Loading... |
188 inline void InitializeStates() { | 188 inline void InitializeStates() { |
189 #if DEBUG | 189 #if DEBUG |
190 pred_counts_.Rewind(0); | 190 pred_counts_.Rewind(0); |
191 pred_counts_.AddBlock(0, graph_->blocks()->length(), zone_); | 191 pred_counts_.AddBlock(0, graph_->blocks()->length(), zone_); |
192 #endif | 192 #endif |
193 block_states_.Rewind(0); | 193 block_states_.Rewind(0); |
194 block_states_.AddBlock(NULL, graph_->blocks()->length(), zone_); | 194 block_states_.AddBlock(NULL, graph_->blocks()->length(), zone_); |
195 } | 195 } |
196 | 196 |
197 inline void CheckPredecessorCount(HBasicBlock* block) { | 197 inline void CheckPredecessorCount(HBasicBlock* block) { |
198 ASSERT(block->predecessors()->length() == pred_counts_[block->block_id()]); | 198 DCHECK(block->predecessors()->length() == pred_counts_[block->block_id()]); |
199 } | 199 } |
200 | 200 |
201 inline void IncrementPredecessorCount(HBasicBlock* block) { | 201 inline void IncrementPredecessorCount(HBasicBlock* block) { |
202 #if DEBUG | 202 #if DEBUG |
203 pred_counts_[block->block_id()]++; | 203 pred_counts_[block->block_id()]++; |
204 #endif | 204 #endif |
205 } | 205 } |
206 | 206 |
207 HGraph* graph_; // The hydrogen graph. | 207 HGraph* graph_; // The hydrogen graph. |
208 Zone* zone_; // Temporary zone. | 208 Zone* zone_; // Temporary zone. |
209 #if DEBUG | 209 #if DEBUG |
210 ZoneList<int> pred_counts_; // Finished predecessors (by block id). | 210 ZoneList<int> pred_counts_; // Finished predecessors (by block id). |
211 #endif | 211 #endif |
212 ZoneList<State*> block_states_; // Block states (by block id). | 212 ZoneList<State*> block_states_; // Block states (by block id). |
213 ZoneList<Effects*> loop_effects_; // Loop effects (by block id). | 213 ZoneList<Effects*> loop_effects_; // Loop effects (by block id). |
214 }; | 214 }; |
215 | 215 |
216 | 216 |
217 } } // namespace v8::internal | 217 } } // namespace v8::internal |
218 | 218 |
219 #endif // V8_HYDROGEN_FLOW_ENGINE_H_ | 219 #endif // V8_HYDROGEN_FLOW_ENGINE_H_ |
OLD | NEW |