OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_FLOW_GRAPH_H_ | 5 #ifndef VM_FLOW_GRAPH_H_ |
6 #define VM_FLOW_GRAPH_H_ | 6 #define VM_FLOW_GRAPH_H_ |
7 | 7 |
8 #include "vm/growable_array.h" | 8 #include "vm/growable_array.h" |
9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
10 #include "vm/parser.h" | 10 #include "vm/parser.h" |
11 | 11 |
12 namespace dart { | 12 namespace dart { |
13 | 13 |
14 class BlockEffects; | |
14 class FlowGraphBuilder; | 15 class FlowGraphBuilder; |
15 class ValueInliningContext; | 16 class ValueInliningContext; |
16 class VariableLivenessAnalysis; | 17 class VariableLivenessAnalysis; |
17 | 18 |
18 class BlockIterator : public ValueObject { | 19 class BlockIterator : public ValueObject { |
19 public: | 20 public: |
20 explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order) | 21 explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order) |
21 : block_order_(block_order), current_(0) { } | 22 : block_order_(block_order), current_(0) { } |
22 | 23 |
23 BlockIterator(const BlockIterator& other) | 24 BlockIterator(const BlockIterator& other) |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 // TODO(zerny): Once the SSA is feature complete this should be removed. | 134 // TODO(zerny): Once the SSA is feature complete this should be removed. |
134 void Bailout(const char* reason) const; | 135 void Bailout(const char* reason) const; |
135 | 136 |
136 #ifdef DEBUG | 137 #ifdef DEBUG |
137 // Verification methods for debugging. | 138 // Verification methods for debugging. |
138 bool VerifyUseLists(); | 139 bool VerifyUseLists(); |
139 #endif // DEBUG | 140 #endif // DEBUG |
140 | 141 |
141 void DiscoverBlocks(); | 142 void DiscoverBlocks(); |
142 | 143 |
144 // Compute information about effects occuring in different blocks and | |
145 // discover side-effect free paths. | |
146 void ComputeBlockEffects(); | |
147 BlockEffects* block_effects() const { return block_effects_; } | |
148 | |
143 private: | 149 private: |
144 friend class IfConverter; | 150 friend class IfConverter; |
145 friend class BranchSimplifier; | 151 friend class BranchSimplifier; |
146 friend class ConstantPropagator; | 152 friend class ConstantPropagator; |
147 | 153 |
148 // SSA transformation methods and fields. | 154 // SSA transformation methods and fields. |
149 void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier); | 155 void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier); |
150 | 156 |
151 void CompressPath( | 157 void CompressPath( |
152 intptr_t start_index, | 158 intptr_t start_index, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
186 // Flow graph fields. | 192 // Flow graph fields. |
187 const ParsedFunction& parsed_function_; | 193 const ParsedFunction& parsed_function_; |
188 const intptr_t num_copied_params_; | 194 const intptr_t num_copied_params_; |
189 const intptr_t num_non_copied_params_; | 195 const intptr_t num_non_copied_params_; |
190 const intptr_t num_stack_locals_; | 196 const intptr_t num_stack_locals_; |
191 GraphEntryInstr* graph_entry_; | 197 GraphEntryInstr* graph_entry_; |
192 GrowableArray<BlockEntryInstr*> preorder_; | 198 GrowableArray<BlockEntryInstr*> preorder_; |
193 GrowableArray<BlockEntryInstr*> postorder_; | 199 GrowableArray<BlockEntryInstr*> postorder_; |
194 GrowableArray<BlockEntryInstr*> reverse_postorder_; | 200 GrowableArray<BlockEntryInstr*> reverse_postorder_; |
195 ConstantInstr* constant_null_; | 201 ConstantInstr* constant_null_; |
202 | |
203 BlockEffects* block_effects_; | |
196 }; | 204 }; |
197 | 205 |
198 | 206 |
199 class LivenessAnalysis : public ValueObject { | 207 class LivenessAnalysis : public ValueObject { |
200 public: | 208 public: |
201 LivenessAnalysis(intptr_t variable_count, | 209 LivenessAnalysis(intptr_t variable_count, |
202 const GrowableArray<BlockEntryInstr*>& postorder); | 210 const GrowableArray<BlockEntryInstr*>& postorder); |
203 | 211 |
204 void Analyze(); | 212 void Analyze(); |
205 | 213 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
259 | 267 |
260 // Kill sets for each block. They contain indices of variables that | 268 // Kill sets for each block. They contain indices of variables that |
261 // are defined by this block. | 269 // are defined by this block. |
262 GrowableArray<BitVector*> kill_; | 270 GrowableArray<BitVector*> kill_; |
263 | 271 |
264 // Live-in sets for each block. They contain indices of variables | 272 // Live-in sets for each block. They contain indices of variables |
265 // that are used by this block or its successors. | 273 // that are used by this block or its successors. |
266 GrowableArray<BitVector*> live_in_; | 274 GrowableArray<BitVector*> live_in_; |
267 }; | 275 }; |
268 | 276 |
277 | |
278 // Information about side effect free paths between blocks. | |
279 class BlockEffects : public ZoneAllocated { | |
280 public: | |
281 explicit BlockEffects(FlowGraph* flow_graph); | |
282 | |
283 // Return true if the given instruction is not affected by anything between | |
284 // its current block and target block. Used by CSE to determine if | |
285 // a computation is available in the given block. | |
286 bool IsAvailableAt(Instruction* instr, BlockEntryInstr* block) const; | |
287 | |
288 // Return true if the given instruction is not affected by anything between | |
289 // the given block and its current block. Used by LICM to determine if | |
290 // a computation can be moved to loop's preheader and remain available at | |
291 // its current location. | |
292 bool CanBeMovedTo(Instruction* instr, BlockEntryInstr* block) const; | |
293 | |
294 private: | |
295 // Returns true if all paths between from and to are free of side effects and | |
296 // there is at least one path between these blocks. | |
297 bool IsSideEffectFreePath(BlockEntryInstr* from, BlockEntryInstr* to) const; | |
298 | |
299 // Per block live-in sets. Block A is live-in for the block B if and only if | |
300 // all paths from A to B are free of side effects and there is at least one | |
301 // path between these blocks. | |
Florian Schneider
2013/04/29 12:11:54
This definition is not precise about what the code
Vyacheslav Egorov (Google)
2013/04/30 14:01:33
Done.
| |
302 GrowableArray<BitVector*> live_in_; | |
Florian Schneider
2013/04/29 12:11:54
Maybe choose a better name for in/out. live_in is
Vyacheslav Egorov (Google)
2013/04/30 14:01:33
Renamed to available_at_ and available_after
| |
303 }; | |
304 | |
305 | |
269 } // namespace dart | 306 } // namespace dart |
270 | 307 |
271 #endif // VM_FLOW_GRAPH_H_ | 308 #endif // VM_FLOW_GRAPH_H_ |
OLD | NEW |