| 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 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
| 6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define 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 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 private: | 1033 private: |
| 1034 const NativeBodyNode& ast_node_; | 1034 const NativeBodyNode& ast_node_; |
| 1035 const intptr_t try_index_; | 1035 const intptr_t try_index_; |
| 1036 | 1036 |
| 1037 DISALLOW_COPY_AND_ASSIGN(NativeCallComp); | 1037 DISALLOW_COPY_AND_ASSIGN(NativeCallComp); |
| 1038 }; | 1038 }; |
| 1039 | 1039 |
| 1040 | 1040 |
| 1041 class LoadInstanceFieldComp : public TemplateComputation<1> { | 1041 class LoadInstanceFieldComp : public TemplateComputation<1> { |
| 1042 public: | 1042 public: |
| 1043 // Set 'original' to NULL if LoadInstanceFieldComp cannot deoptimize. | 1043 LoadInstanceFieldComp(const Field& field, Value* instance) : field_(field) { |
| 1044 LoadInstanceFieldComp(const Field& field, | |
| 1045 Value* instance, | |
| 1046 InstanceCallComp* original) | |
| 1047 : field_(field), original_(original) { | |
| 1048 ASSERT(instance != NULL); | 1044 ASSERT(instance != NULL); |
| 1049 inputs_[0] = instance; | 1045 inputs_[0] = instance; |
| 1050 } | 1046 } |
| 1051 | 1047 |
| 1052 DECLARE_COMPUTATION(LoadInstanceField) | 1048 DECLARE_COMPUTATION(LoadInstanceField) |
| 1053 | 1049 |
| 1054 const Field& field() const { return field_; } | 1050 const Field& field() const { return field_; } |
| 1055 Value* instance() const { return inputs_[0]; } | 1051 Value* instance() const { return inputs_[0]; } |
| 1056 const InstanceCallComp* original() const { return original_; } | |
| 1057 | 1052 |
| 1058 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1053 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1059 | 1054 |
| 1060 virtual bool CanDeoptimize() const { return original_ != NULL; } | 1055 virtual bool CanDeoptimize() const { return false; } |
| 1061 virtual intptr_t ResultCid() const { return kDynamicCid; } | 1056 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1062 | 1057 |
| 1063 private: | 1058 private: |
| 1064 const Field& field_; | 1059 const Field& field_; |
| 1065 const InstanceCallComp* original_; // For optimizations. | |
| 1066 | 1060 |
| 1067 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp); | 1061 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp); |
| 1068 }; | 1062 }; |
| 1069 | 1063 |
| 1070 | 1064 |
| 1071 class StoreInstanceFieldComp : public TemplateComputation<2> { | 1065 class StoreInstanceFieldComp : public TemplateComputation<2> { |
| 1072 public: | 1066 public: |
| 1073 // Set 'original' to NULL if StoreInstanceFieldComp cannot deoptimize. | |
| 1074 StoreInstanceFieldComp(const Field& field, | 1067 StoreInstanceFieldComp(const Field& field, |
| 1075 Value* instance, | 1068 Value* instance, |
| 1076 Value* value, | 1069 Value* value) |
| 1077 InstanceCallComp* original) // Maybe NULL. | 1070 : field_(field) { |
| 1078 : field_(field), original_(original) { | |
| 1079 ASSERT(instance != NULL); | 1071 ASSERT(instance != NULL); |
| 1080 ASSERT(value != NULL); | 1072 ASSERT(value != NULL); |
| 1081 inputs_[0] = instance; | 1073 inputs_[0] = instance; |
| 1082 inputs_[1] = value; | 1074 inputs_[1] = value; |
| 1083 } | 1075 } |
| 1084 | 1076 |
| 1085 DECLARE_COMPUTATION(StoreInstanceField) | 1077 DECLARE_COMPUTATION(StoreInstanceField) |
| 1086 | 1078 |
| 1087 const Field& field() const { return field_; } | 1079 const Field& field() const { return field_; } |
| 1088 | 1080 |
| 1089 Value* instance() const { return inputs_[0]; } | 1081 Value* instance() const { return inputs_[0]; } |
| 1090 Value* value() const { return inputs_[1]; } | 1082 Value* value() const { return inputs_[1]; } |
| 1091 | 1083 |
| 1092 const InstanceCallComp* original() const { return original_; } | |
| 1093 | |
| 1094 virtual void PrintOperandsTo(BufferFormatter* f) const; | 1084 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 1095 | 1085 |
| 1096 virtual bool CanDeoptimize() const { return original_ != NULL; } | 1086 virtual bool CanDeoptimize() const { return false; } |
| 1097 virtual intptr_t ResultCid() const { return kDynamicCid; } | 1087 virtual intptr_t ResultCid() const { return kDynamicCid; } |
| 1098 | 1088 |
| 1099 private: | 1089 private: |
| 1100 const Field& field_; | 1090 const Field& field_; |
| 1101 const InstanceCallComp* original_; // For optimizations. | |
| 1102 | 1091 |
| 1103 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp); | 1092 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp); |
| 1104 }; | 1093 }; |
| 1105 | 1094 |
| 1106 | 1095 |
| 1107 class LoadStaticFieldComp : public TemplateComputation<0> { | 1096 class LoadStaticFieldComp : public TemplateComputation<0> { |
| 1108 public: | 1097 public: |
| 1109 explicit LoadStaticFieldComp(const Field& field) : field_(field) {} | 1098 explicit LoadStaticFieldComp(const Field& field) : field_(field) {} |
| 1110 | 1099 |
| 1111 DECLARE_COMPUTATION(LoadStaticField); | 1100 DECLARE_COMPUTATION(LoadStaticField); |
| (...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 | 2065 |
| 2077 virtual bool AttributesEqual(Computation* other) const; | 2066 virtual bool AttributesEqual(Computation* other) const; |
| 2078 | 2067 |
| 2079 virtual bool HasSideEffect() const { return false; } | 2068 virtual bool HasSideEffect() const { return false; } |
| 2080 | 2069 |
| 2081 Value* value() const { return inputs_[0]; } | 2070 Value* value() const { return inputs_[0]; } |
| 2082 | 2071 |
| 2083 intptr_t deopt_id() const { return original_->deopt_id(); } | 2072 intptr_t deopt_id() const { return original_->deopt_id(); } |
| 2084 intptr_t try_index() const { return original_->try_index(); } | 2073 intptr_t try_index() const { return original_->try_index(); } |
| 2085 | 2074 |
| 2075 virtual Definition* TryReplace(BindInstr* instr) const; |
| 2076 |
| 2086 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2077 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 2087 | 2078 |
| 2088 private: | 2079 private: |
| 2089 InstanceCallComp* original_; | 2080 InstanceCallComp* original_; |
| 2090 | 2081 |
| 2091 DISALLOW_COPY_AND_ASSIGN(CheckClassComp); | 2082 DISALLOW_COPY_AND_ASSIGN(CheckClassComp); |
| 2092 }; | 2083 }; |
| 2093 | 2084 |
| 2094 | 2085 |
| 2095 class CheckSmiComp : public TemplateComputation<1> { | 2086 class CheckSmiComp : public TemplateComputation<1> { |
| (...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3398 ForwardInstructionIterator* current_iterator_; | 3389 ForwardInstructionIterator* current_iterator_; |
| 3399 | 3390 |
| 3400 private: | 3391 private: |
| 3401 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 3392 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 3402 }; | 3393 }; |
| 3403 | 3394 |
| 3404 | 3395 |
| 3405 } // namespace dart | 3396 } // namespace dart |
| 3406 | 3397 |
| 3407 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 3398 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |