| 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 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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 intptr_t use_index() const { return use_index_; } | 310 intptr_t use_index() const { return use_index_; } |
| 311 void set_use_index(intptr_t index) { use_index_ = index; } | 311 void set_use_index(intptr_t index) { use_index_ = index; } |
| 312 | 312 |
| 313 static void AddToList(Value* value, Value** list); | 313 static void AddToList(Value* value, Value** list); |
| 314 void RemoveFromUseList(); | 314 void RemoveFromUseList(); |
| 315 | 315 |
| 316 // Change the definition after use lists have been computed. | 316 // Change the definition after use lists have been computed. |
| 317 inline void BindTo(Definition* definition); | 317 inline void BindTo(Definition* definition); |
| 318 inline void BindToEnvironment(Definition* definition); | 318 inline void BindToEnvironment(Definition* definition); |
| 319 | 319 |
| 320 Value* Copy(Isolate* isolate) { return new(isolate) Value(definition_); } | 320 Value* Copy(Zone* zone) { return new(zone) Value(definition_); } |
| 321 | 321 |
| 322 // This function must only be used when the new Value is dominated by | 322 // This function must only be used when the new Value is dominated by |
| 323 // the original Value. | 323 // the original Value. |
| 324 Value* CopyWithType() { | 324 Value* CopyWithType() { |
| 325 Value* copy = new Value(definition_); | 325 Value* copy = new Value(definition_); |
| 326 copy->reaching_type_ = reaching_type_; | 326 copy->reaching_type_ = reaching_type_; |
| 327 return copy; | 327 return copy; |
| 328 } | 328 } |
| 329 | 329 |
| 330 CompileType* Type(); | 330 CompileType* Type(); |
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 bool Equals(Instruction* other) const; | 834 bool Equals(Instruction* other) const; |
| 835 | 835 |
| 836 // Compare attributes of a instructions (except input operands and tag). | 836 // Compare attributes of a instructions (except input operands and tag). |
| 837 // All instructions that participate in CSE have to override this function. | 837 // All instructions that participate in CSE have to override this function. |
| 838 // This function can assume that the argument has the same type as this. | 838 // This function can assume that the argument has the same type as this. |
| 839 virtual bool AttributesEqual(Instruction* other) const { | 839 virtual bool AttributesEqual(Instruction* other) const { |
| 840 UNREACHABLE(); | 840 UNREACHABLE(); |
| 841 return false; | 841 return false; |
| 842 } | 842 } |
| 843 | 843 |
| 844 virtual void InheritDeoptTarget(Isolate* isolate, Instruction* other); | 844 virtual void InheritDeoptTarget(Zone* zone, Instruction* other); |
| 845 | 845 |
| 846 bool NeedsEnvironment() const { | 846 bool NeedsEnvironment() const { |
| 847 return CanDeoptimize() || CanBecomeDeoptimizationTarget(); | 847 return CanDeoptimize() || CanBecomeDeoptimizationTarget(); |
| 848 } | 848 } |
| 849 | 849 |
| 850 virtual bool CanBecomeDeoptimizationTarget() const { | 850 virtual bool CanBecomeDeoptimizationTarget() const { |
| 851 return false; | 851 return false; |
| 852 } | 852 } |
| 853 | 853 |
| 854 void InheritDeoptTargetAfter(FlowGraph* flow_graph, | 854 void InheritDeoptTargetAfter(FlowGraph* flow_graph, |
| (...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 } | 2228 } |
| 2229 | 2229 |
| 2230 virtual bool CanDeoptimize() const { return false; } | 2230 virtual bool CanDeoptimize() const { return false; } |
| 2231 virtual bool CanBecomeDeoptimizationTarget() const { return false; } | 2231 virtual bool CanBecomeDeoptimizationTarget() const { return false; } |
| 2232 | 2232 |
| 2233 virtual EffectSet Effects() const { return EffectSet::None(); } | 2233 virtual EffectSet Effects() const { return EffectSet::None(); } |
| 2234 | 2234 |
| 2235 virtual void PrintTo(BufferFormatter* f) const; | 2235 virtual void PrintTo(BufferFormatter* f) const; |
| 2236 | 2236 |
| 2237 Value* offset() const { return inputs_[0]; } | 2237 Value* offset() const { return inputs_[0]; } |
| 2238 void ComputeOffsetTable(Isolate* isolate); | 2238 void ComputeOffsetTable(); |
| 2239 | 2239 |
| 2240 private: | 2240 private: |
| 2241 GrowableArray<TargetEntryInstr*> successors_; | 2241 GrowableArray<TargetEntryInstr*> successors_; |
| 2242 TypedData& offsets_; | 2242 TypedData& offsets_; |
| 2243 }; | 2243 }; |
| 2244 | 2244 |
| 2245 | 2245 |
| 2246 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { | 2246 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { |
| 2247 public: | 2247 public: |
| 2248 Value* left() const { return inputs_[0]; } | 2248 Value* left() const { return inputs_[0]; } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2378 } | 2378 } |
| 2379 | 2379 |
| 2380 void set_constant_target(TargetEntryInstr* target) { | 2380 void set_constant_target(TargetEntryInstr* target) { |
| 2381 ASSERT(target == true_successor() || target == false_successor()); | 2381 ASSERT(target == true_successor() || target == false_successor()); |
| 2382 constant_target_ = target; | 2382 constant_target_ = target; |
| 2383 } | 2383 } |
| 2384 TargetEntryInstr* constant_target() const { | 2384 TargetEntryInstr* constant_target() const { |
| 2385 return constant_target_; | 2385 return constant_target_; |
| 2386 } | 2386 } |
| 2387 | 2387 |
| 2388 virtual void InheritDeoptTarget(Isolate* isolate, Instruction* other); | 2388 virtual void InheritDeoptTarget(Zone* zone, Instruction* other); |
| 2389 | 2389 |
| 2390 virtual bool MayThrow() const { | 2390 virtual bool MayThrow() const { |
| 2391 return comparison()->MayThrow(); | 2391 return comparison()->MayThrow(); |
| 2392 } | 2392 } |
| 2393 | 2393 |
| 2394 TargetEntryInstr* true_successor() const { return true_successor_; } | 2394 TargetEntryInstr* true_successor() const { return true_successor_; } |
| 2395 TargetEntryInstr* false_successor() const { return false_successor_; } | 2395 TargetEntryInstr* false_successor() const { return false_successor_; } |
| 2396 | 2396 |
| 2397 TargetEntryInstr** true_successor_address() { return &true_successor_; } | 2397 TargetEntryInstr** true_successor_address() { return &true_successor_; } |
| 2398 TargetEntryInstr** false_successor_address() { return &false_successor_; } | 2398 TargetEntryInstr** false_successor_address() { return &false_successor_; } |
| (...skipping 5514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7913 void SkipDone() { | 7913 void SkipDone() { |
| 7914 while (!Done() && iterator_.Done()) { | 7914 while (!Done() && iterator_.Done()) { |
| 7915 iterator_ = ShallowIterator(iterator_.environment()->outer()); | 7915 iterator_ = ShallowIterator(iterator_.environment()->outer()); |
| 7916 } | 7916 } |
| 7917 } | 7917 } |
| 7918 | 7918 |
| 7919 ShallowIterator iterator_; | 7919 ShallowIterator iterator_; |
| 7920 }; | 7920 }; |
| 7921 | 7921 |
| 7922 // Construct an environment by constructing uses from an array of definitions. | 7922 // Construct an environment by constructing uses from an array of definitions. |
| 7923 static Environment* From(Isolate* isolate, | 7923 static Environment* From(Zone* zone, |
| 7924 const GrowableArray<Definition*>& definitions, | 7924 const GrowableArray<Definition*>& definitions, |
| 7925 intptr_t fixed_parameter_count, | 7925 intptr_t fixed_parameter_count, |
| 7926 const ParsedFunction& parsed_function); | 7926 const ParsedFunction& parsed_function); |
| 7927 | 7927 |
| 7928 void set_locations(Location* locations) { | 7928 void set_locations(Location* locations) { |
| 7929 ASSERT(locations_ == NULL); | 7929 ASSERT(locations_ == NULL); |
| 7930 locations_ = locations; | 7930 locations_ = locations; |
| 7931 } | 7931 } |
| 7932 | 7932 |
| 7933 void set_deopt_id(intptr_t deopt_id) { deopt_id_ = deopt_id; } | 7933 void set_deopt_id(intptr_t deopt_id) { deopt_id_ = deopt_id; } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7974 for (Environment::DeepIterator it(this); !it.Done(); it.Advance()) { | 7974 for (Environment::DeepIterator it(this); !it.Done(); it.Advance()) { |
| 7975 if (it.CurrentValue()->definition()->IsPushArgument()) { | 7975 if (it.CurrentValue()->definition()->IsPushArgument()) { |
| 7976 count++; | 7976 count++; |
| 7977 } | 7977 } |
| 7978 } | 7978 } |
| 7979 return count; | 7979 return count; |
| 7980 } | 7980 } |
| 7981 | 7981 |
| 7982 const Code& code() const { return parsed_function_.code(); } | 7982 const Code& code() const { return parsed_function_.code(); } |
| 7983 | 7983 |
| 7984 Environment* DeepCopy(Isolate* isolate) const { | 7984 Environment* DeepCopy(Zone* zone) const { |
| 7985 return DeepCopy(isolate, Length()); | 7985 return DeepCopy(zone, Length()); |
| 7986 } | 7986 } |
| 7987 | 7987 |
| 7988 void DeepCopyTo(Isolate* isolate, Instruction* instr) const; | 7988 void DeepCopyTo(Zone* zone, Instruction* instr) const; |
| 7989 void DeepCopyToOuter(Isolate* isolate, Instruction* instr) const; | 7989 void DeepCopyToOuter(Zone* zone, Instruction* instr) const; |
| 7990 | 7990 |
| 7991 void DeepCopyAfterTo(Isolate* isolate, | 7991 void DeepCopyAfterTo(Zone* zone, |
| 7992 Instruction* instr, | 7992 Instruction* instr, |
| 7993 intptr_t argc, | 7993 intptr_t argc, |
| 7994 Definition* dead, | 7994 Definition* dead, |
| 7995 Definition* result) const; | 7995 Definition* result) const; |
| 7996 | 7996 |
| 7997 void PrintTo(BufferFormatter* f) const; | 7997 void PrintTo(BufferFormatter* f) const; |
| 7998 const char* ToCString() const; | 7998 const char* ToCString() const; |
| 7999 | 7999 |
| 8000 // Deep copy an environment. The 'length' parameter may be less than the | 8000 // Deep copy an environment. The 'length' parameter may be less than the |
| 8001 // environment's length in order to drop values (e.g., passed arguments) | 8001 // environment's length in order to drop values (e.g., passed arguments) |
| 8002 // from the copy. | 8002 // from the copy. |
| 8003 Environment* DeepCopy(Isolate* isolate, intptr_t length) const; | 8003 Environment* DeepCopy(Zone* zone, intptr_t length) const; |
| 8004 | 8004 |
| 8005 private: | 8005 private: |
| 8006 friend class ShallowIterator; | 8006 friend class ShallowIterator; |
| 8007 | 8007 |
| 8008 Environment(intptr_t length, | 8008 Environment(intptr_t length, |
| 8009 intptr_t fixed_parameter_count, | 8009 intptr_t fixed_parameter_count, |
| 8010 intptr_t deopt_id, | 8010 intptr_t deopt_id, |
| 8011 const ParsedFunction& parsed_function, | 8011 const ParsedFunction& parsed_function, |
| 8012 Environment* outer) | 8012 Environment* outer) |
| 8013 : values_(length), | 8013 : values_(length), |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8068 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ | 8068 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ |
| 8069 UNIMPLEMENTED(); \ | 8069 UNIMPLEMENTED(); \ |
| 8070 return NULL; \ | 8070 return NULL; \ |
| 8071 } \ | 8071 } \ |
| 8072 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } | 8072 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } |
| 8073 | 8073 |
| 8074 | 8074 |
| 8075 } // namespace dart | 8075 } // namespace dart |
| 8076 | 8076 |
| 8077 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 8077 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |