| 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 RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
| 6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
| (...skipping 1239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 intptr_t offset() const { return offset_; } | 1250 intptr_t offset() const { return offset_; } |
| 1251 void set_offset(intptr_t offset) { offset_ = offset; } | 1251 void set_offset(intptr_t offset) { offset_ = offset; } |
| 1252 | 1252 |
| 1253 // For all instruction in this block: Remove all inputs (including in the | 1253 // For all instruction in this block: Remove all inputs (including in the |
| 1254 // environment) from their definition's use lists for all instructions. | 1254 // environment) from their definition's use lists for all instructions. |
| 1255 void ClearAllInstructions(); | 1255 void ClearAllInstructions(); |
| 1256 | 1256 |
| 1257 DEFINE_INSTRUCTION_TYPE_CHECK(BlockEntry) | 1257 DEFINE_INSTRUCTION_TYPE_CHECK(BlockEntry) |
| 1258 | 1258 |
| 1259 protected: | 1259 protected: |
| 1260 BlockEntryInstr(intptr_t block_id, intptr_t try_index) | 1260 BlockEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t deopt_id) |
| 1261 : Instruction(Thread::Current()->GetNextDeoptId()), | 1261 : Instruction(deopt_id), |
| 1262 block_id_(block_id), | 1262 block_id_(block_id), |
| 1263 try_index_(try_index), | 1263 try_index_(try_index), |
| 1264 preorder_number_(-1), | 1264 preorder_number_(-1), |
| 1265 postorder_number_(-1), | 1265 postorder_number_(-1), |
| 1266 dominator_(NULL), | 1266 dominator_(NULL), |
| 1267 dominated_blocks_(1), | 1267 dominated_blocks_(1), |
| 1268 last_instruction_(NULL), | 1268 last_instruction_(NULL), |
| 1269 offset_(-1), | 1269 offset_(-1), |
| 1270 parallel_move_(NULL), | 1270 parallel_move_(NULL), |
| 1271 loop_info_(NULL) {} | 1271 loop_info_(NULL) {} |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 intptr_t entry_count_; | 1430 intptr_t entry_count_; |
| 1431 intptr_t spill_slot_count_; | 1431 intptr_t spill_slot_count_; |
| 1432 intptr_t fixed_slot_count_; // For try-catch in optimized code. | 1432 intptr_t fixed_slot_count_; // For try-catch in optimized code. |
| 1433 | 1433 |
| 1434 DISALLOW_COPY_AND_ASSIGN(GraphEntryInstr); | 1434 DISALLOW_COPY_AND_ASSIGN(GraphEntryInstr); |
| 1435 }; | 1435 }; |
| 1436 | 1436 |
| 1437 | 1437 |
| 1438 class JoinEntryInstr : public BlockEntryInstr { | 1438 class JoinEntryInstr : public BlockEntryInstr { |
| 1439 public: | 1439 public: |
| 1440 JoinEntryInstr(intptr_t block_id, intptr_t try_index) | 1440 JoinEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t deopt_id) |
| 1441 : BlockEntryInstr(block_id, try_index), | 1441 : BlockEntryInstr(block_id, try_index, deopt_id), |
| 1442 predecessors_(2), // Two is the assumed to be the common case. | 1442 predecessors_(2), // Two is the assumed to be the common case. |
| 1443 phis_(NULL) {} | 1443 phis_(NULL) {} |
| 1444 | 1444 |
| 1445 DECLARE_INSTRUCTION(JoinEntry) | 1445 DECLARE_INSTRUCTION(JoinEntry) |
| 1446 | 1446 |
| 1447 virtual intptr_t PredecessorCount() const { return predecessors_.length(); } | 1447 virtual intptr_t PredecessorCount() const { return predecessors_.length(); } |
| 1448 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { | 1448 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { |
| 1449 return predecessors_[index]; | 1449 return predecessors_[index]; |
| 1450 } | 1450 } |
| 1451 | 1451 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1500 PhiInstr* Current() const { return (*phis_)[index_]; } | 1500 PhiInstr* Current() const { return (*phis_)[index_]; } |
| 1501 | 1501 |
| 1502 private: | 1502 private: |
| 1503 ZoneGrowableArray<PhiInstr*>* phis_; | 1503 ZoneGrowableArray<PhiInstr*>* phis_; |
| 1504 intptr_t index_; | 1504 intptr_t index_; |
| 1505 }; | 1505 }; |
| 1506 | 1506 |
| 1507 | 1507 |
| 1508 class TargetEntryInstr : public BlockEntryInstr { | 1508 class TargetEntryInstr : public BlockEntryInstr { |
| 1509 public: | 1509 public: |
| 1510 TargetEntryInstr(intptr_t block_id, intptr_t try_index) | 1510 TargetEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t deopt_id) |
| 1511 : BlockEntryInstr(block_id, try_index), | 1511 : BlockEntryInstr(block_id, try_index, deopt_id), |
| 1512 predecessor_(NULL), | 1512 predecessor_(NULL), |
| 1513 edge_weight_(0.0) {} | 1513 edge_weight_(0.0) {} |
| 1514 | 1514 |
| 1515 DECLARE_INSTRUCTION(TargetEntry) | 1515 DECLARE_INSTRUCTION(TargetEntry) |
| 1516 | 1516 |
| 1517 double edge_weight() const { return edge_weight_; } | 1517 double edge_weight() const { return edge_weight_; } |
| 1518 void set_edge_weight(double weight) { edge_weight_ = weight; } | 1518 void set_edge_weight(double weight) { edge_weight_ = weight; } |
| 1519 void adjust_edge_weight(double scale_factor) { edge_weight_ *= scale_factor; } | 1519 void adjust_edge_weight(double scale_factor) { edge_weight_ *= scale_factor; } |
| 1520 | 1520 |
| 1521 virtual intptr_t PredecessorCount() const { | 1521 virtual intptr_t PredecessorCount() const { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1541 double edge_weight_; | 1541 double edge_weight_; |
| 1542 | 1542 |
| 1543 DISALLOW_COPY_AND_ASSIGN(TargetEntryInstr); | 1543 DISALLOW_COPY_AND_ASSIGN(TargetEntryInstr); |
| 1544 }; | 1544 }; |
| 1545 | 1545 |
| 1546 | 1546 |
| 1547 class IndirectEntryInstr : public JoinEntryInstr { | 1547 class IndirectEntryInstr : public JoinEntryInstr { |
| 1548 public: | 1548 public: |
| 1549 IndirectEntryInstr(intptr_t block_id, | 1549 IndirectEntryInstr(intptr_t block_id, |
| 1550 intptr_t indirect_id, | 1550 intptr_t indirect_id, |
| 1551 intptr_t try_index) | 1551 intptr_t try_index, |
| 1552 : JoinEntryInstr(block_id, try_index), indirect_id_(indirect_id) {} | 1552 intptr_t deopt_id) |
| 1553 : JoinEntryInstr(block_id, try_index, deopt_id), |
| 1554 indirect_id_(indirect_id) {} |
| 1553 | 1555 |
| 1554 DECLARE_INSTRUCTION(IndirectEntry) | 1556 DECLARE_INSTRUCTION(IndirectEntry) |
| 1555 | 1557 |
| 1556 intptr_t indirect_id() const { return indirect_id_; } | 1558 intptr_t indirect_id() const { return indirect_id_; } |
| 1557 | 1559 |
| 1558 PRINT_TO_SUPPORT | 1560 PRINT_TO_SUPPORT |
| 1559 | 1561 |
| 1560 private: | 1562 private: |
| 1561 const intptr_t indirect_id_; | 1563 const intptr_t indirect_id_; |
| 1562 }; | 1564 }; |
| 1563 | 1565 |
| 1564 | 1566 |
| 1565 class CatchBlockEntryInstr : public BlockEntryInstr { | 1567 class CatchBlockEntryInstr : public BlockEntryInstr { |
| 1566 public: | 1568 public: |
| 1567 CatchBlockEntryInstr(TokenPosition handler_token_pos, | 1569 CatchBlockEntryInstr(TokenPosition handler_token_pos, |
| 1568 bool is_generated, | 1570 bool is_generated, |
| 1569 intptr_t block_id, | 1571 intptr_t block_id, |
| 1570 intptr_t try_index, | 1572 intptr_t try_index, |
| 1571 GraphEntryInstr* graph_entry, | 1573 GraphEntryInstr* graph_entry, |
| 1572 const Array& handler_types, | 1574 const Array& handler_types, |
| 1573 intptr_t catch_try_index, | 1575 intptr_t catch_try_index, |
| 1574 const LocalVariable& exception_var, | 1576 const LocalVariable& exception_var, |
| 1575 const LocalVariable& stacktrace_var, | 1577 const LocalVariable& stacktrace_var, |
| 1576 bool needs_stacktrace, | 1578 bool needs_stacktrace, |
| 1577 intptr_t deopt_id, | 1579 intptr_t deopt_id, |
| 1578 bool should_restore_closure_context = false) | 1580 bool should_restore_closure_context = false) |
| 1579 : BlockEntryInstr(block_id, try_index), | 1581 : BlockEntryInstr(block_id, try_index, deopt_id), |
| 1580 graph_entry_(graph_entry), | 1582 graph_entry_(graph_entry), |
| 1581 predecessor_(NULL), | 1583 predecessor_(NULL), |
| 1582 catch_handler_types_(Array::ZoneHandle(handler_types.raw())), | 1584 catch_handler_types_(Array::ZoneHandle(handler_types.raw())), |
| 1583 catch_try_index_(catch_try_index), | 1585 catch_try_index_(catch_try_index), |
| 1584 exception_var_(exception_var), | 1586 exception_var_(exception_var), |
| 1585 stacktrace_var_(stacktrace_var), | 1587 stacktrace_var_(stacktrace_var), |
| 1586 needs_stacktrace_(needs_stacktrace), | 1588 needs_stacktrace_(needs_stacktrace), |
| 1587 should_restore_closure_context_(should_restore_closure_context), | 1589 should_restore_closure_context_(should_restore_closure_context), |
| 1588 handler_token_pos_(handler_token_pos), | 1590 handler_token_pos_(handler_token_pos), |
| 1589 is_generated_(is_generated) { | 1591 is_generated_(is_generated) {} |
| 1590 deopt_id_ = deopt_id; | |
| 1591 } | |
| 1592 | 1592 |
| 1593 DECLARE_INSTRUCTION(CatchBlockEntry) | 1593 DECLARE_INSTRUCTION(CatchBlockEntry) |
| 1594 | 1594 |
| 1595 virtual intptr_t PredecessorCount() const { | 1595 virtual intptr_t PredecessorCount() const { |
| 1596 return (predecessor_ == NULL) ? 0 : 1; | 1596 return (predecessor_ == NULL) ? 0 : 1; |
| 1597 } | 1597 } |
| 1598 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { | 1598 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { |
| 1599 ASSERT((index == 0) && (predecessor_ != NULL)); | 1599 ASSERT((index == 0) && (predecessor_ != NULL)); |
| 1600 return predecessor_; | 1600 return predecessor_; |
| 1601 } | 1601 } |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2096 }; | 2096 }; |
| 2097 | 2097 |
| 2098 | 2098 |
| 2099 inline Definition* Instruction::ArgumentAt(intptr_t index) const { | 2099 inline Definition* Instruction::ArgumentAt(intptr_t index) const { |
| 2100 return PushArgumentAt(index)->value()->definition(); | 2100 return PushArgumentAt(index)->value()->definition(); |
| 2101 } | 2101 } |
| 2102 | 2102 |
| 2103 | 2103 |
| 2104 class ReturnInstr : public TemplateInstruction<1, NoThrow> { | 2104 class ReturnInstr : public TemplateInstruction<1, NoThrow> { |
| 2105 public: | 2105 public: |
| 2106 ReturnInstr(TokenPosition token_pos, Value* value) | 2106 ReturnInstr(TokenPosition token_pos, Value* value, intptr_t deopt_id) |
| 2107 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2107 : TemplateInstruction(deopt_id), token_pos_(token_pos) { |
| 2108 token_pos_(token_pos) { | |
| 2109 SetInputAt(0, value); | 2108 SetInputAt(0, value); |
| 2110 } | 2109 } |
| 2111 | 2110 |
| 2112 DECLARE_INSTRUCTION(Return) | 2111 DECLARE_INSTRUCTION(Return) |
| 2113 | 2112 |
| 2114 virtual TokenPosition token_pos() const { return token_pos_; } | 2113 virtual TokenPosition token_pos() const { return token_pos_; } |
| 2115 Value* value() const { return inputs_[0]; } | 2114 Value* value() const { return inputs_[0]; } |
| 2116 | 2115 |
| 2117 virtual bool CanBecomeDeoptimizationTarget() const { | 2116 virtual bool CanBecomeDeoptimizationTarget() const { |
| 2118 // Return instruction might turn into a Goto instruction after inlining. | 2117 // Return instruction might turn into a Goto instruction after inlining. |
| 2119 // Every Goto must have an environment. | 2118 // Every Goto must have an environment. |
| 2120 return true; | 2119 return true; |
| 2121 } | 2120 } |
| 2122 | 2121 |
| 2123 virtual bool ComputeCanDeoptimize() const { return false; } | 2122 virtual bool ComputeCanDeoptimize() const { return false; } |
| 2124 | 2123 |
| 2125 virtual EffectSet Effects() const { return EffectSet::None(); } | 2124 virtual EffectSet Effects() const { return EffectSet::None(); } |
| 2126 | 2125 |
| 2127 private: | 2126 private: |
| 2128 const TokenPosition token_pos_; | 2127 const TokenPosition token_pos_; |
| 2129 | 2128 |
| 2130 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); | 2129 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); |
| 2131 }; | 2130 }; |
| 2132 | 2131 |
| 2133 | 2132 |
| 2134 class ThrowInstr : public TemplateInstruction<0, Throws> { | 2133 class ThrowInstr : public TemplateInstruction<0, Throws> { |
| 2135 public: | 2134 public: |
| 2136 explicit ThrowInstr(TokenPosition token_pos) | 2135 explicit ThrowInstr(TokenPosition token_pos, intptr_t deopt_id) |
| 2137 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2136 : TemplateInstruction(deopt_id), token_pos_(token_pos) {} |
| 2138 token_pos_(token_pos) {} | |
| 2139 | 2137 |
| 2140 DECLARE_INSTRUCTION(Throw) | 2138 DECLARE_INSTRUCTION(Throw) |
| 2141 | 2139 |
| 2142 virtual intptr_t ArgumentCount() const { return 1; } | 2140 virtual intptr_t ArgumentCount() const { return 1; } |
| 2143 | 2141 |
| 2144 virtual TokenPosition token_pos() const { return token_pos_; } | 2142 virtual TokenPosition token_pos() const { return token_pos_; } |
| 2145 | 2143 |
| 2146 virtual bool ComputeCanDeoptimize() const { return true; } | 2144 virtual bool ComputeCanDeoptimize() const { return true; } |
| 2147 | 2145 |
| 2148 virtual EffectSet Effects() const { return EffectSet::None(); } | 2146 virtual EffectSet Effects() const { return EffectSet::None(); } |
| 2149 | 2147 |
| 2150 private: | 2148 private: |
| 2151 const TokenPosition token_pos_; | 2149 const TokenPosition token_pos_; |
| 2152 | 2150 |
| 2153 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); | 2151 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); |
| 2154 }; | 2152 }; |
| 2155 | 2153 |
| 2156 | 2154 |
| 2157 class ReThrowInstr : public TemplateInstruction<0, Throws> { | 2155 class ReThrowInstr : public TemplateInstruction<0, Throws> { |
| 2158 public: | 2156 public: |
| 2159 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the | 2157 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the |
| 2160 // rethrow has been artificially generated by the parser. | 2158 // rethrow has been artificially generated by the parser. |
| 2161 ReThrowInstr(TokenPosition token_pos, intptr_t catch_try_index) | 2159 ReThrowInstr(TokenPosition token_pos, |
| 2162 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2160 intptr_t catch_try_index, |
| 2161 intptr_t deopt_id) |
| 2162 : TemplateInstruction(deopt_id), |
| 2163 token_pos_(token_pos), | 2163 token_pos_(token_pos), |
| 2164 catch_try_index_(catch_try_index) {} | 2164 catch_try_index_(catch_try_index) {} |
| 2165 | 2165 |
| 2166 DECLARE_INSTRUCTION(ReThrow) | 2166 DECLARE_INSTRUCTION(ReThrow) |
| 2167 | 2167 |
| 2168 virtual intptr_t ArgumentCount() const { return 2; } | 2168 virtual intptr_t ArgumentCount() const { return 2; } |
| 2169 | 2169 |
| 2170 virtual TokenPosition token_pos() const { return token_pos_; } | 2170 virtual TokenPosition token_pos() const { return token_pos_; } |
| 2171 intptr_t catch_try_index() const { return catch_try_index_; } | 2171 intptr_t catch_try_index() const { return catch_try_index_; } |
| 2172 | 2172 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2202 | 2202 |
| 2203 private: | 2203 private: |
| 2204 const char* message_; | 2204 const char* message_; |
| 2205 | 2205 |
| 2206 DISALLOW_COPY_AND_ASSIGN(StopInstr); | 2206 DISALLOW_COPY_AND_ASSIGN(StopInstr); |
| 2207 }; | 2207 }; |
| 2208 | 2208 |
| 2209 | 2209 |
| 2210 class GotoInstr : public TemplateInstruction<0, NoThrow> { | 2210 class GotoInstr : public TemplateInstruction<0, NoThrow> { |
| 2211 public: | 2211 public: |
| 2212 explicit GotoInstr(JoinEntryInstr* entry) | 2212 explicit GotoInstr(JoinEntryInstr* entry, intptr_t deopt_id) |
| 2213 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 2213 : TemplateInstruction(deopt_id), |
| 2214 block_(NULL), | 2214 block_(NULL), |
| 2215 successor_(entry), | 2215 successor_(entry), |
| 2216 edge_weight_(0.0), | 2216 edge_weight_(0.0), |
| 2217 parallel_move_(NULL) {} | 2217 parallel_move_(NULL) {} |
| 2218 | 2218 |
| 2219 DECLARE_INSTRUCTION(Goto) | 2219 DECLARE_INSTRUCTION(Goto) |
| 2220 | 2220 |
| 2221 BlockEntryInstr* block() const { return block_; } | 2221 BlockEntryInstr* block() const { return block_; } |
| 2222 void set_block(BlockEntryInstr* block) { block_ = block; } | 2222 void set_block(BlockEntryInstr* block) { block_ = block; } |
| 2223 | 2223 |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2416 protected: | 2416 protected: |
| 2417 EmbeddedArray<Value*, N> inputs_; | 2417 EmbeddedArray<Value*, N> inputs_; |
| 2418 | 2418 |
| 2419 private: | 2419 private: |
| 2420 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } | 2420 virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; } |
| 2421 }; | 2421 }; |
| 2422 | 2422 |
| 2423 | 2423 |
| 2424 class BranchInstr : public Instruction { | 2424 class BranchInstr : public Instruction { |
| 2425 public: | 2425 public: |
| 2426 explicit BranchInstr(ComparisonInstr* comparison) | 2426 explicit BranchInstr(ComparisonInstr* comparison, intptr_t deopt_id) |
| 2427 : Instruction(Thread::Current()->GetNextDeoptId()), | 2427 : Instruction(deopt_id), comparison_(comparison), constant_target_(NULL) { |
| 2428 comparison_(comparison), | |
| 2429 constant_target_(NULL) { | |
| 2430 ASSERT(comparison->env() == NULL); | 2428 ASSERT(comparison->env() == NULL); |
| 2431 for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) { | 2429 for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) { |
| 2432 comparison->InputAt(i)->set_instruction(this); | 2430 comparison->InputAt(i)->set_instruction(this); |
| 2433 } | 2431 } |
| 2434 } | 2432 } |
| 2435 | 2433 |
| 2436 DECLARE_INSTRUCTION(Branch) | 2434 DECLARE_INSTRUCTION(Branch) |
| 2437 | 2435 |
| 2438 virtual intptr_t ArgumentCount() const { | 2436 virtual intptr_t ArgumentCount() const { |
| 2439 return comparison()->ArgumentCount(); | 2437 return comparison()->ArgumentCount(); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2698 const TokenPosition token_pos_; | 2696 const TokenPosition token_pos_; |
| 2699 AbstractType& dst_type_; | 2697 AbstractType& dst_type_; |
| 2700 const String& dst_name_; | 2698 const String& dst_name_; |
| 2701 | 2699 |
| 2702 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr); | 2700 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr); |
| 2703 }; | 2701 }; |
| 2704 | 2702 |
| 2705 | 2703 |
| 2706 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> { | 2704 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> { |
| 2707 public: | 2705 public: |
| 2708 AssertBooleanInstr(TokenPosition token_pos, Value* value) | 2706 AssertBooleanInstr(TokenPosition token_pos, Value* value, intptr_t deopt_id) |
| 2709 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 2707 : TemplateDefinition(deopt_id), token_pos_(token_pos) { |
| 2710 token_pos_(token_pos) { | |
| 2711 SetInputAt(0, value); | 2708 SetInputAt(0, value); |
| 2712 } | 2709 } |
| 2713 | 2710 |
| 2714 DECLARE_INSTRUCTION(AssertBoolean) | 2711 DECLARE_INSTRUCTION(AssertBoolean) |
| 2715 virtual CompileType ComputeType() const; | 2712 virtual CompileType ComputeType() const; |
| 2716 | 2713 |
| 2717 virtual TokenPosition token_pos() const { return token_pos_; } | 2714 virtual TokenPosition token_pos() const { return token_pos_; } |
| 2718 Value* value() const { return inputs_[0]; } | 2715 Value* value() const { return inputs_[0]; } |
| 2719 | 2716 |
| 2720 virtual bool ComputeCanDeoptimize() const { return true; } | 2717 virtual bool ComputeCanDeoptimize() const { return true; } |
| 2721 | 2718 |
| 2722 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 2719 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
| 2723 | 2720 |
| 2724 virtual bool AttributesEqual(Instruction* other) const { return true; } | 2721 virtual bool AttributesEqual(Instruction* other) const { return true; } |
| 2725 | 2722 |
| 2726 PRINT_OPERANDS_TO_SUPPORT | 2723 PRINT_OPERANDS_TO_SUPPORT |
| 2727 | 2724 |
| 2728 private: | 2725 private: |
| 2729 const TokenPosition token_pos_; | 2726 const TokenPosition token_pos_; |
| 2730 | 2727 |
| 2731 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); | 2728 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); |
| 2732 }; | 2729 }; |
| 2733 | 2730 |
| 2734 | 2731 |
| 2735 // Denotes the current context, normally held in a register. This is | 2732 // Denotes the current context, normally held in a register. This is |
| 2736 // a computation, not a value, because it's mutable. | 2733 // a computation, not a value, because it's mutable. |
| 2737 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { | 2734 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { |
| 2738 public: | 2735 public: |
| 2739 CurrentContextInstr() | 2736 explicit CurrentContextInstr(intptr_t deopt_id) |
| 2740 : TemplateDefinition(Thread::Current()->GetNextDeoptId()) {} | 2737 : TemplateDefinition(deopt_id) {} |
| 2741 | 2738 |
| 2742 DECLARE_INSTRUCTION(CurrentContext) | 2739 DECLARE_INSTRUCTION(CurrentContext) |
| 2743 virtual CompileType ComputeType() const; | 2740 virtual CompileType ComputeType() const; |
| 2744 | 2741 |
| 2745 virtual bool ComputeCanDeoptimize() const { return false; } | 2742 virtual bool ComputeCanDeoptimize() const { return false; } |
| 2746 | 2743 |
| 2747 virtual EffectSet Effects() const { return EffectSet::None(); } | 2744 virtual EffectSet Effects() const { return EffectSet::None(); } |
| 2748 virtual EffectSet Dependencies() const { return EffectSet::None(); } | 2745 virtual EffectSet Dependencies() const { return EffectSet::None(); } |
| 2749 virtual bool AttributesEqual(Instruction* other) const { return true; } | 2746 virtual bool AttributesEqual(Instruction* other) const { return true; } |
| 2750 | 2747 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2813 TokenPosition token_pos_; | 2810 TokenPosition token_pos_; |
| 2814 | 2811 |
| 2815 DISALLOW_COPY_AND_ASSIGN(TemplateDartCall); | 2812 DISALLOW_COPY_AND_ASSIGN(TemplateDartCall); |
| 2816 }; | 2813 }; |
| 2817 | 2814 |
| 2818 | 2815 |
| 2819 class ClosureCallInstr : public TemplateDartCall<1> { | 2816 class ClosureCallInstr : public TemplateDartCall<1> { |
| 2820 public: | 2817 public: |
| 2821 ClosureCallInstr(Value* function, | 2818 ClosureCallInstr(Value* function, |
| 2822 ClosureCallNode* node, | 2819 ClosureCallNode* node, |
| 2823 ZoneGrowableArray<PushArgumentInstr*>* arguments) | 2820 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
| 2824 : TemplateDartCall(Thread::Current()->GetNextDeoptId(), | 2821 intptr_t deopt_id) |
| 2822 : TemplateDartCall(deopt_id, |
| 2825 node->arguments()->type_args_len(), | 2823 node->arguments()->type_args_len(), |
| 2826 node->arguments()->names(), | 2824 node->arguments()->names(), |
| 2827 arguments, | 2825 arguments, |
| 2828 node->token_pos()) { | 2826 node->token_pos()) { |
| 2829 ASSERT(!arguments->is_empty()); | 2827 ASSERT(!arguments->is_empty()); |
| 2830 SetInputAt(0, function); | 2828 SetInputAt(0, function); |
| 2831 } | 2829 } |
| 2832 | 2830 |
| 2833 ClosureCallInstr(Value* function, | 2831 ClosureCallInstr(Value* function, |
| 2834 ZoneGrowableArray<PushArgumentInstr*>* arguments, | 2832 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
| 2835 intptr_t type_args_len, | 2833 intptr_t type_args_len, |
| 2836 const Array& argument_names, | 2834 const Array& argument_names, |
| 2837 TokenPosition token_pos) | 2835 TokenPosition token_pos, |
| 2838 : TemplateDartCall(Thread::Current()->GetNextDeoptId(), | 2836 intptr_t deopt_id) |
| 2837 : TemplateDartCall(deopt_id, |
| 2839 type_args_len, | 2838 type_args_len, |
| 2840 argument_names, | 2839 argument_names, |
| 2841 arguments, | 2840 arguments, |
| 2842 token_pos) { | 2841 token_pos) { |
| 2843 ASSERT(!arguments->is_empty()); | 2842 ASSERT(!arguments->is_empty()); |
| 2844 SetInputAt(0, function); | 2843 SetInputAt(0, function); |
| 2845 } | 2844 } |
| 2846 | 2845 |
| 2847 DECLARE_INSTRUCTION(ClosureCall) | 2846 DECLARE_INSTRUCTION(ClosureCall) |
| 2848 | 2847 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2862 | 2861 |
| 2863 class InstanceCallInstr : public TemplateDartCall<0> { | 2862 class InstanceCallInstr : public TemplateDartCall<0> { |
| 2864 public: | 2863 public: |
| 2865 InstanceCallInstr(TokenPosition token_pos, | 2864 InstanceCallInstr(TokenPosition token_pos, |
| 2866 const String& function_name, | 2865 const String& function_name, |
| 2867 Token::Kind token_kind, | 2866 Token::Kind token_kind, |
| 2868 ZoneGrowableArray<PushArgumentInstr*>* arguments, | 2867 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
| 2869 intptr_t type_args_len, | 2868 intptr_t type_args_len, |
| 2870 const Array& argument_names, | 2869 const Array& argument_names, |
| 2871 intptr_t checked_argument_count, | 2870 intptr_t checked_argument_count, |
| 2872 const ZoneGrowableArray<const ICData*>& ic_data_array) | 2871 const ZoneGrowableArray<const ICData*>& ic_data_array, |
| 2873 : TemplateDartCall(Thread::Current()->GetNextDeoptId(), | 2872 intptr_t deopt_id) |
| 2873 : TemplateDartCall(deopt_id, |
| 2874 type_args_len, | 2874 type_args_len, |
| 2875 argument_names, | 2875 argument_names, |
| 2876 arguments, | 2876 arguments, |
| 2877 token_pos), | 2877 token_pos), |
| 2878 ic_data_(NULL), | 2878 ic_data_(NULL), |
| 2879 function_name_(function_name), | 2879 function_name_(function_name), |
| 2880 token_kind_(token_kind), | 2880 token_kind_(token_kind), |
| 2881 checked_argument_count_(checked_argument_count), | 2881 checked_argument_count_(checked_argument_count), |
| 2882 has_unique_selector_(false) { | 2882 has_unique_selector_(false) { |
| 2883 ic_data_ = GetICData(ic_data_array); | 2883 ic_data_ = GetICData(ic_data_array); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3018 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr); | 3018 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr); |
| 3019 }; | 3019 }; |
| 3020 | 3020 |
| 3021 | 3021 |
| 3022 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { | 3022 class StrictCompareInstr : public TemplateComparison<2, NoThrow, Pure> { |
| 3023 public: | 3023 public: |
| 3024 StrictCompareInstr(TokenPosition token_pos, | 3024 StrictCompareInstr(TokenPosition token_pos, |
| 3025 Token::Kind kind, | 3025 Token::Kind kind, |
| 3026 Value* left, | 3026 Value* left, |
| 3027 Value* right, | 3027 Value* right, |
| 3028 bool needs_number_check); | 3028 bool needs_number_check, |
| 3029 intptr_t deopt_id); |
| 3029 | 3030 |
| 3030 DECLARE_INSTRUCTION(StrictCompare) | 3031 DECLARE_INSTRUCTION(StrictCompare) |
| 3031 | 3032 |
| 3032 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); | 3033 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); |
| 3033 | 3034 |
| 3034 virtual CompileType ComputeType() const; | 3035 virtual CompileType ComputeType() const; |
| 3035 | 3036 |
| 3036 virtual bool ComputeCanDeoptimize() const { return false; } | 3037 virtual bool ComputeCanDeoptimize() const { return false; } |
| 3037 | 3038 |
| 3038 virtual Definition* Canonicalize(FlowGraph* flow_graph); | 3039 virtual Definition* Canonicalize(FlowGraph* flow_graph); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3230 | 3231 |
| 3231 private: | 3232 private: |
| 3232 DISALLOW_COPY_AND_ASSIGN(RelationalOpInstr); | 3233 DISALLOW_COPY_AND_ASSIGN(RelationalOpInstr); |
| 3233 }; | 3234 }; |
| 3234 | 3235 |
| 3235 | 3236 |
| 3236 // TODO(vegorov): ComparisonInstr should be switched to use IfTheElseInstr for | 3237 // TODO(vegorov): ComparisonInstr should be switched to use IfTheElseInstr for |
| 3237 // materialization of true and false constants. | 3238 // materialization of true and false constants. |
| 3238 class IfThenElseInstr : public Definition { | 3239 class IfThenElseInstr : public Definition { |
| 3239 public: | 3240 public: |
| 3240 IfThenElseInstr(ComparisonInstr* comparison, Value* if_true, Value* if_false) | 3241 IfThenElseInstr(ComparisonInstr* comparison, |
| 3241 : Definition(Thread::Current()->GetNextDeoptId()), | 3242 Value* if_true, |
| 3243 Value* if_false, |
| 3244 intptr_t deopt_id) |
| 3245 : Definition(deopt_id), |
| 3242 comparison_(comparison), | 3246 comparison_(comparison), |
| 3243 if_true_(Smi::Cast(if_true->BoundConstant()).Value()), | 3247 if_true_(Smi::Cast(if_true->BoundConstant()).Value()), |
| 3244 if_false_(Smi::Cast(if_false->BoundConstant()).Value()) { | 3248 if_false_(Smi::Cast(if_false->BoundConstant()).Value()) { |
| 3245 // Adjust uses at the comparison. | 3249 // Adjust uses at the comparison. |
| 3246 ASSERT(comparison->env() == NULL); | 3250 ASSERT(comparison->env() == NULL); |
| 3247 for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) { | 3251 for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) { |
| 3248 comparison->InputAt(i)->set_instruction(this); | 3252 comparison->InputAt(i)->set_instruction(this); |
| 3249 } | 3253 } |
| 3250 } | 3254 } |
| 3251 | 3255 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3313 }; | 3317 }; |
| 3314 | 3318 |
| 3315 | 3319 |
| 3316 class StaticCallInstr : public TemplateDartCall<0> { | 3320 class StaticCallInstr : public TemplateDartCall<0> { |
| 3317 public: | 3321 public: |
| 3318 StaticCallInstr(TokenPosition token_pos, | 3322 StaticCallInstr(TokenPosition token_pos, |
| 3319 const Function& function, | 3323 const Function& function, |
| 3320 intptr_t type_args_len, | 3324 intptr_t type_args_len, |
| 3321 const Array& argument_names, | 3325 const Array& argument_names, |
| 3322 ZoneGrowableArray<PushArgumentInstr*>* arguments, | 3326 ZoneGrowableArray<PushArgumentInstr*>* arguments, |
| 3323 const ZoneGrowableArray<const ICData*>& ic_data_array) | 3327 const ZoneGrowableArray<const ICData*>& ic_data_array, |
| 3324 : TemplateDartCall(Thread::Current()->GetNextDeoptId(), | 3328 intptr_t deopt_id) |
| 3329 : TemplateDartCall(deopt_id, |
| 3325 type_args_len, | 3330 type_args_len, |
| 3326 argument_names, | 3331 argument_names, |
| 3327 arguments, | 3332 arguments, |
| 3328 token_pos), | 3333 token_pos), |
| 3329 ic_data_(NULL), | 3334 ic_data_(NULL), |
| 3330 function_(function), | 3335 function_(function), |
| 3331 result_cid_(kDynamicCid), | 3336 result_cid_(kDynamicCid), |
| 3332 is_known_list_constructor_(false), | 3337 is_known_list_constructor_(false), |
| 3333 identity_(AliasIdentity::Unknown()) { | 3338 identity_(AliasIdentity::Unknown()) { |
| 3334 ic_data_ = GetICData(ic_data_array); | 3339 ic_data_ = GetICData(ic_data_array); |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4014 | 4019 |
| 4015 private: | 4020 private: |
| 4016 const intptr_t cid_; | 4021 const intptr_t cid_; |
| 4017 | 4022 |
| 4018 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); | 4023 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); |
| 4019 }; | 4024 }; |
| 4020 | 4025 |
| 4021 | 4026 |
| 4022 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { | 4027 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { |
| 4023 public: | 4028 public: |
| 4024 StringInterpolateInstr(Value* value, TokenPosition token_pos) | 4029 StringInterpolateInstr(Value* value, |
| 4025 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4030 TokenPosition token_pos, |
| 4031 intptr_t deopt_id) |
| 4032 : TemplateDefinition(deopt_id), |
| 4026 token_pos_(token_pos), | 4033 token_pos_(token_pos), |
| 4027 function_(Function::ZoneHandle()) { | 4034 function_(Function::ZoneHandle()) { |
| 4028 SetInputAt(0, value); | 4035 SetInputAt(0, value); |
| 4029 } | 4036 } |
| 4030 | 4037 |
| 4031 Value* value() const { return inputs_[0]; } | 4038 Value* value() const { return inputs_[0]; } |
| 4032 virtual TokenPosition token_pos() const { return token_pos_; } | 4039 virtual TokenPosition token_pos() const { return token_pos_; } |
| 4033 | 4040 |
| 4034 virtual CompileType ComputeType() const; | 4041 virtual CompileType ComputeType() const; |
| 4035 // Issues a static call to Dart code which calls toString on objects. | 4042 // Issues a static call to Dart code which calls toString on objects. |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4350 bool registers_remapped_; | 4357 bool registers_remapped_; |
| 4351 | 4358 |
| 4352 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr); | 4359 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr); |
| 4353 }; | 4360 }; |
| 4354 | 4361 |
| 4355 | 4362 |
| 4356 class CreateArrayInstr : public TemplateDefinition<2, Throws> { | 4363 class CreateArrayInstr : public TemplateDefinition<2, Throws> { |
| 4357 public: | 4364 public: |
| 4358 CreateArrayInstr(TokenPosition token_pos, | 4365 CreateArrayInstr(TokenPosition token_pos, |
| 4359 Value* element_type, | 4366 Value* element_type, |
| 4360 Value* num_elements) | 4367 Value* num_elements, |
| 4361 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4368 intptr_t deopt_id) |
| 4369 : TemplateDefinition(deopt_id), |
| 4362 token_pos_(token_pos), | 4370 token_pos_(token_pos), |
| 4363 identity_(AliasIdentity::Unknown()) { | 4371 identity_(AliasIdentity::Unknown()) { |
| 4364 SetInputAt(kElementTypePos, element_type); | 4372 SetInputAt(kElementTypePos, element_type); |
| 4365 SetInputAt(kLengthPos, num_elements); | 4373 SetInputAt(kLengthPos, num_elements); |
| 4366 } | 4374 } |
| 4367 | 4375 |
| 4368 enum { kElementTypePos = 0, kLengthPos = 1 }; | 4376 enum { kElementTypePos = 0, kLengthPos = 1 }; |
| 4369 | 4377 |
| 4370 DECLARE_INSTRUCTION(CreateArray) | 4378 DECLARE_INSTRUCTION(CreateArray) |
| 4371 virtual CompileType ComputeType() const; | 4379 virtual CompileType ComputeType() const; |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4552 | 4560 |
| 4553 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr); | 4561 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr); |
| 4554 }; | 4562 }; |
| 4555 | 4563 |
| 4556 | 4564 |
| 4557 class InstantiateTypeInstr : public TemplateDefinition<2, Throws> { | 4565 class InstantiateTypeInstr : public TemplateDefinition<2, Throws> { |
| 4558 public: | 4566 public: |
| 4559 InstantiateTypeInstr(TokenPosition token_pos, | 4567 InstantiateTypeInstr(TokenPosition token_pos, |
| 4560 const AbstractType& type, | 4568 const AbstractType& type, |
| 4561 Value* instantiator_type_arguments, | 4569 Value* instantiator_type_arguments, |
| 4562 Value* function_type_arguments) | 4570 Value* function_type_arguments, |
| 4563 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4571 intptr_t deopt_id) |
| 4564 token_pos_(token_pos), | 4572 : TemplateDefinition(deopt_id), token_pos_(token_pos), type_(type) { |
| 4565 type_(type) { | |
| 4566 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); | 4573 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); |
| 4567 SetInputAt(0, instantiator_type_arguments); | 4574 SetInputAt(0, instantiator_type_arguments); |
| 4568 SetInputAt(1, function_type_arguments); | 4575 SetInputAt(1, function_type_arguments); |
| 4569 } | 4576 } |
| 4570 | 4577 |
| 4571 DECLARE_INSTRUCTION(InstantiateType) | 4578 DECLARE_INSTRUCTION(InstantiateType) |
| 4572 | 4579 |
| 4573 Value* instantiator_type_arguments() const { return inputs_[0]; } | 4580 Value* instantiator_type_arguments() const { return inputs_[0]; } |
| 4574 Value* function_type_arguments() const { return inputs_[1]; } | 4581 Value* function_type_arguments() const { return inputs_[1]; } |
| 4575 const AbstractType& type() const { return type_; } | 4582 const AbstractType& type() const { return type_; } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4588 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); | 4595 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); |
| 4589 }; | 4596 }; |
| 4590 | 4597 |
| 4591 | 4598 |
| 4592 class InstantiateTypeArgumentsInstr : public TemplateDefinition<2, Throws> { | 4599 class InstantiateTypeArgumentsInstr : public TemplateDefinition<2, Throws> { |
| 4593 public: | 4600 public: |
| 4594 InstantiateTypeArgumentsInstr(TokenPosition token_pos, | 4601 InstantiateTypeArgumentsInstr(TokenPosition token_pos, |
| 4595 const TypeArguments& type_arguments, | 4602 const TypeArguments& type_arguments, |
| 4596 const Class& instantiator_class, | 4603 const Class& instantiator_class, |
| 4597 Value* instantiator_type_arguments, | 4604 Value* instantiator_type_arguments, |
| 4598 Value* function_type_arguments) | 4605 Value* function_type_arguments, |
| 4599 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4606 intptr_t deopt_id) |
| 4607 : TemplateDefinition(deopt_id), |
| 4600 token_pos_(token_pos), | 4608 token_pos_(token_pos), |
| 4601 type_arguments_(type_arguments), | 4609 type_arguments_(type_arguments), |
| 4602 instantiator_class_(instantiator_class) { | 4610 instantiator_class_(instantiator_class) { |
| 4603 ASSERT(type_arguments.IsZoneHandle()); | 4611 ASSERT(type_arguments.IsZoneHandle()); |
| 4604 SetInputAt(0, instantiator_type_arguments); | 4612 SetInputAt(0, instantiator_type_arguments); |
| 4605 SetInputAt(1, function_type_arguments); | 4613 SetInputAt(1, function_type_arguments); |
| 4606 } | 4614 } |
| 4607 | 4615 |
| 4608 DECLARE_INSTRUCTION(InstantiateTypeArguments) | 4616 DECLARE_INSTRUCTION(InstantiateTypeArguments) |
| 4609 | 4617 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4650 private: | 4658 private: |
| 4651 const TokenPosition token_pos_; | 4659 const TokenPosition token_pos_; |
| 4652 const intptr_t num_context_variables_; | 4660 const intptr_t num_context_variables_; |
| 4653 | 4661 |
| 4654 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); | 4662 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); |
| 4655 }; | 4663 }; |
| 4656 | 4664 |
| 4657 | 4665 |
| 4658 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { | 4666 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { |
| 4659 public: | 4667 public: |
| 4660 InitStaticFieldInstr(Value* input, const Field& field) | 4668 InitStaticFieldInstr(Value* input, const Field& field, intptr_t deopt_id) |
| 4661 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 4669 : TemplateInstruction(deopt_id), field_(field) { |
| 4662 field_(field) { | |
| 4663 SetInputAt(0, input); | 4670 SetInputAt(0, input); |
| 4664 CheckField(field); | 4671 CheckField(field); |
| 4665 } | 4672 } |
| 4666 | 4673 |
| 4667 virtual TokenPosition token_pos() const { return field_.token_pos(); } | 4674 virtual TokenPosition token_pos() const { return field_.token_pos(); } |
| 4668 const Field& field() const { return field_; } | 4675 const Field& field() const { return field_; } |
| 4669 | 4676 |
| 4670 DECLARE_INSTRUCTION(InitStaticField) | 4677 DECLARE_INSTRUCTION(InitStaticField) |
| 4671 | 4678 |
| 4672 virtual bool ComputeCanDeoptimize() const { return true; } | 4679 virtual bool ComputeCanDeoptimize() const { return true; } |
| 4673 virtual EffectSet Effects() const { return EffectSet::All(); } | 4680 virtual EffectSet Effects() const { return EffectSet::All(); } |
| 4674 virtual Instruction* Canonicalize(FlowGraph* flow_graph); | 4681 virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
| 4675 | 4682 |
| 4676 private: | 4683 private: |
| 4677 const Field& field_; | 4684 const Field& field_; |
| 4678 | 4685 |
| 4679 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); | 4686 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); |
| 4680 }; | 4687 }; |
| 4681 | 4688 |
| 4682 | 4689 |
| 4683 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { | 4690 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { |
| 4684 public: | 4691 public: |
| 4685 CloneContextInstr(TokenPosition token_pos, Value* context_value) | 4692 CloneContextInstr(TokenPosition token_pos, |
| 4686 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), | 4693 Value* context_value, |
| 4687 token_pos_(token_pos) { | 4694 intptr_t deopt_id) |
| 4695 : TemplateDefinition(deopt_id), token_pos_(token_pos) { |
| 4688 SetInputAt(0, context_value); | 4696 SetInputAt(0, context_value); |
| 4689 } | 4697 } |
| 4690 | 4698 |
| 4691 virtual TokenPosition token_pos() const { return token_pos_; } | 4699 virtual TokenPosition token_pos() const { return token_pos_; } |
| 4692 Value* context_value() const { return inputs_[0]; } | 4700 Value* context_value() const { return inputs_[0]; } |
| 4693 | 4701 |
| 4694 DECLARE_INSTRUCTION(CloneContext) | 4702 DECLARE_INSTRUCTION(CloneContext) |
| 4695 virtual CompileType ComputeType() const; | 4703 virtual CompileType ComputeType() const; |
| 4696 | 4704 |
| 4697 virtual bool ComputeCanDeoptimize() const { return true; } | 4705 virtual bool ComputeCanDeoptimize() const { return true; } |
| (...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7197 | 7205 |
| 7198 private: | 7206 private: |
| 7199 const Token::Kind op_kind_; | 7207 const Token::Kind op_kind_; |
| 7200 | 7208 |
| 7201 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr); | 7209 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr); |
| 7202 }; | 7210 }; |
| 7203 | 7211 |
| 7204 | 7212 |
| 7205 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { | 7213 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { |
| 7206 public: | 7214 public: |
| 7207 CheckStackOverflowInstr(TokenPosition token_pos, intptr_t loop_depth) | 7215 CheckStackOverflowInstr(TokenPosition token_pos, |
| 7208 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), | 7216 intptr_t loop_depth, |
| 7217 intptr_t deopt_id) |
| 7218 : TemplateInstruction(deopt_id), |
| 7209 token_pos_(token_pos), | 7219 token_pos_(token_pos), |
| 7210 loop_depth_(loop_depth) {} | 7220 loop_depth_(loop_depth) {} |
| 7211 | 7221 |
| 7212 virtual TokenPosition token_pos() const { return token_pos_; } | 7222 virtual TokenPosition token_pos() const { return token_pos_; } |
| 7213 bool in_loop() const { return loop_depth_ > 0; } | 7223 bool in_loop() const { return loop_depth_ > 0; } |
| 7214 intptr_t loop_depth() const { return loop_depth_; } | 7224 intptr_t loop_depth() const { return loop_depth_; } |
| 7215 | 7225 |
| 7216 DECLARE_INSTRUCTION(CheckStackOverflow) | 7226 DECLARE_INSTRUCTION(CheckStackOverflow) |
| 7217 | 7227 |
| 7218 virtual bool ComputeCanDeoptimize() const { return true; } | 7228 virtual bool ComputeCanDeoptimize() const { return true; } |
| (...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8214 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ | 8224 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ |
| 8215 UNIMPLEMENTED(); \ | 8225 UNIMPLEMENTED(); \ |
| 8216 return NULL; \ | 8226 return NULL; \ |
| 8217 } \ | 8227 } \ |
| 8218 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8228 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
| 8219 | 8229 |
| 8220 | 8230 |
| 8221 } // namespace dart | 8231 } // namespace dart |
| 8222 | 8232 |
| 8223 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ | 8233 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |