OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
6 | 6 |
7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
8 #include "vm/flow_graph_builder.h" | 8 #include "vm/flow_graph_builder.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/os.h" | 10 #include "vm/os.h" |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 ASSERT(parent->is_empty()); | 164 ASSERT(parent->is_empty()); |
165 | 165 |
166 // This node has no parent, indicated by -1. The preorder number is 0. | 166 // This node has no parent, indicated by -1. The preorder number is 0. |
167 parent->Add(-1); | 167 parent->Add(-1); |
168 set_preorder_number(0); | 168 set_preorder_number(0); |
169 preorder->Add(this); | 169 preorder->Add(this); |
170 BitVector* vars = | 170 BitVector* vars = |
171 (variable_count == 0) ? NULL : new BitVector(variable_count); | 171 (variable_count == 0) ? NULL : new BitVector(variable_count); |
172 assigned_vars->Add(vars); | 172 assigned_vars->Add(vars); |
173 | 173 |
| 174 // The graph entry consists of only one instruction. |
| 175 set_last_instruction(this); |
| 176 |
174 // Iteratively traverse all successors. In the unoptimized code, we will | 177 // Iteratively traverse all successors. In the unoptimized code, we will |
175 // enter the function at the first successor in reverse postorder, so we | 178 // enter the function at the first successor in reverse postorder, so we |
176 // must visit the normal entry last. | 179 // must visit the normal entry last. |
177 for (intptr_t i = catch_entries_.length() - 1; i >= 0; --i) { | 180 for (intptr_t i = catch_entries_.length() - 1; i >= 0; --i) { |
178 catch_entries_[i]->DiscoverBlocks(this, preorder, postorder, | 181 catch_entries_[i]->DiscoverBlocks(this, preorder, postorder, |
179 parent, assigned_vars, variable_count); | 182 parent, assigned_vars, variable_count); |
180 } | 183 } |
181 normal_entry_->DiscoverBlocks(this, preorder, postorder, | 184 normal_entry_->DiscoverBlocks(this, preorder, postorder, |
182 parent, assigned_vars, variable_count); | 185 parent, assigned_vars, variable_count); |
183 | 186 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 // nonoptimizing compiler. | 265 // nonoptimizing compiler. |
263 ASSERT(true_successor_ != NULL); | 266 ASSERT(true_successor_ != NULL); |
264 ASSERT(false_successor_ != NULL); | 267 ASSERT(false_successor_ != NULL); |
265 false_successor_->DiscoverBlocks(current_block, preorder, postorder, | 268 false_successor_->DiscoverBlocks(current_block, preorder, postorder, |
266 parent, assigned_vars, variable_count); | 269 parent, assigned_vars, variable_count); |
267 true_successor_->DiscoverBlocks(current_block, preorder, postorder, | 270 true_successor_->DiscoverBlocks(current_block, preorder, postorder, |
268 parent, assigned_vars, variable_count); | 271 parent, assigned_vars, variable_count); |
269 } | 272 } |
270 | 273 |
271 | 274 |
| 275 intptr_t Instruction::SuccessorCount() const { |
| 276 ASSERT(!IsBranch()); |
| 277 ASSERT(!IsGraphEntry()); |
| 278 ASSERT(StraightLineSuccessor() == NULL || |
| 279 StraightLineSuccessor()->IsBlockEntry()); |
| 280 return StraightLineSuccessor() != NULL ? 1 : 0; |
| 281 } |
| 282 |
| 283 |
| 284 BlockEntryInstr* Instruction::SuccessorAt(intptr_t index) const { |
| 285 return StraightLineSuccessor()->AsBlockEntry(); |
| 286 } |
| 287 |
| 288 |
| 289 intptr_t GraphEntryInstr::SuccessorCount() const { |
| 290 return 1 + catch_entries_.length(); |
| 291 } |
| 292 |
| 293 |
| 294 BlockEntryInstr* GraphEntryInstr::SuccessorAt(intptr_t index) const { |
| 295 if (index == 0) return normal_entry_; |
| 296 return catch_entries_[index - 1]; |
| 297 } |
| 298 |
| 299 |
| 300 intptr_t BranchInstr::SuccessorCount() const { |
| 301 return 2; |
| 302 } |
| 303 |
| 304 |
| 305 BlockEntryInstr* BranchInstr::SuccessorAt(intptr_t index) const { |
| 306 if (index == 0) return true_successor_; |
| 307 if (index == 1) return false_successor_; |
| 308 UNREACHABLE(); |
| 309 return NULL; |
| 310 } |
| 311 |
| 312 |
272 // ==== Support for propagating static type. | 313 // ==== Support for propagating static type. |
273 RawAbstractType* ConstantVal::StaticType() const { | 314 RawAbstractType* ConstantVal::StaticType() const { |
274 if (value().IsInstance()) { | 315 if (value().IsInstance()) { |
275 Instance& instance = Instance::Handle(); | 316 Instance& instance = Instance::Handle(); |
276 instance ^= value().raw(); | 317 instance ^= value().raw(); |
277 return instance.GetType(); | 318 return instance.GetType(); |
278 } else { | 319 } else { |
279 UNREACHABLE(); | 320 UNREACHABLE(); |
280 return AbstractType::null(); | 321 return AbstractType::null(); |
281 } | 322 } |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 } | 570 } |
530 | 571 |
531 | 572 |
532 RawAbstractType* BinaryOpComp::StaticType() const { | 573 RawAbstractType* BinaryOpComp::StaticType() const { |
533 // TODO(srdjan): Compute based on input types (ICData). | 574 // TODO(srdjan): Compute based on input types (ICData). |
534 return Type::DynamicType(); | 575 return Type::DynamicType(); |
535 } | 576 } |
536 | 577 |
537 | 578 |
538 } // namespace dart | 579 } // namespace dart |
OLD | NEW |