| 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 FlowGraphBuilder; | 14 class FlowGraphBuilder; |
| 15 class ValueInliningContext; | 15 class ValueInliningContext; |
| 16 class VariableLivenessAnalysis; |
| 16 | 17 |
| 17 class BlockIterator : public ValueObject { | 18 class BlockIterator : public ValueObject { |
| 18 public: | 19 public: |
| 19 explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order) | 20 explicit BlockIterator(const GrowableArray<BlockEntryInstr*>& block_order) |
| 20 : block_order_(block_order), current_(0) { } | 21 : block_order_(block_order), current_(0) { } |
| 21 | 22 |
| 22 BlockIterator(const BlockIterator& other) | 23 BlockIterator(const BlockIterator& other) |
| 23 : ValueObject(), | 24 : ValueObject(), |
| 24 block_order_(other.block_order_), | 25 block_order_(other.block_order_), |
| 25 current_(other.current_) { } | 26 current_(other.current_) { } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 // SSA transformation methods and fields. | 156 // SSA transformation methods and fields. |
| 156 void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier); | 157 void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier); |
| 157 | 158 |
| 158 void CompressPath( | 159 void CompressPath( |
| 159 intptr_t start_index, | 160 intptr_t start_index, |
| 160 intptr_t current_index, | 161 intptr_t current_index, |
| 161 GrowableArray<intptr_t>* parent, | 162 GrowableArray<intptr_t>* parent, |
| 162 GrowableArray<intptr_t>* label); | 163 GrowableArray<intptr_t>* label); |
| 163 | 164 |
| 164 void Rename(GrowableArray<PhiInstr*>* live_phis, | 165 void Rename(GrowableArray<PhiInstr*>* live_phis, |
| 166 VariableLivenessAnalysis* variable_liveness, |
| 165 GrowableArray<Definition*>* inlining_parameters); | 167 GrowableArray<Definition*>* inlining_parameters); |
| 168 |
| 166 void RenameRecursive( | 169 void RenameRecursive( |
| 167 BlockEntryInstr* block_entry, | 170 BlockEntryInstr* block_entry, |
| 168 GrowableArray<Definition*>* env, | 171 GrowableArray<Definition*>* env, |
| 169 GrowableArray<PhiInstr*>* live_phis); | 172 GrowableArray<PhiInstr*>* live_phis, |
| 173 VariableLivenessAnalysis* variable_liveness); |
| 170 | 174 |
| 171 void InsertPhis( | 175 void InsertPhis( |
| 172 const GrowableArray<BlockEntryInstr*>& preorder, | 176 const GrowableArray<BlockEntryInstr*>& preorder, |
| 173 const GrowableArray<BitVector*>& assigned_vars, | 177 const GrowableArray<BitVector*>& assigned_vars, |
| 174 const GrowableArray<BitVector*>& dom_frontier); | 178 const GrowableArray<BitVector*>& dom_frontier); |
| 175 | 179 |
| 176 void RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis); | 180 void RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis); |
| 177 | 181 |
| 178 void ReplacePredecessor(BlockEntryInstr* old_block, | 182 void ReplacePredecessor(BlockEntryInstr* old_block, |
| 179 BlockEntryInstr* new_block); | 183 BlockEntryInstr* new_block); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 192 const intptr_t num_non_copied_params_; | 196 const intptr_t num_non_copied_params_; |
| 193 const intptr_t num_stack_locals_; | 197 const intptr_t num_stack_locals_; |
| 194 GraphEntryInstr* graph_entry_; | 198 GraphEntryInstr* graph_entry_; |
| 195 GrowableArray<BlockEntryInstr*> preorder_; | 199 GrowableArray<BlockEntryInstr*> preorder_; |
| 196 GrowableArray<BlockEntryInstr*> postorder_; | 200 GrowableArray<BlockEntryInstr*> postorder_; |
| 197 GrowableArray<BlockEntryInstr*> reverse_postorder_; | 201 GrowableArray<BlockEntryInstr*> reverse_postorder_; |
| 198 bool invalid_dominator_tree_; | 202 bool invalid_dominator_tree_; |
| 199 ConstantInstr* constant_null_; | 203 ConstantInstr* constant_null_; |
| 200 }; | 204 }; |
| 201 | 205 |
| 206 |
| 207 class LivenessAnalysis : public ValueObject { |
| 208 public: |
| 209 LivenessAnalysis(intptr_t variable_count, |
| 210 const GrowableArray<BlockEntryInstr*>& postorder); |
| 211 |
| 212 void Analyze(); |
| 213 |
| 214 virtual ~LivenessAnalysis() { } |
| 215 |
| 216 BitVector* GetLiveInSetAt(intptr_t postorder_number) const { |
| 217 return live_in_[postorder_number]; |
| 218 } |
| 219 |
| 220 BitVector* GetLiveOutSetAt(intptr_t postorder_number) const { |
| 221 return live_out_[postorder_number]; |
| 222 } |
| 223 |
| 224 BitVector* GetLiveInSet(BlockEntryInstr* block) const { |
| 225 return GetLiveInSetAt(block->postorder_number()); |
| 226 } |
| 227 |
| 228 BitVector* GetKillSet(BlockEntryInstr* block) const { |
| 229 return kill_[block->postorder_number()]; |
| 230 } |
| 231 |
| 232 BitVector* GetLiveOutSet(BlockEntryInstr* block) const { |
| 233 return GetLiveOutSetAt(block->postorder_number()); |
| 234 } |
| 235 |
| 236 // Print results of liveness analysis. |
| 237 void Dump(); |
| 238 |
| 239 protected: |
| 240 // Compute initial values for live-out, kill and live-in sets. |
| 241 virtual void ComputeInitialSets() = 0; |
| 242 |
| 243 // Update live-out set for the given block: live-out should contain |
| 244 // all values that are live-in for block's successors. |
| 245 // Returns true if live-out set was changed. |
| 246 bool UpdateLiveOut(const BlockEntryInstr& instr); |
| 247 |
| 248 // Update live-in set for the given block: live-in should contain |
| 249 // all values that are live-out from the block and are not defined |
| 250 // by this block. |
| 251 // Returns true if live-in set was changed. |
| 252 bool UpdateLiveIn(const BlockEntryInstr& instr); |
| 253 |
| 254 // Perform fix-point iteration updating live-out and live-in sets |
| 255 // for blocks until they stop changing. |
| 256 void ComputeLiveInAndLiveOutSets(); |
| 257 |
| 258 const intptr_t variable_count_; |
| 259 |
| 260 const GrowableArray<BlockEntryInstr*>& postorder_; |
| 261 |
| 262 // Live-out sets for each block. They contain indices of variables |
| 263 // that are live out from this block: that is values that were either |
| 264 // defined in this block or live into it and that are used in some |
| 265 // successor block. |
| 266 GrowableArray<BitVector*> live_out_; |
| 267 |
| 268 // Kill sets for each block. They contain indices of variables that |
| 269 // are defined by this block. |
| 270 GrowableArray<BitVector*> kill_; |
| 271 |
| 272 // Live-in sets for each block. They contain indices of variables |
| 273 // that are used by this block or its successors. |
| 274 GrowableArray<BitVector*> live_in_; |
| 275 }; |
| 276 |
| 202 } // namespace dart | 277 } // namespace dart |
| 203 | 278 |
| 204 #endif // VM_FLOW_GRAPH_H_ | 279 #endif // VM_FLOW_GRAPH_H_ |
| OLD | NEW |