Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/hydrogen-instructions.h

Issue 17914002: First simplistic implementation of escape analysis. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments by Ben Titzer. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/hydrogen-escape-analysis.cc ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 bool HasRange() const { return range_ != NULL; } 1051 bool HasRange() const { return range_ != NULL; }
1052 bool CanBeNegative() const { return !HasRange() || range()->CanBeNegative(); } 1052 bool CanBeNegative() const { return !HasRange() || range()->CanBeNegative(); }
1053 bool CanBeZero() const { return !HasRange() || range()->CanBeZero(); } 1053 bool CanBeZero() const { return !HasRange() || range()->CanBeZero(); }
1054 bool RangeCanInclude(int value) const { 1054 bool RangeCanInclude(int value) const {
1055 return !HasRange() || range()->Includes(value); 1055 return !HasRange() || range()->Includes(value);
1056 } 1056 }
1057 void AddNewRange(Range* r, Zone* zone); 1057 void AddNewRange(Range* r, Zone* zone);
1058 void RemoveLastAddedRange(); 1058 void RemoveLastAddedRange();
1059 void ComputeInitialRange(Zone* zone); 1059 void ComputeInitialRange(Zone* zone);
1060 1060
1061 // Escape analysis helpers.
1062 virtual bool HasEscapingOperandAt(int index) { return true; }
1063
1061 // Representation helpers. 1064 // Representation helpers.
1062 virtual Representation observed_input_representation(int index) { 1065 virtual Representation observed_input_representation(int index) {
1063 return Representation::None(); 1066 return Representation::None();
1064 } 1067 }
1065 virtual Representation RequiredInputRepresentation(int index) = 0; 1068 virtual Representation RequiredInputRepresentation(int index) = 0;
1066 virtual void InferRepresentation(HInferRepresentation* h_infer); 1069 virtual void InferRepresentation(HInferRepresentation* h_infer);
1067 1070
1068 // This gives the instruction an opportunity to replace itself with an 1071 // This gives the instruction an opportunity to replace itself with an
1069 // instruction that does the same in some better way. To replace an 1072 // instruction that does the same in some better way. To replace an
1070 // instruction with a new one, first add the new instruction to the graph, 1073 // instruction with a new one, first add the new instruction to the graph,
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 explicit HDummyUse(HValue* value) { 1425 explicit HDummyUse(HValue* value) {
1423 SetOperandAt(0, value); 1426 SetOperandAt(0, value);
1424 // Pretend to be a Smi so that the HChange instructions inserted 1427 // Pretend to be a Smi so that the HChange instructions inserted
1425 // before any use generate as little code as possible. 1428 // before any use generate as little code as possible.
1426 set_representation(Representation::Tagged()); 1429 set_representation(Representation::Tagged());
1427 set_type(HType::Smi()); 1430 set_type(HType::Smi());
1428 } 1431 }
1429 1432
1430 HValue* value() { return OperandAt(0); } 1433 HValue* value() { return OperandAt(0); }
1431 1434
1435 virtual bool HasEscapingOperandAt(int index) { return false; }
1432 virtual Representation RequiredInputRepresentation(int index) { 1436 virtual Representation RequiredInputRepresentation(int index) {
1433 return Representation::None(); 1437 return Representation::None();
1434 } 1438 }
1435 1439
1436 virtual void PrintDataTo(StringStream* stream); 1440 virtual void PrintDataTo(StringStream* stream);
1437 1441
1438 DECLARE_CONCRETE_INSTRUCTION(DummyUse); 1442 DECLARE_CONCRETE_INSTRUCTION(DummyUse);
1439 }; 1443 };
1440 1444
1441 1445
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 } 1885 }
1882 int ToOperandIndex(int environment_index) { 1886 int ToOperandIndex(int environment_index) {
1883 for (int i = 0; i < assigned_indexes_.length(); ++i) { 1887 for (int i = 0; i < assigned_indexes_.length(); ++i) {
1884 if (assigned_indexes_[i] == environment_index) return i; 1888 if (assigned_indexes_[i] == environment_index) return i;
1885 } 1889 }
1886 return -1; 1890 return -1;
1887 } 1891 }
1888 virtual int OperandCount() { return values_.length(); } 1892 virtual int OperandCount() { return values_.length(); }
1889 virtual HValue* OperandAt(int index) const { return values_[index]; } 1893 virtual HValue* OperandAt(int index) const { return values_[index]; }
1890 1894
1895 virtual bool HasEscapingOperandAt(int index) { return false; }
1891 virtual Representation RequiredInputRepresentation(int index) { 1896 virtual Representation RequiredInputRepresentation(int index) {
1892 return Representation::None(); 1897 return Representation::None();
1893 } 1898 }
1894 1899
1895 void MergeWith(ZoneList<HSimulate*>* list); 1900 void MergeWith(ZoneList<HSimulate*>* list);
1896 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } 1901 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; }
1897 1902
1898 DECLARE_CONCRETE_INSTRUCTION(Simulate) 1903 DECLARE_CONCRETE_INSTRUCTION(Simulate)
1899 1904
1900 #ifdef DEBUG 1905 #ifdef DEBUG
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after
2790 Map* transitioned_map = 2795 Map* transitioned_map =
2791 map->LookupElementsTransitionMap(kind); 2796 map->LookupElementsTransitionMap(kind);
2792 if (transitioned_map) { 2797 if (transitioned_map) {
2793 check_map->map_set_.Add(Handle<Map>(transitioned_map), zone); 2798 check_map->map_set_.Add(Handle<Map>(transitioned_map), zone);
2794 } 2799 }
2795 }; 2800 };
2796 check_map->map_set_.Sort(); 2801 check_map->map_set_.Sort();
2797 return check_map; 2802 return check_map;
2798 } 2803 }
2799 2804
2805 virtual bool HasEscapingOperandAt(int index) { return false; }
2800 virtual Representation RequiredInputRepresentation(int index) { 2806 virtual Representation RequiredInputRepresentation(int index) {
2801 return Representation::Tagged(); 2807 return Representation::Tagged();
2802 } 2808 }
2803 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator); 2809 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator);
2804 virtual void PrintDataTo(StringStream* stream); 2810 virtual void PrintDataTo(StringStream* stream);
2805 virtual HType CalculateInferredType(); 2811 virtual HType CalculateInferredType();
2806 2812
2807 HValue* value() { return OperandAt(0); } 2813 HValue* value() { return OperandAt(0); }
2808 SmallMapList* map_set() { return &map_set_; } 2814 SmallMapList* map_set() { return &map_set_; }
2809 2815
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
3221 int arguments_count() const { return values_.length(); } 3227 int arguments_count() const { return values_.length(); }
3222 3228
3223 void AddArgument(HValue* argument, Zone* zone) { 3229 void AddArgument(HValue* argument, Zone* zone) {
3224 values_.Add(NULL, zone); // Resize list. 3230 values_.Add(NULL, zone); // Resize list.
3225 SetOperandAt(values_.length() - 1, argument); 3231 SetOperandAt(values_.length() - 1, argument);
3226 } 3232 }
3227 3233
3228 virtual int OperandCount() { return values_.length(); } 3234 virtual int OperandCount() { return values_.length(); }
3229 virtual HValue* OperandAt(int index) const { return values_[index]; } 3235 virtual HValue* OperandAt(int index) const { return values_[index]; }
3230 3236
3237 virtual bool HasEscapingOperandAt(int index) { return false; }
3231 virtual Representation RequiredInputRepresentation(int index) { 3238 virtual Representation RequiredInputRepresentation(int index) {
3232 return Representation::None(); 3239 return Representation::None();
3233 } 3240 }
3234 3241
3235 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 3242 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3236 3243
3237 protected: 3244 protected:
3238 virtual void InternalSetOperandAt(int index, HValue* value) { 3245 virtual void InternalSetOperandAt(int index, HValue* value) {
3239 values_[index] = value; 3246 values_[index] = value;
3240 } 3247 }
(...skipping 2183 matching lines...) Expand 10 before | Expand all | Expand 10 after
5424 HValue* object() { return OperandAt(0); } 5431 HValue* object() { return OperandAt(0); }
5425 HValue* typecheck() { 5432 HValue* typecheck() {
5426 ASSERT(HasTypeCheck()); 5433 ASSERT(HasTypeCheck());
5427 return OperandAt(1); 5434 return OperandAt(1);
5428 } 5435 }
5429 5436
5430 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } 5437 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); }
5431 HObjectAccess access() const { return access_; } 5438 HObjectAccess access() const { return access_; }
5432 Representation field_representation() const { return representation_; } 5439 Representation field_representation() const { return representation_; }
5433 5440
5441 virtual bool HasEscapingOperandAt(int index) { return false; }
5434 virtual Representation RequiredInputRepresentation(int index) { 5442 virtual Representation RequiredInputRepresentation(int index) {
5435 return Representation::Tagged(); 5443 return Representation::Tagged();
5436 } 5444 }
5437 virtual void PrintDataTo(StringStream* stream); 5445 virtual void PrintDataTo(StringStream* stream);
5438 5446
5439 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 5447 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
5440 5448
5441 protected: 5449 protected:
5442 virtual bool DataEquals(HValue* other) { 5450 virtual bool DataEquals(HValue* other) {
5443 HLoadNamedField* b = HLoadNamedField::cast(other); 5451 HLoadNamedField* b = HLoadNamedField::cast(other);
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
5756 transition_(), 5764 transition_(),
5757 transition_unique_id_(), 5765 transition_unique_id_(),
5758 new_space_dominator_(NULL) { 5766 new_space_dominator_(NULL) {
5759 SetOperandAt(0, obj); 5767 SetOperandAt(0, obj);
5760 SetOperandAt(1, val); 5768 SetOperandAt(1, val);
5761 access.SetGVNFlags(this, true); 5769 access.SetGVNFlags(this, true);
5762 } 5770 }
5763 5771
5764 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 5772 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
5765 5773
5774 virtual bool HasEscapingOperandAt(int index) { return index == 1; }
5766 virtual Representation RequiredInputRepresentation(int index) { 5775 virtual Representation RequiredInputRepresentation(int index) {
5767 if (FLAG_track_double_fields && 5776 if (FLAG_track_double_fields &&
5768 index == 1 && field_representation_.IsDouble()) { 5777 index == 1 && field_representation_.IsDouble()) {
5769 return field_representation_; 5778 return field_representation_;
5770 } else if (FLAG_track_fields && 5779 } else if (FLAG_track_fields &&
5771 index == 1 && field_representation_.IsSmi()) { 5780 index == 1 && field_representation_.IsSmi()) {
5772 return field_representation_; 5781 return field_representation_;
5773 } 5782 }
5774 return Representation::Tagged(); 5783 return Representation::Tagged();
5775 } 5784 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
5888 SetGVNFlag(kChangesArrayElements); 5897 SetGVNFlag(kChangesArrayElements);
5889 } 5898 }
5890 5899
5891 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 5900 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
5892 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && 5901 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
5893 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { 5902 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
5894 SetFlag(kTruncatingToInt32); 5903 SetFlag(kTruncatingToInt32);
5895 } 5904 }
5896 } 5905 }
5897 5906
5907 virtual bool HasEscapingOperandAt(int index) { return index != 0; }
5898 virtual Representation RequiredInputRepresentation(int index) { 5908 virtual Representation RequiredInputRepresentation(int index) {
5899 // kind_fast: tagged[int32] = tagged 5909 // kind_fast: tagged[int32] = tagged
5900 // kind_double: tagged[int32] = double 5910 // kind_double: tagged[int32] = double
5901 // kind_smi : tagged[int32] = smi 5911 // kind_smi : tagged[int32] = smi
5902 // kind_external: external[int32] = (double | int32) 5912 // kind_external: external[int32] = (double | int32)
5903 if (index == 0) { 5913 if (index == 0) {
5904 return is_external() ? Representation::External() 5914 return is_external() ? Representation::External()
5905 : Representation::Tagged(); 5915 : Representation::Tagged();
5906 } else if (index == 1) { 5916 } else if (index == 1) {
5907 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 5917 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
6641 virtual bool IsDeletable() const { return true; } 6651 virtual bool IsDeletable() const { return true; }
6642 }; 6652 };
6643 6653
6644 6654
6645 #undef DECLARE_INSTRUCTION 6655 #undef DECLARE_INSTRUCTION
6646 #undef DECLARE_CONCRETE_INSTRUCTION 6656 #undef DECLARE_CONCRETE_INSTRUCTION
6647 6657
6648 } } // namespace v8::internal 6658 } } // namespace v8::internal
6649 6659
6650 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 6660 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen-escape-analysis.cc ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698