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

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

Issue 148503002: A64: Synchronize with r15545. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 11 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-infer-types.cc ('k') | src/hydrogen-instructions.cc » ('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 27 matching lines...) Expand all
38 #include "v8conversions.h" 38 #include "v8conversions.h"
39 #include "v8utils.h" 39 #include "v8utils.h"
40 #include "zone.h" 40 #include "zone.h"
41 41
42 namespace v8 { 42 namespace v8 {
43 namespace internal { 43 namespace internal {
44 44
45 // Forward declarations. 45 // Forward declarations.
46 class HBasicBlock; 46 class HBasicBlock;
47 class HEnvironment; 47 class HEnvironment;
48 class HInferRepresentation; 48 class HInferRepresentationPhase;
49 class HInstruction; 49 class HInstruction;
50 class HLoopInformation; 50 class HLoopInformation;
51 class HValue; 51 class HValue;
52 class LInstruction; 52 class LInstruction;
53 class LChunkBuilder; 53 class LChunkBuilder;
54 54
55 55
56 #define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ 56 #define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \
57 V(ArithmeticBinaryOperation) \ 57 V(ArithmeticBinaryOperation) \
58 V(BinaryOperation) \ 58 V(BinaryOperation) \
(...skipping 26 matching lines...) Expand all
85 V(CallNamed) \ 85 V(CallNamed) \
86 V(CallNew) \ 86 V(CallNew) \
87 V(CallNewArray) \ 87 V(CallNewArray) \
88 V(CallRuntime) \ 88 V(CallRuntime) \
89 V(CallStub) \ 89 V(CallStub) \
90 V(Change) \ 90 V(Change) \
91 V(CheckFunction) \ 91 V(CheckFunction) \
92 V(CheckHeapObject) \ 92 V(CheckHeapObject) \
93 V(CheckInstanceType) \ 93 V(CheckInstanceType) \
94 V(CheckMaps) \ 94 V(CheckMaps) \
95 V(CheckSmi) \
95 V(CheckPrototypeMaps) \ 96 V(CheckPrototypeMaps) \
96 V(ClampToUint8) \ 97 V(ClampToUint8) \
97 V(ClassOfTestAndBranch) \ 98 V(ClassOfTestAndBranch) \
98 V(CompareIDAndBranch) \ 99 V(CompareNumericAndBranch) \
99 V(CompareGeneric) \ 100 V(CompareGeneric) \
100 V(CompareObjectEqAndBranch) \ 101 V(CompareObjectEqAndBranch) \
101 V(CompareMap) \ 102 V(CompareMap) \
102 V(CompareConstantEqAndBranch) \ 103 V(CompareConstantEqAndBranch) \
103 V(Constant) \ 104 V(Constant) \
104 V(Context) \ 105 V(Context) \
105 V(DebugBreak) \ 106 V(DebugBreak) \
106 V(DeclareGlobals) \ 107 V(DeclareGlobals) \
107 V(DeleteProperty) \ 108 V(DeleteProperty) \
108 V(Deoptimize) \ 109 V(Deoptimize) \
109 V(Div) \ 110 V(Div) \
110 V(DummyUse) \ 111 V(DummyUse) \
111 V(ElementsKind) \ 112 V(ElementsKind) \
112 V(EnterInlined) \ 113 V(EnterInlined) \
113 V(EnvironmentMarker) \ 114 V(EnvironmentMarker) \
114 V(FixedArrayBaseLength) \
115 V(ForceRepresentation) \ 115 V(ForceRepresentation) \
116 V(FunctionLiteral) \ 116 V(FunctionLiteral) \
117 V(GetCachedArrayIndex) \ 117 V(GetCachedArrayIndex) \
118 V(GlobalObject) \ 118 V(GlobalObject) \
119 V(GlobalReceiver) \ 119 V(GlobalReceiver) \
120 V(Goto) \ 120 V(Goto) \
121 V(HasCachedArrayIndexAndBranch) \ 121 V(HasCachedArrayIndexAndBranch) \
122 V(HasInstanceTypeAndBranch) \ 122 V(HasInstanceTypeAndBranch) \
123 V(InductionVariableAnnotation) \ 123 V(InductionVariableAnnotation) \
124 V(In) \ 124 V(In) \
125 V(InnerAllocatedObject) \ 125 V(InnerAllocatedObject) \
126 V(InstanceOf) \ 126 V(InstanceOf) \
127 V(InstanceOfKnownGlobal) \ 127 V(InstanceOfKnownGlobal) \
128 V(InstanceSize) \ 128 V(InstanceSize) \
129 V(InvokeFunction) \ 129 V(InvokeFunction) \
130 V(IsConstructCallAndBranch) \ 130 V(IsConstructCallAndBranch) \
131 V(IsObjectAndBranch) \ 131 V(IsObjectAndBranch) \
132 V(IsNumberAndBranch) \
132 V(IsStringAndBranch) \ 133 V(IsStringAndBranch) \
133 V(IsSmiAndBranch) \ 134 V(IsSmiAndBranch) \
134 V(IsUndetectableAndBranch) \ 135 V(IsUndetectableAndBranch) \
135 V(LeaveInlined) \ 136 V(LeaveInlined) \
136 V(LoadContextSlot) \ 137 V(LoadContextSlot) \
137 V(LoadExternalArrayPointer) \ 138 V(LoadExternalArrayPointer) \
138 V(LoadFunctionPrototype) \ 139 V(LoadFunctionPrototype) \
139 V(LoadGlobalCell) \ 140 V(LoadGlobalCell) \
140 V(LoadGlobalGeneric) \ 141 V(LoadGlobalGeneric) \
141 V(LoadKeyed) \ 142 V(LoadKeyed) \
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 bool HasRange() const { return range_ != NULL; } 1056 bool HasRange() const { return range_ != NULL; }
1056 bool CanBeNegative() const { return !HasRange() || range()->CanBeNegative(); } 1057 bool CanBeNegative() const { return !HasRange() || range()->CanBeNegative(); }
1057 bool CanBeZero() const { return !HasRange() || range()->CanBeZero(); } 1058 bool CanBeZero() const { return !HasRange() || range()->CanBeZero(); }
1058 bool RangeCanInclude(int value) const { 1059 bool RangeCanInclude(int value) const {
1059 return !HasRange() || range()->Includes(value); 1060 return !HasRange() || range()->Includes(value);
1060 } 1061 }
1061 void AddNewRange(Range* r, Zone* zone); 1062 void AddNewRange(Range* r, Zone* zone);
1062 void RemoveLastAddedRange(); 1063 void RemoveLastAddedRange();
1063 void ComputeInitialRange(Zone* zone); 1064 void ComputeInitialRange(Zone* zone);
1064 1065
1066 // Escape analysis helpers.
1067 virtual bool HasEscapingOperandAt(int index) { return true; }
1068
1065 // Representation helpers. 1069 // Representation helpers.
1066 virtual Representation observed_input_representation(int index) { 1070 virtual Representation observed_input_representation(int index) {
1067 return Representation::None(); 1071 return Representation::None();
1068 } 1072 }
1069 virtual Representation RequiredInputRepresentation(int index) = 0; 1073 virtual Representation RequiredInputRepresentation(int index) = 0;
1070 virtual void InferRepresentation(HInferRepresentation* h_infer); 1074 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
1071 1075
1072 // This gives the instruction an opportunity to replace itself with an 1076 // This gives the instruction an opportunity to replace itself with an
1073 // instruction that does the same in some better way. To replace an 1077 // instruction that does the same in some better way. To replace an
1074 // instruction with a new one, first add the new instruction to the graph, 1078 // instruction with a new one, first add the new instruction to the graph,
1075 // then return it. Return NULL to have the instruction deleted. 1079 // then return it. Return NULL to have the instruction deleted.
1076 virtual HValue* Canonicalize() { return this; } 1080 virtual HValue* Canonicalize() { return this; }
1077 1081
1078 bool Equals(HValue* other); 1082 bool Equals(HValue* other);
1079 virtual intptr_t Hashcode(); 1083 virtual intptr_t Hashcode();
1080 1084
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 UNREACHABLE(); 1156 UNREACHABLE();
1153 return false; 1157 return false;
1154 } 1158 }
1155 1159
1156 virtual Representation RepresentationFromInputs() { 1160 virtual Representation RepresentationFromInputs() {
1157 return representation(); 1161 return representation();
1158 } 1162 }
1159 Representation RepresentationFromUses(); 1163 Representation RepresentationFromUses();
1160 Representation RepresentationFromUseRequirements(); 1164 Representation RepresentationFromUseRequirements();
1161 virtual void UpdateRepresentation(Representation new_rep, 1165 virtual void UpdateRepresentation(Representation new_rep,
1162 HInferRepresentation* h_infer, 1166 HInferRepresentationPhase* h_infer,
1163 const char* reason); 1167 const char* reason);
1164 void AddDependantsToWorklist(HInferRepresentation* h_infer); 1168 void AddDependantsToWorklist(HInferRepresentationPhase* h_infer);
1165 1169
1166 virtual void RepresentationChanged(Representation to) { } 1170 virtual void RepresentationChanged(Representation to) { }
1167 1171
1168 virtual Range* InferRange(Zone* zone); 1172 virtual Range* InferRange(Zone* zone);
1169 virtual void DeleteFromGraph() = 0; 1173 virtual void DeleteFromGraph() = 0;
1170 virtual void InternalSetOperandAt(int index, HValue* value) = 0; 1174 virtual void InternalSetOperandAt(int index, HValue* value) = 0;
1171 void clear_block() { 1175 void clear_block() {
1172 ASSERT(block_ != NULL); 1176 ASSERT(block_ != NULL);
1173 block_ = NULL; 1177 block_ = NULL;
1174 } 1178 }
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1426 explicit HDummyUse(HValue* value) { 1430 explicit HDummyUse(HValue* value) {
1427 SetOperandAt(0, value); 1431 SetOperandAt(0, value);
1428 // Pretend to be a Smi so that the HChange instructions inserted 1432 // Pretend to be a Smi so that the HChange instructions inserted
1429 // before any use generate as little code as possible. 1433 // before any use generate as little code as possible.
1430 set_representation(Representation::Tagged()); 1434 set_representation(Representation::Tagged());
1431 set_type(HType::Smi()); 1435 set_type(HType::Smi());
1432 } 1436 }
1433 1437
1434 HValue* value() { return OperandAt(0); } 1438 HValue* value() { return OperandAt(0); }
1435 1439
1440 virtual bool HasEscapingOperandAt(int index) { return false; }
1436 virtual Representation RequiredInputRepresentation(int index) { 1441 virtual Representation RequiredInputRepresentation(int index) {
1437 return Representation::None(); 1442 return Representation::None();
1438 } 1443 }
1439 1444
1440 virtual void PrintDataTo(StringStream* stream); 1445 virtual void PrintDataTo(StringStream* stream);
1441 1446
1442 DECLARE_CONCRETE_INSTRUCTION(DummyUse); 1447 DECLARE_CONCRETE_INSTRUCTION(DummyUse);
1443 }; 1448 };
1444 1449
1445 1450
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1594 1599
1595 virtual void PrintDataTo(StringStream* stream); 1600 virtual void PrintDataTo(StringStream* stream);
1596 1601
1597 HValue* value() { return OperandAt(0); } 1602 HValue* value() { return OperandAt(0); }
1598 }; 1603 };
1599 1604
1600 1605
1601 class HBranch: public HUnaryControlInstruction { 1606 class HBranch: public HUnaryControlInstruction {
1602 public: 1607 public:
1603 HBranch(HValue* value, 1608 HBranch(HValue* value,
1604 HBasicBlock* true_target, 1609 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(),
1605 HBasicBlock* false_target, 1610 HBasicBlock* true_target = NULL,
1606 ToBooleanStub::Types expected_input_types = ToBooleanStub::Types()) 1611 HBasicBlock* false_target = NULL)
1607 : HUnaryControlInstruction(value, true_target, false_target), 1612 : HUnaryControlInstruction(value, true_target, false_target),
1608 expected_input_types_(expected_input_types) { 1613 expected_input_types_(expected_input_types) {
1609 ASSERT(true_target != NULL && false_target != NULL);
1610 SetFlag(kAllowUndefinedAsNaN);
1611 }
1612 explicit HBranch(HValue* value)
1613 : HUnaryControlInstruction(value, NULL, NULL) {
1614 SetFlag(kAllowUndefinedAsNaN);
1615 }
1616 HBranch(HValue* value, ToBooleanStub::Types expected_input_types)
1617 : HUnaryControlInstruction(value, NULL, NULL),
1618 expected_input_types_(expected_input_types) {
1619 SetFlag(kAllowUndefinedAsNaN); 1614 SetFlag(kAllowUndefinedAsNaN);
1620 } 1615 }
1621 1616
1622 virtual Representation RequiredInputRepresentation(int index) { 1617 virtual Representation RequiredInputRepresentation(int index) {
1623 return Representation::None(); 1618 return Representation::None();
1624 } 1619 }
1625 virtual Representation observed_input_representation(int index); 1620 virtual Representation observed_input_representation(int index);
1626 1621
1627 ToBooleanStub::Types expected_input_types() const { 1622 ToBooleanStub::Types expected_input_types() const {
1628 return expected_input_types_; 1623 return expected_input_types_;
1629 } 1624 }
1630 1625
1631 DECLARE_CONCRETE_INSTRUCTION(Branch) 1626 DECLARE_CONCRETE_INSTRUCTION(Branch)
1632 1627
1633 private: 1628 private:
1634 ToBooleanStub::Types expected_input_types_; 1629 ToBooleanStub::Types expected_input_types_;
1635 }; 1630 };
1636 1631
1637 1632
1638 class HCompareMap: public HUnaryControlInstruction { 1633 class HCompareMap: public HUnaryControlInstruction {
1639 public: 1634 public:
1640 HCompareMap(HValue* value, 1635 HCompareMap(HValue* value,
1641 Handle<Map> map, 1636 Handle<Map> map,
1642 HBasicBlock* true_target, 1637 HBasicBlock* true_target = NULL,
1643 HBasicBlock* false_target) 1638 HBasicBlock* false_target = NULL)
1644 : HUnaryControlInstruction(value, true_target, false_target), 1639 : HUnaryControlInstruction(value, true_target, false_target),
1645 map_(map) { 1640 map_(map) {
1646 ASSERT(true_target != NULL);
1647 ASSERT(false_target != NULL);
1648 ASSERT(!map.is_null()); 1641 ASSERT(!map.is_null());
1649 } 1642 }
1650 1643
1651 virtual void PrintDataTo(StringStream* stream); 1644 virtual void PrintDataTo(StringStream* stream);
1652 1645
1653 Handle<Map> map() const { return map_; } 1646 Handle<Map> map() const { return map_; }
1654 1647
1655 virtual Representation RequiredInputRepresentation(int index) { 1648 virtual Representation RequiredInputRepresentation(int index) {
1656 return Representation::Tagged(); 1649 return Representation::Tagged();
1657 } 1650 }
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 } 1878 }
1886 int ToOperandIndex(int environment_index) { 1879 int ToOperandIndex(int environment_index) {
1887 for (int i = 0; i < assigned_indexes_.length(); ++i) { 1880 for (int i = 0; i < assigned_indexes_.length(); ++i) {
1888 if (assigned_indexes_[i] == environment_index) return i; 1881 if (assigned_indexes_[i] == environment_index) return i;
1889 } 1882 }
1890 return -1; 1883 return -1;
1891 } 1884 }
1892 virtual int OperandCount() { return values_.length(); } 1885 virtual int OperandCount() { return values_.length(); }
1893 virtual HValue* OperandAt(int index) const { return values_[index]; } 1886 virtual HValue* OperandAt(int index) const { return values_[index]; }
1894 1887
1888 virtual bool HasEscapingOperandAt(int index) { return false; }
1895 virtual Representation RequiredInputRepresentation(int index) { 1889 virtual Representation RequiredInputRepresentation(int index) {
1896 return Representation::None(); 1890 return Representation::None();
1897 } 1891 }
1898 1892
1899 void MergeWith(ZoneList<HSimulate*>* list); 1893 void MergeWith(ZoneList<HSimulate*>* list);
1900 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } 1894 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; }
1901 1895
1902 DECLARE_CONCRETE_INSTRUCTION(Simulate) 1896 DECLARE_CONCRETE_INSTRUCTION(Simulate)
1903 1897
1904 #ifdef DEBUG 1898 #ifdef DEBUG
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 HValue* context() { return first(); } 2475 HValue* context() { return first(); }
2482 HValue* constructor() { return second(); } 2476 HValue* constructor() { return second(); }
2483 2477
2484 DECLARE_CONCRETE_INSTRUCTION(CallNew) 2478 DECLARE_CONCRETE_INSTRUCTION(CallNew)
2485 }; 2479 };
2486 2480
2487 2481
2488 class HCallNewArray: public HCallNew { 2482 class HCallNewArray: public HCallNew {
2489 public: 2483 public:
2490 HCallNewArray(HValue* context, HValue* constructor, int argument_count, 2484 HCallNewArray(HValue* context, HValue* constructor, int argument_count,
2491 Handle<Cell> type_cell) 2485 Handle<Cell> type_cell, ElementsKind elements_kind)
2492 : HCallNew(context, constructor, argument_count), 2486 : HCallNew(context, constructor, argument_count),
2493 type_cell_(type_cell) { 2487 elements_kind_(elements_kind),
2494 elements_kind_ = static_cast<ElementsKind>( 2488 type_cell_(type_cell) {}
2495 Smi::cast(type_cell->value())->value()); 2489
2496 } 2490 virtual void PrintDataTo(StringStream* stream);
2497 2491
2498 Handle<Cell> property_cell() const { 2492 Handle<Cell> property_cell() const {
2499 return type_cell_; 2493 return type_cell_;
2500 } 2494 }
2501 2495
2502 ElementsKind elements_kind() const { return elements_kind_; } 2496 ElementsKind elements_kind() const { return elements_kind_; }
2503 2497
2504 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) 2498 DECLARE_CONCRETE_INSTRUCTION(CallNewArray)
2505 2499
2506 private: 2500 private:
(...skipping 23 matching lines...) Expand all
2530 } 2524 }
2531 2525
2532 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 2526 DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
2533 2527
2534 private: 2528 private:
2535 const Runtime::Function* c_function_; 2529 const Runtime::Function* c_function_;
2536 Handle<String> name_; 2530 Handle<String> name_;
2537 }; 2531 };
2538 2532
2539 2533
2540 class HFixedArrayBaseLength: public HUnaryOperation {
2541 public:
2542 explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) {
2543 set_type(HType::Smi());
2544 set_representation(Representation::Smi());
2545 SetFlag(kUseGVN);
2546 SetGVNFlag(kDependsOnArrayLengths);
2547 }
2548
2549 virtual Representation RequiredInputRepresentation(int index) {
2550 return Representation::Tagged();
2551 }
2552
2553 DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength)
2554
2555 protected:
2556 virtual bool DataEquals(HValue* other) { return true; }
2557
2558 private:
2559 virtual bool IsDeletable() const { return true; }
2560 };
2561
2562
2563 class HMapEnumLength: public HUnaryOperation { 2534 class HMapEnumLength: public HUnaryOperation {
2564 public: 2535 public:
2565 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { 2536 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) {
2566 set_type(HType::Smi()); 2537 set_type(HType::Smi());
2567 set_representation(Representation::Smi()); 2538 set_representation(Representation::Smi());
2568 SetFlag(kUseGVN); 2539 SetFlag(kUseGVN);
2569 SetGVNFlag(kDependsOnMaps); 2540 SetGVNFlag(kDependsOnMaps);
2570 } 2541 }
2571 2542
2572 virtual Representation RequiredInputRepresentation(int index) { 2543 virtual Representation RequiredInputRepresentation(int index) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
2794 Map* transitioned_map = 2765 Map* transitioned_map =
2795 map->LookupElementsTransitionMap(kind); 2766 map->LookupElementsTransitionMap(kind);
2796 if (transitioned_map) { 2767 if (transitioned_map) {
2797 check_map->map_set_.Add(Handle<Map>(transitioned_map), zone); 2768 check_map->map_set_.Add(Handle<Map>(transitioned_map), zone);
2798 } 2769 }
2799 }; 2770 };
2800 check_map->map_set_.Sort(); 2771 check_map->map_set_.Sort();
2801 return check_map; 2772 return check_map;
2802 } 2773 }
2803 2774
2775 virtual bool HasEscapingOperandAt(int index) { return false; }
2804 virtual Representation RequiredInputRepresentation(int index) { 2776 virtual Representation RequiredInputRepresentation(int index) {
2805 return Representation::Tagged(); 2777 return Representation::Tagged();
2806 } 2778 }
2807 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator); 2779 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator);
2808 virtual void PrintDataTo(StringStream* stream); 2780 virtual void PrintDataTo(StringStream* stream);
2809 virtual HType CalculateInferredType(); 2781 virtual HType CalculateInferredType();
2810 2782
2811 HValue* value() { return OperandAt(0); } 2783 HValue* value() { return OperandAt(0); }
2812 SmallMapList* map_set() { return &map_set_; } 2784 SmallMapList* map_set() { return &map_set_; }
2813 2785
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2859 SetFlag(kUseGVN); 2831 SetFlag(kUseGVN);
2860 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); 2832 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function);
2861 } 2833 }
2862 2834
2863 virtual Representation RequiredInputRepresentation(int index) { 2835 virtual Representation RequiredInputRepresentation(int index) {
2864 return Representation::Tagged(); 2836 return Representation::Tagged();
2865 } 2837 }
2866 virtual void PrintDataTo(StringStream* stream); 2838 virtual void PrintDataTo(StringStream* stream);
2867 virtual HType CalculateInferredType(); 2839 virtual HType CalculateInferredType();
2868 2840
2841 virtual HValue* Canonicalize();
2842
2869 #ifdef DEBUG 2843 #ifdef DEBUG
2870 virtual void Verify(); 2844 virtual void Verify();
2871 #endif 2845 #endif
2872 2846
2873 virtual void FinalizeUniqueValueId() { 2847 virtual void FinalizeUniqueValueId() {
2874 target_unique_id_ = UniqueValueId(target_); 2848 target_unique_id_ = UniqueValueId(target_);
2875 } 2849 }
2876 2850
2877 Handle<JSFunction> target() const { return target_; } 2851 Handle<JSFunction> target() const { return target_; }
2878 bool target_in_new_space() const { return target_in_new_space_; } 2852 bool target_in_new_space() const { return target_in_new_space_; }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 HCheckInstanceType(HValue* value, Check check) 2919 HCheckInstanceType(HValue* value, Check check)
2946 : HUnaryOperation(value), check_(check) { 2920 : HUnaryOperation(value), check_(check) {
2947 set_representation(Representation::Tagged()); 2921 set_representation(Representation::Tagged());
2948 SetFlag(kUseGVN); 2922 SetFlag(kUseGVN);
2949 } 2923 }
2950 2924
2951 const Check check_; 2925 const Check check_;
2952 }; 2926 };
2953 2927
2954 2928
2929 class HCheckSmi: public HUnaryOperation {
2930 public:
2931 explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
2932 set_representation(Representation::Smi());
2933 SetFlag(kUseGVN);
2934 }
2935
2936 virtual Representation RequiredInputRepresentation(int index) {
2937 return Representation::Tagged();
2938 }
2939
2940 virtual HType CalculateInferredType();
2941
2942 virtual HValue* Canonicalize() {
2943 HType value_type = value()->type();
2944 if (value_type.IsSmi()) {
2945 return NULL;
2946 }
2947 return this;
2948 }
2949
2950 DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
2951
2952 protected:
2953 virtual bool DataEquals(HValue* other) { return true; }
2954 };
2955
2956
2957 class HIsNumberAndBranch: public HUnaryControlInstruction {
2958 public:
2959 explicit HIsNumberAndBranch(HValue* value)
2960 : HUnaryControlInstruction(value, NULL, NULL) {
2961 SetFlag(kFlexibleRepresentation);
2962 }
2963
2964 virtual Representation RequiredInputRepresentation(int index) {
2965 return Representation::None();
2966 }
2967
2968 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch)
2969 };
2970
2971
2955 class HCheckHeapObject: public HUnaryOperation { 2972 class HCheckHeapObject: public HUnaryOperation {
2956 public: 2973 public:
2957 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { 2974 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) {
2958 set_representation(Representation::Tagged()); 2975 set_representation(Representation::Tagged());
2959 SetFlag(kUseGVN); 2976 SetFlag(kUseGVN);
2960 } 2977 }
2961 2978
2962 virtual Representation RequiredInputRepresentation(int index) { 2979 virtual Representation RequiredInputRepresentation(int index) {
2963 return Representation::Tagged(); 2980 return Representation::Tagged();
2964 } 2981 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
3068 indirect_uses_[i] = 0; 3085 indirect_uses_[i] = 0;
3069 } 3086 }
3070 ASSERT(merged_index >= 0); 3087 ASSERT(merged_index >= 0);
3071 SetFlag(kFlexibleRepresentation); 3088 SetFlag(kFlexibleRepresentation);
3072 SetFlag(kAllowUndefinedAsNaN); 3089 SetFlag(kAllowUndefinedAsNaN);
3073 } 3090 }
3074 3091
3075 virtual Representation RepresentationFromInputs(); 3092 virtual Representation RepresentationFromInputs();
3076 3093
3077 virtual Range* InferRange(Zone* zone); 3094 virtual Range* InferRange(Zone* zone);
3078 virtual void InferRepresentation(HInferRepresentation* h_infer); 3095 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3079 virtual Representation RequiredInputRepresentation(int index) { 3096 virtual Representation RequiredInputRepresentation(int index) {
3080 return representation(); 3097 return representation();
3081 } 3098 }
3082 virtual Representation KnownOptimalRepresentation() { 3099 virtual Representation KnownOptimalRepresentation() {
3083 return representation(); 3100 return representation();
3084 } 3101 }
3085 virtual HType CalculateInferredType(); 3102 virtual HType CalculateInferredType();
3086 virtual int OperandCount() { return inputs_.length(); } 3103 virtual int OperandCount() { return inputs_.length(); }
3087 virtual HValue* OperandAt(int index) const { return inputs_[index]; } 3104 virtual HValue* OperandAt(int index) const { return inputs_[index]; }
3088 HValue* GetRedundantReplacement(); 3105 HValue* GetRedundantReplacement();
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3221 int arguments_count() const { return values_.length(); } 3238 int arguments_count() const { return values_.length(); }
3222 3239
3223 void AddArgument(HValue* argument, Zone* zone) { 3240 void AddArgument(HValue* argument, Zone* zone) {
3224 values_.Add(NULL, zone); // Resize list. 3241 values_.Add(NULL, zone); // Resize list.
3225 SetOperandAt(values_.length() - 1, argument); 3242 SetOperandAt(values_.length() - 1, argument);
3226 } 3243 }
3227 3244
3228 virtual int OperandCount() { return values_.length(); } 3245 virtual int OperandCount() { return values_.length(); }
3229 virtual HValue* OperandAt(int index) const { return values_[index]; } 3246 virtual HValue* OperandAt(int index) const { return values_[index]; }
3230 3247
3248 virtual bool HasEscapingOperandAt(int index) { return false; }
3231 virtual Representation RequiredInputRepresentation(int index) { 3249 virtual Representation RequiredInputRepresentation(int index) {
3232 return Representation::None(); 3250 return Representation::None();
3233 } 3251 }
3234 3252
3235 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 3253 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3236 3254
3237 protected: 3255 protected:
3238 virtual void InternalSetOperandAt(int index, HValue* value) { 3256 virtual void InternalSetOperandAt(int index, HValue* value) {
3239 values_[index] = value; 3257 values_[index] = value;
3240 } 3258 }
(...skipping 15 matching lines...) Expand all
3256 HConstant(double value, 3274 HConstant(double value,
3257 Representation r = Representation::None(), 3275 Representation r = Representation::None(),
3258 bool is_not_in_new_space = true, 3276 bool is_not_in_new_space = true,
3259 Handle<Object> optional_handle = Handle<Object>::null()); 3277 Handle<Object> optional_handle = Handle<Object>::null());
3260 HConstant(Handle<Object> handle, 3278 HConstant(Handle<Object> handle,
3261 UniqueValueId unique_id, 3279 UniqueValueId unique_id,
3262 Representation r, 3280 Representation r,
3263 HType type, 3281 HType type,
3264 bool is_internalized_string, 3282 bool is_internalized_string,
3265 bool is_not_in_new_space, 3283 bool is_not_in_new_space,
3284 bool is_cell,
3266 bool boolean_value); 3285 bool boolean_value);
3267 3286
3268 Handle<Object> handle() { 3287 Handle<Object> handle() {
3269 if (handle_.is_null()) { 3288 if (handle_.is_null()) {
3270 Factory* factory = Isolate::Current()->factory(); 3289 Factory* factory = Isolate::Current()->factory();
3271 // Default arguments to is_not_in_new_space depend on this heap number 3290 // Default arguments to is_not_in_new_space depend on this heap number
3272 // to be tenured so that it's guaranteed not be be located in new space. 3291 // to be tenured so that it's guaranteed not be be located in new space.
3273 handle_ = factory->NewNumber(double_value_, TENURED); 3292 handle_ = factory->NewNumber(double_value_, TENURED);
3274 } 3293 }
3275 AllowDeferredHandleDereference smi_check; 3294 AllowDeferredHandleDereference smi_check;
(...skipping 28 matching lines...) Expand all
3304 ASSERT(unique_id_ != UniqueValueId(heap->minus_zero_value())); 3323 ASSERT(unique_id_ != UniqueValueId(heap->minus_zero_value()));
3305 ASSERT(unique_id_ != UniqueValueId(heap->nan_value())); 3324 ASSERT(unique_id_ != UniqueValueId(heap->nan_value()));
3306 return unique_id_ == UniqueValueId(heap->undefined_value()) || 3325 return unique_id_ == UniqueValueId(heap->undefined_value()) ||
3307 unique_id_ == UniqueValueId(heap->null_value()) || 3326 unique_id_ == UniqueValueId(heap->null_value()) ||
3308 unique_id_ == UniqueValueId(heap->true_value()) || 3327 unique_id_ == UniqueValueId(heap->true_value()) ||
3309 unique_id_ == UniqueValueId(heap->false_value()) || 3328 unique_id_ == UniqueValueId(heap->false_value()) ||
3310 unique_id_ == UniqueValueId(heap->the_hole_value()) || 3329 unique_id_ == UniqueValueId(heap->the_hole_value()) ||
3311 unique_id_ == UniqueValueId(heap->empty_string()); 3330 unique_id_ == UniqueValueId(heap->empty_string());
3312 } 3331 }
3313 3332
3333 bool IsCell() const {
3334 return is_cell_;
3335 }
3336
3314 virtual Representation RequiredInputRepresentation(int index) { 3337 virtual Representation RequiredInputRepresentation(int index) {
3315 return Representation::None(); 3338 return Representation::None();
3316 } 3339 }
3317 3340
3318 virtual Representation KnownOptimalRepresentation() { 3341 virtual Representation KnownOptimalRepresentation() {
3319 if (HasSmiValue()) return Representation::Smi(); 3342 if (HasSmiValue()) return Representation::Smi();
3320 if (HasInteger32Value()) return Representation::Integer32(); 3343 if (HasInteger32Value()) return Representation::Integer32();
3321 if (HasNumberValue()) return Representation::Double(); 3344 if (HasNumberValue()) return Representation::Double();
3322 return Representation::Tagged(); 3345 return Representation::Tagged();
3323 } 3346 }
3324 3347
3325 virtual bool EmitAtUses() { return !representation().IsDouble(); } 3348 virtual bool EmitAtUses();
3326 virtual void PrintDataTo(StringStream* stream); 3349 virtual void PrintDataTo(StringStream* stream);
3327 virtual HType CalculateInferredType(); 3350 virtual HType CalculateInferredType();
3328 bool IsInteger() { return handle()->IsSmi(); } 3351 bool IsInteger() { return handle()->IsSmi(); }
3329 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; 3352 HConstant* CopyToRepresentation(Representation r, Zone* zone) const;
3330 HConstant* CopyToTruncatedInt32(Zone* zone) const; 3353 HConstant* CopyToTruncatedInt32(Zone* zone) const;
3331 bool HasInteger32Value() const { return has_int32_value_; } 3354 bool HasInteger32Value() const { return has_int32_value_; }
3332 int32_t Integer32Value() const { 3355 int32_t Integer32Value() const {
3333 ASSERT(HasInteger32Value()); 3356 ASSERT(HasInteger32Value());
3334 return int32_value_; 3357 return int32_value_;
3335 } 3358 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3383 } 3406 }
3384 } 3407 }
3385 3408
3386 virtual void FinalizeUniqueValueId() { 3409 virtual void FinalizeUniqueValueId() {
3387 if (!has_double_value_) { 3410 if (!has_double_value_) {
3388 ASSERT(!handle_.is_null()); 3411 ASSERT(!handle_.is_null());
3389 unique_id_ = UniqueValueId(handle_); 3412 unique_id_ = UniqueValueId(handle_);
3390 } 3413 }
3391 } 3414 }
3392 3415
3416 bool UniqueValueIdsMatch(UniqueValueId other) {
3417 if (!has_double_value_) return unique_id_ == other;
3418 return false;
3419 }
3420
3393 #ifdef DEBUG 3421 #ifdef DEBUG
3394 virtual void Verify() { } 3422 virtual void Verify() { }
3395 #endif 3423 #endif
3396 3424
3397 DECLARE_CONCRETE_INSTRUCTION(Constant) 3425 DECLARE_CONCRETE_INSTRUCTION(Constant)
3398 3426
3399 protected: 3427 protected:
3400 virtual Range* InferRange(Zone* zone); 3428 virtual Range* InferRange(Zone* zone);
3401 3429
3402 virtual bool DataEquals(HValue* other) { 3430 virtual bool DataEquals(HValue* other) {
(...skipping 27 matching lines...) Expand all
3430 // We store the HConstant in the most specific form safely possible. 3458 // We store the HConstant in the most specific form safely possible.
3431 // The two flags, has_int32_value_ and has_double_value_ tell us if 3459 // The two flags, has_int32_value_ and has_double_value_ tell us if
3432 // int32_value_ and double_value_ hold valid, safe representations 3460 // int32_value_ and double_value_ hold valid, safe representations
3433 // of the constant. has_int32_value_ implies has_double_value_ but 3461 // of the constant. has_int32_value_ implies has_double_value_ but
3434 // not the converse. 3462 // not the converse.
3435 bool has_smi_value_ : 1; 3463 bool has_smi_value_ : 1;
3436 bool has_int32_value_ : 1; 3464 bool has_int32_value_ : 1;
3437 bool has_double_value_ : 1; 3465 bool has_double_value_ : 1;
3438 bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType. 3466 bool is_internalized_string_ : 1; // TODO(yangguo): make this part of HType.
3439 bool is_not_in_new_space_ : 1; 3467 bool is_not_in_new_space_ : 1;
3468 bool is_cell_ : 1;
3440 bool boolean_value_ : 1; 3469 bool boolean_value_ : 1;
3441 int32_t int32_value_; 3470 int32_t int32_value_;
3442 double double_value_; 3471 double double_value_;
3443 HType type_from_value_; 3472 HType type_from_value_;
3444 }; 3473 };
3445 3474
3446 3475
3447 class HBinaryOperation: public HTemplateInstruction<3> { 3476 class HBinaryOperation: public HTemplateInstruction<3> {
3448 public: 3477 public:
3449 HBinaryOperation(HValue* context, HValue* left, HValue* right) 3478 HBinaryOperation(HValue* context, HValue* left, HValue* right)
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3490 3519
3491 virtual void initialize_output_representation(Representation observed) { 3520 virtual void initialize_output_representation(Representation observed) {
3492 observed_output_representation_ = observed; 3521 observed_output_representation_ = observed;
3493 } 3522 }
3494 3523
3495 virtual Representation observed_input_representation(int index) { 3524 virtual Representation observed_input_representation(int index) {
3496 if (index == 0) return Representation::Tagged(); 3525 if (index == 0) return Representation::Tagged();
3497 return observed_input_representation_[index - 1]; 3526 return observed_input_representation_[index - 1];
3498 } 3527 }
3499 3528
3500 virtual void InferRepresentation(HInferRepresentation* h_infer); 3529 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3501 virtual Representation RepresentationFromInputs(); 3530 virtual Representation RepresentationFromInputs();
3502 virtual void AssumeRepresentation(Representation r); 3531 virtual void AssumeRepresentation(Representation r);
3503 3532
3504 virtual void UpdateRepresentation(Representation new_rep, 3533 virtual void UpdateRepresentation(Representation new_rep,
3505 HInferRepresentation* h_infer, 3534 HInferRepresentationPhase* h_infer,
3506 const char* reason) { 3535 const char* reason) {
3507 // By default, binary operations don't handle Smis. 3536 // By default, binary operations don't handle Smis.
3508 if (new_rep.IsSmi()) { 3537 if (new_rep.IsSmi()) {
3509 new_rep = Representation::Integer32(); 3538 new_rep = Representation::Integer32();
3510 } 3539 }
3511 HValue::UpdateRepresentation(new_rep, h_infer, reason); 3540 HValue::UpdateRepresentation(new_rep, h_infer, reason);
3512 } 3541 }
3513 3542
3514 virtual bool IsCommutative() const { return false; } 3543 virtual bool IsCommutative() const { return false; }
3515 3544
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
3707 virtual Representation RequiredInputRepresentation(int arg_index) { 3736 virtual Representation RequiredInputRepresentation(int arg_index) {
3708 return representation(); 3737 return representation();
3709 } 3738 }
3710 3739
3711 virtual bool IsRelationTrueInternal(NumericRelation relation, 3740 virtual bool IsRelationTrueInternal(NumericRelation relation,
3712 HValue* related_value, 3741 HValue* related_value,
3713 int offset = 0, 3742 int offset = 0,
3714 int scale = 0); 3743 int scale = 0);
3715 3744
3716 virtual void PrintDataTo(StringStream* stream); 3745 virtual void PrintDataTo(StringStream* stream);
3717 virtual void InferRepresentation(HInferRepresentation* h_infer); 3746 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3718 3747
3719 HValue* index() { return OperandAt(0); } 3748 HValue* index() { return OperandAt(0); }
3720 HValue* length() { return OperandAt(1); } 3749 HValue* length() { return OperandAt(1); }
3721 3750
3722 virtual int RedefinedOperandIndex() { return 0; } 3751 virtual int RedefinedOperandIndex() { return 0; }
3723 virtual bool IsPurelyInformativeDefinition() { return skip_check(); } 3752 virtual bool IsPurelyInformativeDefinition() { return skip_check(); }
3724 virtual void AddInformativeDefinitions(); 3753 virtual void AddInformativeDefinitions();
3725 3754
3726 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 3755 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
3727 3756
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
3804 ASSERT(to.IsInteger32()); 3833 ASSERT(to.IsInteger32());
3805 ClearAllSideEffects(); 3834 ClearAllSideEffects();
3806 SetFlag(kUseGVN); 3835 SetFlag(kUseGVN);
3807 } else { 3836 } else {
3808 SetAllSideEffects(); 3837 SetAllSideEffects();
3809 ClearFlag(kUseGVN); 3838 ClearFlag(kUseGVN);
3810 } 3839 }
3811 } 3840 }
3812 3841
3813 virtual void UpdateRepresentation(Representation new_rep, 3842 virtual void UpdateRepresentation(Representation new_rep,
3814 HInferRepresentation* h_infer, 3843 HInferRepresentationPhase* h_infer,
3815 const char* reason) { 3844 const char* reason) {
3816 // We only generate either int32 or generic tagged bitwise operations. 3845 // We only generate either int32 or generic tagged bitwise operations.
3817 if (new_rep.IsSmi() || new_rep.IsDouble()) { 3846 if (new_rep.IsSmi() || new_rep.IsDouble()) {
3818 new_rep = Representation::Integer32(); 3847 new_rep = Representation::Integer32();
3819 } 3848 }
3820 HValue::UpdateRepresentation(new_rep, h_infer, reason); 3849 HValue::UpdateRepresentation(new_rep, h_infer, reason);
3821 } 3850 }
3822 3851
3823 virtual void initialize_output_representation(Representation observed) { 3852 virtual void initialize_output_representation(Representation observed) {
3824 if (observed.IsDouble()) observed = Representation::Integer32(); 3853 if (observed.IsDouble()) observed = Representation::Integer32();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3919 3948
3920 virtual HType CalculateInferredType(); 3949 virtual HType CalculateInferredType();
3921 3950
3922 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 3951 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
3923 3952
3924 private: 3953 private:
3925 Token::Value token_; 3954 Token::Value token_;
3926 }; 3955 };
3927 3956
3928 3957
3929 class HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> { 3958 class HCompareNumericAndBranch: public HTemplateControlInstruction<2, 2> {
3930 public: 3959 public:
3931 HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token) 3960 HCompareNumericAndBranch(HValue* left, HValue* right, Token::Value token)
3932 : token_(token) { 3961 : token_(token) {
3933 SetFlag(kFlexibleRepresentation); 3962 SetFlag(kFlexibleRepresentation);
3934 ASSERT(Token::IsCompareOp(token)); 3963 ASSERT(Token::IsCompareOp(token));
3935 SetOperandAt(0, left); 3964 SetOperandAt(0, left);
3936 SetOperandAt(1, right); 3965 SetOperandAt(1, right);
3937 } 3966 }
3938 3967
3939 HValue* left() { return OperandAt(0); } 3968 HValue* left() { return OperandAt(0); }
3940 HValue* right() { return OperandAt(1); } 3969 HValue* right() { return OperandAt(1); }
3941 Token::Value token() const { return token_; } 3970 Token::Value token() const { return token_; }
3942 3971
3943 void set_observed_input_representation(Representation left, 3972 void set_observed_input_representation(Representation left,
3944 Representation right) { 3973 Representation right) {
3945 observed_input_representation_[0] = left; 3974 observed_input_representation_[0] = left;
3946 observed_input_representation_[1] = right; 3975 observed_input_representation_[1] = right;
3947 } 3976 }
3948 3977
3949 virtual void InferRepresentation(HInferRepresentation* h_infer); 3978 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
3950 3979
3951 virtual Representation RequiredInputRepresentation(int index) { 3980 virtual Representation RequiredInputRepresentation(int index) {
3952 return representation(); 3981 return representation();
3953 } 3982 }
3954 virtual Representation observed_input_representation(int index) { 3983 virtual Representation observed_input_representation(int index) {
3955 return observed_input_representation_[index]; 3984 return observed_input_representation_[index];
3956 } 3985 }
3957 virtual void PrintDataTo(StringStream* stream); 3986 virtual void PrintDataTo(StringStream* stream);
3958 3987
3959 virtual void AddInformativeDefinitions(); 3988 virtual void AddInformativeDefinitions();
3960 3989
3961 DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch) 3990 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
3962 3991
3963 private: 3992 private:
3964 Representation observed_input_representation_[2]; 3993 Representation observed_input_representation_[2];
3965 Token::Value token_; 3994 Token::Value token_;
3966 }; 3995 };
3967 3996
3968 3997
3969 class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> { 3998 class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
3970 public: 3999 public:
3971 HCompareObjectEqAndBranch(HValue* left, HValue* right) { 4000 HCompareObjectEqAndBranch(HValue* left, HValue* right) {
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
4556 4585
4557 virtual Representation RequiredInputRepresentation(int index) { 4586 virtual Representation RequiredInputRepresentation(int index) {
4558 return index == 0 ? Representation::Tagged() 4587 return index == 0 ? Representation::Tagged()
4559 : representation(); 4588 : representation();
4560 } 4589 }
4561 4590
4562 virtual Representation observed_input_representation(int index) { 4591 virtual Representation observed_input_representation(int index) {
4563 return RequiredInputRepresentation(index); 4592 return RequiredInputRepresentation(index);
4564 } 4593 }
4565 4594
4566 virtual void InferRepresentation(HInferRepresentation* h_infer); 4595 virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
4567 4596
4568 virtual Representation RepresentationFromInputs() { 4597 virtual Representation RepresentationFromInputs() {
4569 Representation left_rep = left()->representation(); 4598 Representation left_rep = left()->representation();
4570 Representation right_rep = right()->representation(); 4599 Representation right_rep = right()->representation();
4571 if ((left_rep.IsNone() || left_rep.IsInteger32()) && 4600 if ((left_rep.IsNone() || left_rep.IsInteger32()) &&
4572 (right_rep.IsNone() || right_rep.IsInteger32())) { 4601 (right_rep.IsNone() || right_rep.IsInteger32())) {
4573 return Representation::Integer32(); 4602 return Representation::Integer32();
4574 } 4603 }
4575 return Representation::Double(); 4604 return Representation::Double();
4576 } 4605 }
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
4728 4757
4729 protected: 4758 protected:
4730 virtual bool DataEquals(HValue* other) { return true; } 4759 virtual bool DataEquals(HValue* other) { return true; }
4731 }; 4760 };
4732 4761
4733 4762
4734 class HOsrEntry: public HTemplateInstruction<0> { 4763 class HOsrEntry: public HTemplateInstruction<0> {
4735 public: 4764 public:
4736 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { 4765 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) {
4737 SetGVNFlag(kChangesOsrEntries); 4766 SetGVNFlag(kChangesOsrEntries);
4767 SetGVNFlag(kChangesNewSpacePromotion);
4738 } 4768 }
4739 4769
4740 BailoutId ast_id() const { return ast_id_; } 4770 BailoutId ast_id() const { return ast_id_; }
4741 4771
4742 virtual Representation RequiredInputRepresentation(int index) { 4772 virtual Representation RequiredInputRepresentation(int index) {
4743 return Representation::None(); 4773 return Representation::None();
4744 } 4774 }
4745 4775
4746 DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 4776 DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
4747 4777
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
5082 } 5112 }
5083 5113
5084 5114
5085 inline bool ReceiverObjectNeedsWriteBarrier(HValue* object, 5115 inline bool ReceiverObjectNeedsWriteBarrier(HValue* object,
5086 HValue* new_space_dominator) { 5116 HValue* new_space_dominator) {
5087 if (object->IsInnerAllocatedObject()) { 5117 if (object->IsInnerAllocatedObject()) {
5088 return ReceiverObjectNeedsWriteBarrier( 5118 return ReceiverObjectNeedsWriteBarrier(
5089 HInnerAllocatedObject::cast(object)->base_object(), 5119 HInnerAllocatedObject::cast(object)->base_object(),
5090 new_space_dominator); 5120 new_space_dominator);
5091 } 5121 }
5122 if (object->IsConstant() && HConstant::cast(object)->IsCell()) {
5123 return false;
5124 }
5092 if (object != new_space_dominator) return true; 5125 if (object != new_space_dominator) return true;
5093 if (object->IsAllocateObject()) return false; 5126 if (object->IsAllocateObject()) return false;
5094 if (object->IsAllocate()) { 5127 if (object->IsAllocate()) {
5095 return !HAllocate::cast(object)->GuaranteedInNewSpace(); 5128 return !HAllocate::cast(object)->GuaranteedInNewSpace();
5096 } 5129 }
5097 return true; 5130 return true;
5098 } 5131 }
5099 5132
5100 5133
5101 class HStoreGlobalCell: public HUnaryOperation { 5134 class HStoreGlobalCell: public HUnaryOperation {
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
5307 } 5340 }
5308 5341
5309 static HObjectAccess ForElementsPointer() { 5342 static HObjectAccess ForElementsPointer() {
5310 return HObjectAccess(kElementsPointer, JSObject::kElementsOffset); 5343 return HObjectAccess(kElementsPointer, JSObject::kElementsOffset);
5311 } 5344 }
5312 5345
5313 static HObjectAccess ForArrayLength() { 5346 static HObjectAccess ForArrayLength() {
5314 return HObjectAccess(kArrayLengths, JSArray::kLengthOffset); 5347 return HObjectAccess(kArrayLengths, JSArray::kLengthOffset);
5315 } 5348 }
5316 5349
5350 static HObjectAccess ForAllocationSitePayload() {
5351 return HObjectAccess(kInobject, AllocationSite::kPayloadOffset);
5352 }
5353
5317 static HObjectAccess ForFixedArrayLength() { 5354 static HObjectAccess ForFixedArrayLength() {
5318 return HObjectAccess(kArrayLengths, FixedArray::kLengthOffset); 5355 return HObjectAccess(kArrayLengths, FixedArray::kLengthOffset);
5319 } 5356 }
5320 5357
5321 static HObjectAccess ForPropertiesPointer() { 5358 static HObjectAccess ForPropertiesPointer() {
5322 return HObjectAccess(kInobject, JSObject::kPropertiesOffset); 5359 return HObjectAccess(kInobject, JSObject::kPropertiesOffset);
5323 } 5360 }
5324 5361
5325 static HObjectAccess ForPrototypeOrInitialMap() { 5362 static HObjectAccess ForPrototypeOrInitialMap() {
5326 return HObjectAccess(kInobject, JSFunction::kPrototypeOrInitialMapOffset); 5363 return HObjectAccess(kInobject, JSFunction::kPrototypeOrInitialMapOffset);
5327 } 5364 }
5328 5365
5329 static HObjectAccess ForMap() { 5366 static HObjectAccess ForMap() {
5330 return HObjectAccess(kMaps, JSObject::kMapOffset); 5367 return HObjectAccess(kMaps, JSObject::kMapOffset);
5331 } 5368 }
5332 5369
5333 static HObjectAccess ForAllocationSitePayload() { 5370 static HObjectAccess ForPropertyCellValue() {
5334 return HObjectAccess(kInobject, AllocationSiteInfo::kPayloadOffset); 5371 return HObjectAccess(kInobject, PropertyCell::kValueOffset);
5372 }
5373
5374 static HObjectAccess ForCellValue() {
5375 return HObjectAccess(kInobject, Cell::kValueOffset);
5376 }
5377
5378 static HObjectAccess ForAllocationSiteInfoSite() {
5379 return HObjectAccess(kInobject, AllocationSiteInfo::kAllocationSiteOffset);
5335 } 5380 }
5336 5381
5337 // Create an access to an offset in a fixed array header. 5382 // Create an access to an offset in a fixed array header.
5338 static HObjectAccess ForFixedArrayHeader(int offset); 5383 static HObjectAccess ForFixedArrayHeader(int offset);
5339 5384
5340 // Create an access to an in-object property in a JSObject. 5385 // Create an access to an in-object property in a JSObject.
5341 static HObjectAccess ForJSObjectOffset(int offset); 5386 static HObjectAccess ForJSObjectOffset(int offset);
5342 5387
5343 // Create an access to an in-object property in a JSArray. 5388 // Create an access to an in-object property in a JSArray.
5344 static HObjectAccess ForJSArrayOffset(int offset); 5389 static HObjectAccess ForJSArrayOffset(int offset);
5345 5390
5346 // Create an access to the backing store of an object. 5391 // Create an access to the backing store of an object.
5347 static HObjectAccess ForBackingStoreOffset(int offset); 5392 static HObjectAccess ForBackingStoreOffset(int offset);
5348 5393
5349 // Create an access to a resolved field (in-object or backing store). 5394 // Create an access to a resolved field (in-object or backing store).
5350 static HObjectAccess ForField(Handle<Map> map, 5395 static HObjectAccess ForField(Handle<Map> map,
5351 LookupResult *lookup, Handle<String> name = Handle<String>::null()); 5396 LookupResult *lookup, Handle<String> name = Handle<String>::null());
5352 5397
5398 // Create an access for the payload of a Cell or JSGlobalPropertyCell.
5399 static HObjectAccess ForCellPayload(Isolate* isolate);
5400
5353 void PrintTo(StringStream* stream); 5401 void PrintTo(StringStream* stream);
5354 5402
5355 inline bool Equals(HObjectAccess that) const { 5403 inline bool Equals(HObjectAccess that) const {
5356 return value_ == that.value_; // portion and offset must match 5404 return value_ == that.value_; // portion and offset must match
5357 } 5405 }
5358 5406
5359 protected: 5407 protected:
5360 void SetGVNFlags(HValue *instr, bool is_store); 5408 void SetGVNFlags(HValue *instr, bool is_store);
5361 5409
5362 private: 5410 private:
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
5424 HValue* object() { return OperandAt(0); } 5472 HValue* object() { return OperandAt(0); }
5425 HValue* typecheck() { 5473 HValue* typecheck() {
5426 ASSERT(HasTypeCheck()); 5474 ASSERT(HasTypeCheck());
5427 return OperandAt(1); 5475 return OperandAt(1);
5428 } 5476 }
5429 5477
5430 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } 5478 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); }
5431 HObjectAccess access() const { return access_; } 5479 HObjectAccess access() const { return access_; }
5432 Representation field_representation() const { return representation_; } 5480 Representation field_representation() const { return representation_; }
5433 5481
5482 virtual bool HasEscapingOperandAt(int index) { return false; }
5434 virtual Representation RequiredInputRepresentation(int index) { 5483 virtual Representation RequiredInputRepresentation(int index) {
5435 return Representation::Tagged(); 5484 return Representation::Tagged();
5436 } 5485 }
5437 virtual void PrintDataTo(StringStream* stream); 5486 virtual void PrintDataTo(StringStream* stream);
5438 5487
5439 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 5488 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
5440 5489
5441 protected: 5490 protected:
5442 virtual bool DataEquals(HValue* other) { 5491 virtual bool DataEquals(HValue* other) {
5443 HLoadNamedField* b = HLoadNamedField::cast(other); 5492 HLoadNamedField* b = HLoadNamedField::cast(other);
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
5748 public: 5797 public:
5749 HStoreNamedField(HValue* obj, 5798 HStoreNamedField(HValue* obj,
5750 HObjectAccess access, 5799 HObjectAccess access,
5751 HValue* val, 5800 HValue* val,
5752 Representation field_representation 5801 Representation field_representation
5753 = Representation::Tagged()) 5802 = Representation::Tagged())
5754 : access_(access), 5803 : access_(access),
5755 field_representation_(field_representation), 5804 field_representation_(field_representation),
5756 transition_(), 5805 transition_(),
5757 transition_unique_id_(), 5806 transition_unique_id_(),
5758 new_space_dominator_(NULL) { 5807 new_space_dominator_(NULL),
5808 write_barrier_mode_(UPDATE_WRITE_BARRIER) {
5759 SetOperandAt(0, obj); 5809 SetOperandAt(0, obj);
5760 SetOperandAt(1, val); 5810 SetOperandAt(1, val);
5761 access.SetGVNFlags(this, true); 5811 access.SetGVNFlags(this, true);
5762 } 5812 }
5763 5813
5764 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 5814 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
5765 5815
5816 virtual bool HasEscapingOperandAt(int index) { return index == 1; }
5766 virtual Representation RequiredInputRepresentation(int index) { 5817 virtual Representation RequiredInputRepresentation(int index) {
5767 if (FLAG_track_double_fields && 5818 if (FLAG_track_double_fields &&
5768 index == 1 && field_representation_.IsDouble()) { 5819 index == 1 && field_representation_.IsDouble()) {
5769 return field_representation_; 5820 return field_representation_;
5770 } else if (FLAG_track_fields && 5821 } else if (FLAG_track_fields &&
5771 index == 1 && field_representation_.IsSmi()) { 5822 index == 1 && field_representation_.IsSmi()) {
5772 return field_representation_; 5823 return field_representation_;
5773 } 5824 }
5774 return Representation::Tagged(); 5825 return Representation::Tagged();
5775 } 5826 }
5776 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { 5827 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) {
5777 ASSERT(side_effect == kChangesNewSpacePromotion); 5828 ASSERT(side_effect == kChangesNewSpacePromotion);
5778 new_space_dominator_ = dominator; 5829 new_space_dominator_ = dominator;
5779 } 5830 }
5780 virtual void PrintDataTo(StringStream* stream); 5831 virtual void PrintDataTo(StringStream* stream);
5781 5832
5833 void SkipWriteBarrier() { write_barrier_mode_ = SKIP_WRITE_BARRIER; }
5834 bool IsSkipWriteBarrier() const {
5835 return write_barrier_mode_ == SKIP_WRITE_BARRIER;
5836 }
5837
5782 HValue* object() { return OperandAt(0); } 5838 HValue* object() { return OperandAt(0); }
5783 HValue* value() { return OperandAt(1); } 5839 HValue* value() { return OperandAt(1); }
5784 5840
5785 HObjectAccess access() const { return access_; } 5841 HObjectAccess access() const { return access_; }
5786 Handle<Map> transition() const { return transition_; } 5842 Handle<Map> transition() const { return transition_; }
5787 UniqueValueId transition_unique_id() const { return transition_unique_id_; } 5843 UniqueValueId transition_unique_id() const { return transition_unique_id_; }
5788 void SetTransition(Handle<Map> map, CompilationInfo* info) { 5844 void SetTransition(Handle<Map> map, CompilationInfo* info) {
5789 ASSERT(transition_.is_null()); // Only set once. 5845 ASSERT(transition_.is_null()); // Only set once.
5790 if (map->CanBeDeprecated()) { 5846 if (map->CanBeDeprecated()) {
5791 map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info); 5847 map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info);
5792 } 5848 }
5793 transition_ = map; 5849 transition_ = map;
5794 } 5850 }
5795 HValue* new_space_dominator() const { return new_space_dominator_; } 5851 HValue* new_space_dominator() const { return new_space_dominator_; }
5796 5852
5797 bool NeedsWriteBarrier() { 5853 bool NeedsWriteBarrier() {
5798 ASSERT(!(FLAG_track_double_fields && field_representation_.IsDouble()) || 5854 ASSERT(!(FLAG_track_double_fields && field_representation_.IsDouble()) ||
5799 transition_.is_null()); 5855 transition_.is_null());
5856 if (IsSkipWriteBarrier()) return false;
5800 return (!FLAG_track_fields || !field_representation_.IsSmi()) && 5857 return (!FLAG_track_fields || !field_representation_.IsSmi()) &&
5801 // If there is a transition, a new storage object needs to be allocated. 5858 // If there is a transition, a new storage object needs to be allocated.
5802 !(FLAG_track_double_fields && field_representation_.IsDouble()) && 5859 !(FLAG_track_double_fields && field_representation_.IsDouble()) &&
5803 StoringValueNeedsWriteBarrier(value()) && 5860 StoringValueNeedsWriteBarrier(value()) &&
5804 ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); 5861 ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
5805 } 5862 }
5806 5863
5807 bool NeedsWriteBarrierForMap() { 5864 bool NeedsWriteBarrierForMap() {
5865 if (IsSkipWriteBarrier()) return false;
5808 return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); 5866 return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
5809 } 5867 }
5810 5868
5811 virtual void FinalizeUniqueValueId() { 5869 virtual void FinalizeUniqueValueId() {
5812 transition_unique_id_ = UniqueValueId(transition_); 5870 transition_unique_id_ = UniqueValueId(transition_);
5813 } 5871 }
5814 5872
5815 Representation field_representation() const { 5873 Representation field_representation() const {
5816 return field_representation_; 5874 return field_representation_;
5817 } 5875 }
5818 5876
5819 private: 5877 private:
5820 HObjectAccess access_; 5878 HObjectAccess access_;
5821 Representation field_representation_; 5879 Representation field_representation_;
5822 Handle<Map> transition_; 5880 Handle<Map> transition_;
5823 UniqueValueId transition_unique_id_; 5881 UniqueValueId transition_unique_id_;
5824 HValue* new_space_dominator_; 5882 HValue* new_space_dominator_;
5883 WriteBarrierMode write_barrier_mode_;
5825 }; 5884 };
5826 5885
5827 5886
5828 class HStoreNamedGeneric: public HTemplateInstruction<3> { 5887 class HStoreNamedGeneric: public HTemplateInstruction<3> {
5829 public: 5888 public:
5830 HStoreNamedGeneric(HValue* context, 5889 HStoreNamedGeneric(HValue* context,
5831 HValue* object, 5890 HValue* object,
5832 Handle<String> name, 5891 Handle<String> name,
5833 HValue* value, 5892 HValue* value,
5834 StrictModeFlag strict_mode_flag) 5893 StrictModeFlag strict_mode_flag)
(...skipping 26 matching lines...) Expand all
5861 5920
5862 5921
5863 class HStoreKeyed 5922 class HStoreKeyed
5864 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 5923 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
5865 public: 5924 public:
5866 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 5925 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
5867 ElementsKind elements_kind) 5926 ElementsKind elements_kind)
5868 : elements_kind_(elements_kind), 5927 : elements_kind_(elements_kind),
5869 index_offset_(0), 5928 index_offset_(0),
5870 is_dehoisted_(false), 5929 is_dehoisted_(false),
5930 is_uninitialized_(false),
5871 new_space_dominator_(NULL) { 5931 new_space_dominator_(NULL) {
5872 SetOperandAt(0, obj); 5932 SetOperandAt(0, obj);
5873 SetOperandAt(1, key); 5933 SetOperandAt(1, key);
5874 SetOperandAt(2, val); 5934 SetOperandAt(2, val);
5875 5935
5876 if (IsFastObjectElementsKind(elements_kind)) { 5936 if (IsFastObjectElementsKind(elements_kind)) {
5877 SetFlag(kTrackSideEffectDominators); 5937 SetFlag(kTrackSideEffectDominators);
5878 SetGVNFlag(kDependsOnNewSpacePromotion); 5938 SetGVNFlag(kDependsOnNewSpacePromotion);
5879 } 5939 }
5880 if (is_external()) { 5940 if (is_external()) {
5881 SetGVNFlag(kChangesSpecializedArrayElements); 5941 SetGVNFlag(kChangesSpecializedArrayElements);
5882 SetFlag(kAllowUndefinedAsNaN); 5942 SetFlag(kAllowUndefinedAsNaN);
5883 } else if (IsFastDoubleElementsKind(elements_kind)) { 5943 } else if (IsFastDoubleElementsKind(elements_kind)) {
5884 SetGVNFlag(kChangesDoubleArrayElements); 5944 SetGVNFlag(kChangesDoubleArrayElements);
5885 } else if (IsFastSmiElementsKind(elements_kind)) { 5945 } else if (IsFastSmiElementsKind(elements_kind)) {
5886 SetGVNFlag(kChangesArrayElements); 5946 SetGVNFlag(kChangesArrayElements);
5887 } else { 5947 } else {
5888 SetGVNFlag(kChangesArrayElements); 5948 SetGVNFlag(kChangesArrayElements);
5889 } 5949 }
5890 5950
5891 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 5951 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
5892 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && 5952 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
5893 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { 5953 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
5894 SetFlag(kTruncatingToInt32); 5954 SetFlag(kTruncatingToInt32);
5895 } 5955 }
5896 } 5956 }
5897 5957
5958 virtual bool HasEscapingOperandAt(int index) { return index != 0; }
5898 virtual Representation RequiredInputRepresentation(int index) { 5959 virtual Representation RequiredInputRepresentation(int index) {
5899 // kind_fast: tagged[int32] = tagged 5960 // kind_fast: tagged[int32] = tagged
5900 // kind_double: tagged[int32] = double 5961 // kind_double: tagged[int32] = double
5901 // kind_smi : tagged[int32] = smi 5962 // kind_smi : tagged[int32] = smi
5902 // kind_external: external[int32] = (double | int32) 5963 // kind_external: external[int32] = (double | int32)
5903 if (index == 0) { 5964 if (index == 0) {
5904 return is_external() ? Representation::External() 5965 return is_external() ? Representation::External()
5905 : Representation::Tagged(); 5966 : Representation::Tagged();
5906 } else if (index == 1) { 5967 } else if (index == 1) {
5907 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 5968 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
(...skipping 12 matching lines...) Expand all
5920 return is_external() ? Representation::Integer32() 5981 return is_external() ? Representation::Integer32()
5921 : Representation::Tagged(); 5982 : Representation::Tagged();
5922 } 5983 }
5923 5984
5924 bool is_external() const { 5985 bool is_external() const {
5925 return IsExternalArrayElementsKind(elements_kind()); 5986 return IsExternalArrayElementsKind(elements_kind());
5926 } 5987 }
5927 5988
5928 virtual Representation observed_input_representation(int index) { 5989 virtual Representation observed_input_representation(int index) {
5929 if (index < 2) return RequiredInputRepresentation(index); 5990 if (index < 2) return RequiredInputRepresentation(index);
5991 if (IsUninitialized()) {
5992 return Representation::None();
5993 }
5930 if (IsFastSmiElementsKind(elements_kind())) { 5994 if (IsFastSmiElementsKind(elements_kind())) {
5931 return Representation::Smi(); 5995 return Representation::Smi();
5932 } 5996 }
5933 if (IsDoubleOrFloatElementsKind(elements_kind())) { 5997 if (IsDoubleOrFloatElementsKind(elements_kind())) {
5934 return Representation::Double(); 5998 return Representation::Double();
5935 } 5999 }
5936 if (is_external()) { 6000 if (is_external()) {
5937 return Representation::Integer32(); 6001 return Representation::Integer32();
5938 } 6002 }
5939 // For fast object elements kinds, don't assume anything. 6003 // For fast object elements kinds, don't assume anything.
5940 return Representation::None(); 6004 return Representation::None();
5941 } 6005 }
5942 6006
5943 HValue* elements() { return OperandAt(0); } 6007 HValue* elements() { return OperandAt(0); }
5944 HValue* key() { return OperandAt(1); } 6008 HValue* key() { return OperandAt(1); }
5945 HValue* value() { return OperandAt(2); } 6009 HValue* value() { return OperandAt(2); }
5946 bool value_is_smi() const { 6010 bool value_is_smi() const {
5947 return IsFastSmiElementsKind(elements_kind_); 6011 return IsFastSmiElementsKind(elements_kind_);
5948 } 6012 }
5949 ElementsKind elements_kind() const { return elements_kind_; } 6013 ElementsKind elements_kind() const { return elements_kind_; }
5950 uint32_t index_offset() { return index_offset_; } 6014 uint32_t index_offset() { return index_offset_; }
5951 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } 6015 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; }
5952 HValue* GetKey() { return key(); } 6016 HValue* GetKey() { return key(); }
5953 void SetKey(HValue* key) { SetOperandAt(1, key); } 6017 void SetKey(HValue* key) { SetOperandAt(1, key); }
5954 bool IsDehoisted() { return is_dehoisted_; } 6018 bool IsDehoisted() { return is_dehoisted_; }
5955 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } 6019 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; }
6020 bool IsUninitialized() { return is_uninitialized_; }
6021 void SetUninitialized(bool is_uninitialized) {
6022 is_uninitialized_ = is_uninitialized;
6023 }
5956 6024
5957 bool IsConstantHoleStore() { 6025 bool IsConstantHoleStore() {
5958 return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); 6026 return value()->IsConstant() && HConstant::cast(value())->IsTheHole();
5959 } 6027 }
5960 6028
5961 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) { 6029 virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator) {
5962 ASSERT(side_effect == kChangesNewSpacePromotion); 6030 ASSERT(side_effect == kChangesNewSpacePromotion);
5963 new_space_dominator_ = dominator; 6031 new_space_dominator_ = dominator;
5964 } 6032 }
5965 6033
(...skipping 10 matching lines...) Expand all
5976 6044
5977 bool NeedsCanonicalization(); 6045 bool NeedsCanonicalization();
5978 6046
5979 virtual void PrintDataTo(StringStream* stream); 6047 virtual void PrintDataTo(StringStream* stream);
5980 6048
5981 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6049 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
5982 6050
5983 private: 6051 private:
5984 ElementsKind elements_kind_; 6052 ElementsKind elements_kind_;
5985 uint32_t index_offset_; 6053 uint32_t index_offset_;
5986 bool is_dehoisted_; 6054 bool is_dehoisted_ : 1;
6055 bool is_uninitialized_ : 1;
5987 HValue* new_space_dominator_; 6056 HValue* new_space_dominator_;
5988 }; 6057 };
5989 6058
5990 6059
5991 class HStoreKeyedGeneric: public HTemplateInstruction<4> { 6060 class HStoreKeyedGeneric: public HTemplateInstruction<4> {
5992 public: 6061 public:
5993 HStoreKeyedGeneric(HValue* context, 6062 HStoreKeyedGeneric(HValue* context,
5994 HValue* object, 6063 HValue* object,
5995 HValue* key, 6064 HValue* key,
5996 HValue* value, 6065 HValue* value,
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
6641 virtual bool IsDeletable() const { return true; } 6710 virtual bool IsDeletable() const { return true; }
6642 }; 6711 };
6643 6712
6644 6713
6645 #undef DECLARE_INSTRUCTION 6714 #undef DECLARE_INSTRUCTION
6646 #undef DECLARE_CONCRETE_INSTRUCTION 6715 #undef DECLARE_CONCRETE_INSTRUCTION
6647 6716
6648 } } // namespace v8::internal 6717 } } // namespace v8::internal
6649 6718
6650 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 6719 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen-infer-types.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698