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 #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/bootstrap.h" | 8 #include "vm/bootstrap.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/constant_propagator.h" | 10 #include "vm/constant_propagator.h" |
(...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1077 for (ForwardInstructionIterator it(this); !it.Done(); it.Advance()) { | 1077 for (ForwardInstructionIterator it(this); !it.Done(); it.Advance()) { |
1078 last = it.Current(); | 1078 last = it.Current(); |
1079 } | 1079 } |
1080 set_last_instruction(last); | 1080 set_last_instruction(last); |
1081 if (last->IsGoto()) last->AsGoto()->set_block(this); | 1081 if (last->IsGoto()) last->AsGoto()->set_block(this); |
1082 | 1082 |
1083 return true; | 1083 return true; |
1084 } | 1084 } |
1085 | 1085 |
1086 | 1086 |
| 1087 void GraphEntryInstr::PruneUnreachableForOSR(Zone* zone, |
| 1088 intptr_t max_block_id) { |
| 1089 ASSERT(osr_id_ != Compiler::kNoOSRDeoptId); |
| 1090 BitVector* block_marks = new (zone) BitVector(zone, max_block_id + 1); |
| 1091 bool found = PruneUnreachable(this, /*parent=*/NULL, block_marks); |
| 1092 ASSERT(found); |
| 1093 } |
| 1094 |
| 1095 |
1087 bool BlockEntryInstr::PruneUnreachable(GraphEntryInstr* graph_entry, | 1096 bool BlockEntryInstr::PruneUnreachable(GraphEntryInstr* graph_entry, |
1088 Instruction* parent, | 1097 Instruction* parent, |
1089 intptr_t osr_id, | |
1090 BitVector* block_marks) { | 1098 BitVector* block_marks) { |
| 1099 const intptr_t osr_id = graph_entry->osr_id(); |
| 1100 |
1091 // Search for the instruction with the OSR id. Use a depth first search | 1101 // Search for the instruction with the OSR id. Use a depth first search |
1092 // because basic blocks have not been discovered yet. Prune unreachable | 1102 // because basic blocks have not been discovered yet. Prune unreachable |
1093 // blocks by replacing the normal entry with a jump to the block | 1103 // blocks by replacing the normal entry with a jump to the block |
1094 // containing the OSR entry point. | 1104 // containing the OSR entry point. |
1095 | 1105 |
1096 // Do not visit blocks more than once. | 1106 // Do not visit blocks more than once. |
1097 if (block_marks->Contains(block_id())) return false; | 1107 if (block_marks->Contains(block_id())) return false; |
1098 block_marks->Add(block_id()); | 1108 block_marks->Add(block_id()); |
1099 | 1109 |
1100 // Search this block for the OSR id. | 1110 // Search this block for the OSR id. |
(...skipping 13 matching lines...) Expand all Loading... |
1114 GotoInstr* goto_join = | 1124 GotoInstr* goto_join = |
1115 new GotoInstr(AsJoinEntry(), Thread::Current()->GetNextDeoptId()); | 1125 new GotoInstr(AsJoinEntry(), Thread::Current()->GetNextDeoptId()); |
1116 goto_join->CopyDeoptIdFrom(*parent); | 1126 goto_join->CopyDeoptIdFrom(*parent); |
1117 graph_entry->normal_entry()->LinkTo(goto_join); | 1127 graph_entry->normal_entry()->LinkTo(goto_join); |
1118 return true; | 1128 return true; |
1119 } | 1129 } |
1120 } | 1130 } |
1121 | 1131 |
1122 // Recursively search the successors. | 1132 // Recursively search the successors. |
1123 for (intptr_t i = instr->SuccessorCount() - 1; i >= 0; --i) { | 1133 for (intptr_t i = instr->SuccessorCount() - 1; i >= 0; --i) { |
1124 if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, osr_id, | 1134 if (instr->SuccessorAt(i)->PruneUnreachable(graph_entry, instr, |
1125 block_marks)) { | 1135 block_marks)) { |
1126 return true; | 1136 return true; |
1127 } | 1137 } |
1128 } | 1138 } |
1129 return false; | 1139 return false; |
1130 } | 1140 } |
1131 | 1141 |
1132 | 1142 |
1133 bool BlockEntryInstr::Dominates(BlockEntryInstr* other) const { | 1143 bool BlockEntryInstr::Dominates(BlockEntryInstr* other) const { |
1134 // TODO(fschneider): Make this faster by e.g. storing dominators for each | 1144 // TODO(fschneider): Make this faster by e.g. storing dominators for each |
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2059 return NULL; | 2069 return NULL; |
2060 } | 2070 } |
2061 if ((constrained_type() != NULL) && | 2071 if ((constrained_type() != NULL) && |
2062 Type()->IsEqualTo(value()->definition()->Type())) { | 2072 Type()->IsEqualTo(value()->definition()->Type())) { |
2063 return value()->definition(); | 2073 return value()->definition(); |
2064 } | 2074 } |
2065 return this; | 2075 return this; |
2066 } | 2076 } |
2067 | 2077 |
2068 | 2078 |
| 2079 Instruction* CheckStackOverflowInstr::Canonicalize(FlowGraph* flow_graph) { |
| 2080 switch (kind_) { |
| 2081 case kOsrAndPreemption: |
| 2082 return this; |
| 2083 case kOsrOnly: |
| 2084 // Don't need OSR entries in the optimized code. |
| 2085 return NULL; |
| 2086 } |
| 2087 |
| 2088 // Switch above exhausts all possibilities but some compilers can't figure |
| 2089 // it out. |
| 2090 UNREACHABLE(); |
| 2091 return this; |
| 2092 } |
| 2093 |
| 2094 |
2069 bool LoadFieldInstr::IsImmutableLengthLoad() const { | 2095 bool LoadFieldInstr::IsImmutableLengthLoad() const { |
2070 switch (recognized_kind()) { | 2096 switch (recognized_kind()) { |
2071 case MethodRecognizer::kObjectArrayLength: | 2097 case MethodRecognizer::kObjectArrayLength: |
2072 case MethodRecognizer::kImmutableArrayLength: | 2098 case MethodRecognizer::kImmutableArrayLength: |
2073 case MethodRecognizer::kTypedDataLength: | 2099 case MethodRecognizer::kTypedDataLength: |
2074 case MethodRecognizer::kStringBaseLength: | 2100 case MethodRecognizer::kStringBaseLength: |
2075 return true; | 2101 return true; |
2076 default: | 2102 default: |
2077 return false; | 2103 return false; |
2078 } | 2104 } |
(...skipping 2280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4359 "native function '%s' (%" Pd " arguments) cannot be found", | 4385 "native function '%s' (%" Pd " arguments) cannot be found", |
4360 native_name().ToCString(), function().NumParameters()); | 4386 native_name().ToCString(), function().NumParameters()); |
4361 } | 4387 } |
4362 set_is_auto_scope(auto_setup_scope); | 4388 set_is_auto_scope(auto_setup_scope); |
4363 set_native_c_function(native_function); | 4389 set_native_c_function(native_function); |
4364 } | 4390 } |
4365 | 4391 |
4366 #undef __ | 4392 #undef __ |
4367 | 4393 |
4368 } // namespace dart | 4394 } // namespace dart |
OLD | NEW |