| 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/constant_propagator.h" | 8 #include "vm/constant_propagator.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 return defn; | 79 return defn; |
| 80 } | 80 } |
| 81 | 81 |
| 82 | 82 |
| 83 const ICData* Instruction::GetICData( | 83 const ICData* Instruction::GetICData( |
| 84 const ZoneGrowableArray<const ICData*>& ic_data_array) const { | 84 const ZoneGrowableArray<const ICData*>& ic_data_array) const { |
| 85 // The deopt_id can be outside the range of the IC data array for | 85 // The deopt_id can be outside the range of the IC data array for |
| 86 // computations added in the optimizing compiler. | 86 // computations added in the optimizing compiler. |
| 87 ASSERT(deopt_id_ != Isolate::kNoDeoptId); | 87 ASSERT(deopt_id_ != Thread::kNoDeoptId); |
| 88 if (deopt_id_ < ic_data_array.length()) { | 88 if (deopt_id_ < ic_data_array.length()) { |
| 89 return ic_data_array[deopt_id_]; | 89 return ic_data_array[deopt_id_]; |
| 90 } | 90 } |
| 91 return NULL; | 91 return NULL; |
| 92 } | 92 } |
| 93 | 93 |
| 94 | 94 |
| 95 intptr_t Instruction::Hashcode() const { | 95 intptr_t Instruction::Hashcode() const { |
| 96 intptr_t result = tag(); | 96 intptr_t result = tag(); |
| 97 for (intptr_t i = 0; i < InputCount(); ++i) { | 97 for (intptr_t i = 0; i < InputCount(); ++i) { |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 for (Environment::DeepIterator it(env()); !it.Done(); it.Advance()) { | 791 for (Environment::DeepIterator it(env()); !it.Done(); it.Advance()) { |
| 792 it.CurrentValue()->RemoveFromUseList(); | 792 it.CurrentValue()->RemoveFromUseList(); |
| 793 } | 793 } |
| 794 } | 794 } |
| 795 | 795 |
| 796 | 796 |
| 797 void Instruction::InheritDeoptTargetAfter(FlowGraph* flow_graph, | 797 void Instruction::InheritDeoptTargetAfter(FlowGraph* flow_graph, |
| 798 Definition* call, | 798 Definition* call, |
| 799 Definition* result) { | 799 Definition* result) { |
| 800 ASSERT(call->env() != NULL); | 800 ASSERT(call->env() != NULL); |
| 801 deopt_id_ = Isolate::ToDeoptAfter(call->deopt_id_); | 801 deopt_id_ = Thread::ToDeoptAfter(call->deopt_id_); |
| 802 call->env()->DeepCopyAfterTo(flow_graph->zone(), | 802 call->env()->DeepCopyAfterTo(flow_graph->zone(), |
| 803 this, | 803 this, |
| 804 call->ArgumentCount(), | 804 call->ArgumentCount(), |
| 805 flow_graph->constant_dead(), | 805 flow_graph->constant_dead(), |
| 806 result != NULL ? result | 806 result != NULL ? result |
| 807 : flow_graph->constant_dead()); | 807 : flow_graph->constant_dead()); |
| 808 env()->set_deopt_id(deopt_id_); | 808 env()->set_deopt_id(deopt_id_); |
| 809 } | 809 } |
| 810 | 810 |
| 811 | 811 |
| (...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2195 BoxIntegerInstr* box_defn = value()->definition()->AsBoxInteger(); | 2195 BoxIntegerInstr* box_defn = value()->definition()->AsBoxInteger(); |
| 2196 if (box_defn != NULL) { | 2196 if (box_defn != NULL) { |
| 2197 if (box_defn->value()->definition()->representation() == representation()) { | 2197 if (box_defn->value()->definition()->representation() == representation()) { |
| 2198 return box_defn->value()->definition(); | 2198 return box_defn->value()->definition(); |
| 2199 } else { | 2199 } else { |
| 2200 UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( | 2200 UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( |
| 2201 box_defn->value()->definition()->representation(), | 2201 box_defn->value()->definition()->representation(), |
| 2202 representation(), | 2202 representation(), |
| 2203 box_defn->value()->CopyWithType(), | 2203 box_defn->value()->CopyWithType(), |
| 2204 (representation() == kUnboxedInt32) ? | 2204 (representation() == kUnboxedInt32) ? |
| 2205 GetDeoptId() : Isolate::kNoDeoptId); | 2205 GetDeoptId() : Thread::kNoDeoptId); |
| 2206 // TODO(vegorov): marking resulting converter as truncating when | 2206 // TODO(vegorov): marking resulting converter as truncating when |
| 2207 // unboxing can't deoptimize is a workaround for the missing | 2207 // unboxing can't deoptimize is a workaround for the missing |
| 2208 // deoptimization environment when we insert converter after | 2208 // deoptimization environment when we insert converter after |
| 2209 // EliminateEnvironments and there is a mismatch between predicates | 2209 // EliminateEnvironments and there is a mismatch between predicates |
| 2210 // UnboxIntConverterInstr::CanDeoptimize and UnboxInt32::CanDeoptimize. | 2210 // UnboxIntConverterInstr::CanDeoptimize and UnboxInt32::CanDeoptimize. |
| 2211 if ((representation() == kUnboxedInt32) && | 2211 if ((representation() == kUnboxedInt32) && |
| 2212 (is_truncating() || !CanDeoptimize())) { | 2212 (is_truncating() || !CanDeoptimize())) { |
| 2213 converter->mark_truncating(); | 2213 converter->mark_truncating(); |
| 2214 } | 2214 } |
| 2215 flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue); | 2215 flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2258 value()->definition()->AsUnboxedIntConverter(); | 2258 value()->definition()->AsUnboxedIntConverter(); |
| 2259 if ((box_defn != NULL) && (box_defn->representation() == from())) { | 2259 if ((box_defn != NULL) && (box_defn->representation() == from())) { |
| 2260 if (box_defn->from() == to()) { | 2260 if (box_defn->from() == to()) { |
| 2261 return box_defn->value()->definition(); | 2261 return box_defn->value()->definition(); |
| 2262 } | 2262 } |
| 2263 | 2263 |
| 2264 UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( | 2264 UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr( |
| 2265 box_defn->from(), | 2265 box_defn->from(), |
| 2266 representation(), | 2266 representation(), |
| 2267 box_defn->value()->CopyWithType(), | 2267 box_defn->value()->CopyWithType(), |
| 2268 (to() == kUnboxedInt32) ? GetDeoptId() : Isolate::kNoDeoptId); | 2268 (to() == kUnboxedInt32) ? GetDeoptId() : Thread::kNoDeoptId); |
| 2269 if ((representation() == kUnboxedInt32) && is_truncating()) { | 2269 if ((representation() == kUnboxedInt32) && is_truncating()) { |
| 2270 converter->mark_truncating(); | 2270 converter->mark_truncating(); |
| 2271 } | 2271 } |
| 2272 flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue); | 2272 flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue); |
| 2273 return converter; | 2273 return converter; |
| 2274 } | 2274 } |
| 2275 | 2275 |
| 2276 UnboxInt64Instr* unbox_defn = value()->definition()->AsUnboxInt64(); | 2276 UnboxInt64Instr* unbox_defn = value()->definition()->AsUnboxInt64(); |
| 2277 if (unbox_defn != NULL && | 2277 if (unbox_defn != NULL && |
| 2278 (from() == kUnboxedMint) && | 2278 (from() == kUnboxedMint) && |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2937 | 2937 |
| 2938 StrictCompareInstr::StrictCompareInstr(intptr_t token_pos, | 2938 StrictCompareInstr::StrictCompareInstr(intptr_t token_pos, |
| 2939 Token::Kind kind, | 2939 Token::Kind kind, |
| 2940 Value* left, | 2940 Value* left, |
| 2941 Value* right, | 2941 Value* right, |
| 2942 bool needs_number_check) | 2942 bool needs_number_check) |
| 2943 : ComparisonInstr(token_pos, | 2943 : ComparisonInstr(token_pos, |
| 2944 kind, | 2944 kind, |
| 2945 left, | 2945 left, |
| 2946 right, | 2946 right, |
| 2947 Isolate::Current()->GetNextDeoptId()), | 2947 Thread::Current()->GetNextDeoptId()), |
| 2948 needs_number_check_(needs_number_check) { | 2948 needs_number_check_(needs_number_check) { |
| 2949 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); | 2949 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); |
| 2950 } | 2950 } |
| 2951 | 2951 |
| 2952 | 2952 |
| 2953 LocationSummary* InstanceCallInstr::MakeLocationSummary(Zone* zone, | 2953 LocationSummary* InstanceCallInstr::MakeLocationSummary(Zone* zone, |
| 2954 bool optimizing) const { | 2954 bool optimizing) const { |
| 2955 return MakeCallSummary(zone); | 2955 return MakeCallSummary(zone); |
| 2956 } | 2956 } |
| 2957 | 2957 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3165 } | 3165 } |
| 3166 | 3166 |
| 3167 | 3167 |
| 3168 Environment* Environment::From(Zone* zone, | 3168 Environment* Environment::From(Zone* zone, |
| 3169 const GrowableArray<Definition*>& definitions, | 3169 const GrowableArray<Definition*>& definitions, |
| 3170 intptr_t fixed_parameter_count, | 3170 intptr_t fixed_parameter_count, |
| 3171 const ParsedFunction& parsed_function) { | 3171 const ParsedFunction& parsed_function) { |
| 3172 Environment* env = | 3172 Environment* env = |
| 3173 new(zone) Environment(definitions.length(), | 3173 new(zone) Environment(definitions.length(), |
| 3174 fixed_parameter_count, | 3174 fixed_parameter_count, |
| 3175 Isolate::kNoDeoptId, | 3175 Thread::kNoDeoptId, |
| 3176 parsed_function, | 3176 parsed_function, |
| 3177 NULL); | 3177 NULL); |
| 3178 for (intptr_t i = 0; i < definitions.length(); ++i) { | 3178 for (intptr_t i = 0; i < definitions.length(); ++i) { |
| 3179 env->values_.Add(new(zone) Value(definitions[i])); | 3179 env->values_.Add(new(zone) Value(definitions[i])); |
| 3180 } | 3180 } |
| 3181 return env; | 3181 return env; |
| 3182 } | 3182 } |
| 3183 | 3183 |
| 3184 | 3184 |
| 3185 Environment* Environment::DeepCopy(Zone* zone, intptr_t length) const { | 3185 Environment* Environment::DeepCopy(Zone* zone, intptr_t length) const { |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3646 case Token::kTRUNCDIV: return 0; | 3646 case Token::kTRUNCDIV: return 0; |
| 3647 case Token::kMOD: return 1; | 3647 case Token::kMOD: return 1; |
| 3648 default: UNIMPLEMENTED(); return -1; | 3648 default: UNIMPLEMENTED(); return -1; |
| 3649 } | 3649 } |
| 3650 } | 3650 } |
| 3651 | 3651 |
| 3652 | 3652 |
| 3653 #undef __ | 3653 #undef __ |
| 3654 | 3654 |
| 3655 } // namespace dart | 3655 } // namespace dart |
| OLD | NEW |