OLD | NEW |
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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 V(Constant) \ | 104 V(Constant) \ |
105 V(Context) \ | 105 V(Context) \ |
106 V(DebugBreak) \ | 106 V(DebugBreak) \ |
107 V(DeclareGlobals) \ | 107 V(DeclareGlobals) \ |
108 V(DeleteProperty) \ | 108 V(DeleteProperty) \ |
109 V(Deoptimize) \ | 109 V(Deoptimize) \ |
110 V(Div) \ | 110 V(Div) \ |
111 V(DummyUse) \ | 111 V(DummyUse) \ |
112 V(ElementsKind) \ | 112 V(ElementsKind) \ |
113 V(EnterInlined) \ | 113 V(EnterInlined) \ |
| 114 V(EnvironmentMarker) \ |
114 V(FixedArrayBaseLength) \ | 115 V(FixedArrayBaseLength) \ |
115 V(ForceRepresentation) \ | 116 V(ForceRepresentation) \ |
116 V(FunctionLiteral) \ | 117 V(FunctionLiteral) \ |
117 V(GetCachedArrayIndex) \ | 118 V(GetCachedArrayIndex) \ |
118 V(GlobalObject) \ | 119 V(GlobalObject) \ |
119 V(GlobalReceiver) \ | 120 V(GlobalReceiver) \ |
120 V(Goto) \ | 121 V(Goto) \ |
121 V(HasCachedArrayIndexAndBranch) \ | 122 V(HasCachedArrayIndexAndBranch) \ |
122 V(HasInstanceTypeAndBranch) \ | 123 V(HasInstanceTypeAndBranch) \ |
123 V(InductionVariableAnnotation) \ | 124 V(InductionVariableAnnotation) \ |
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 kUint32, | 806 kUint32, |
806 // If a phi is involved in the evaluation of a numeric constraint the | 807 // If a phi is involved in the evaluation of a numeric constraint the |
807 // recursion can cause an endless cycle: we use this flag to exit the loop. | 808 // recursion can cause an endless cycle: we use this flag to exit the loop. |
808 kNumericConstraintEvaluationInProgress, | 809 kNumericConstraintEvaluationInProgress, |
809 // This flag is set to true after the SetupInformativeDefinitions() pass | 810 // This flag is set to true after the SetupInformativeDefinitions() pass |
810 // has processed this instruction. | 811 // has processed this instruction. |
811 kIDefsProcessingDone, | 812 kIDefsProcessingDone, |
812 kHasNoObservableSideEffects, | 813 kHasNoObservableSideEffects, |
813 // Indicates the instruction is live during dead code elimination. | 814 // Indicates the instruction is live during dead code elimination. |
814 kIsLive, | 815 kIsLive, |
815 kLastFlag = kIDefsProcessingDone | 816 |
| 817 // HEnvironmentMarkers are deleted before dead code |
| 818 // elimination takes place, so they can repurpose the kIsLive flag: |
| 819 kEndsLiveRange = kIsLive, |
| 820 |
| 821 // TODO(everyone): Don't forget to update this! |
| 822 kLastFlag = kIsLive |
816 }; | 823 }; |
817 | 824 |
818 STATIC_ASSERT(kLastFlag < kBitsPerInt); | 825 STATIC_ASSERT(kLastFlag < kBitsPerInt); |
819 | 826 |
820 static const int kChangesToDependsFlagsLeftShift = 1; | 827 static const int kChangesToDependsFlagsLeftShift = 1; |
821 | 828 |
822 static GVNFlag ChangesFlagFromInt(int x) { | 829 static GVNFlag ChangesFlagFromInt(int x) { |
823 return static_cast<GVNFlag>(x * 2); | 830 return static_cast<GVNFlag>(x * 2); |
824 } | 831 } |
825 static GVNFlag DependsOnFlagFromInt(int x) { | 832 static GVNFlag DependsOnFlagFromInt(int x) { |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 virtual Representation RequiredInputRepresentation(int index) { | 1477 virtual Representation RequiredInputRepresentation(int index) { |
1471 return Representation::None(); | 1478 return Representation::None(); |
1472 } | 1479 } |
1473 | 1480 |
1474 DECLARE_CONCRETE_INSTRUCTION(DebugBreak) | 1481 DECLARE_CONCRETE_INSTRUCTION(DebugBreak) |
1475 }; | 1482 }; |
1476 | 1483 |
1477 | 1484 |
1478 class HDeoptimize: public HControlInstruction { | 1485 class HDeoptimize: public HControlInstruction { |
1479 public: | 1486 public: |
1480 HDeoptimize(int environment_length, Zone* zone) | 1487 HDeoptimize(int environment_length, |
1481 : values_(environment_length, zone) { } | 1488 int first_local_index, |
| 1489 int first_expression_index, |
| 1490 Zone* zone) |
| 1491 : values_(environment_length, zone), |
| 1492 first_local_index_(first_local_index), |
| 1493 first_expression_index_(first_expression_index) { } |
1482 | 1494 |
1483 virtual Representation RequiredInputRepresentation(int index) { | 1495 virtual Representation RequiredInputRepresentation(int index) { |
1484 return Representation::None(); | 1496 return Representation::None(); |
1485 } | 1497 } |
1486 | 1498 |
1487 virtual int OperandCount() { return values_.length(); } | 1499 virtual int OperandCount() { return values_.length(); } |
1488 virtual HValue* OperandAt(int index) const { return values_[index]; } | 1500 virtual HValue* OperandAt(int index) const { return values_[index]; } |
1489 virtual void PrintDataTo(StringStream* stream); | 1501 virtual void PrintDataTo(StringStream* stream); |
1490 | 1502 |
1491 virtual int SuccessorCount() { return 0; } | 1503 virtual int SuccessorCount() { return 0; } |
1492 virtual HBasicBlock* SuccessorAt(int i) { | 1504 virtual HBasicBlock* SuccessorAt(int i) { |
1493 UNREACHABLE(); | 1505 UNREACHABLE(); |
1494 return NULL; | 1506 return NULL; |
1495 } | 1507 } |
1496 virtual void SetSuccessorAt(int i, HBasicBlock* block) { | 1508 virtual void SetSuccessorAt(int i, HBasicBlock* block) { |
1497 UNREACHABLE(); | 1509 UNREACHABLE(); |
1498 } | 1510 } |
1499 | 1511 |
1500 void AddEnvironmentValue(HValue* value, Zone* zone) { | 1512 void AddEnvironmentValue(HValue* value, Zone* zone) { |
1501 values_.Add(NULL, zone); | 1513 values_.Add(NULL, zone); |
1502 SetOperandAt(values_.length() - 1, value); | 1514 SetOperandAt(values_.length() - 1, value); |
1503 } | 1515 } |
| 1516 int first_local_index() { return first_local_index_; } |
| 1517 int first_expression_index() { return first_expression_index_; } |
1504 | 1518 |
1505 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) | 1519 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) |
1506 | 1520 |
1507 enum UseEnvironment { | 1521 enum UseEnvironment { |
1508 kNoUses, | 1522 kNoUses, |
1509 kUseAll | 1523 kUseAll |
1510 }; | 1524 }; |
1511 | 1525 |
1512 protected: | 1526 protected: |
1513 virtual void InternalSetOperandAt(int index, HValue* value) { | 1527 virtual void InternalSetOperandAt(int index, HValue* value) { |
1514 values_[index] = value; | 1528 values_[index] = value; |
1515 } | 1529 } |
1516 | 1530 |
1517 private: | 1531 private: |
1518 ZoneList<HValue*> values_; | 1532 ZoneList<HValue*> values_; |
| 1533 int first_local_index_; |
| 1534 int first_expression_index_; |
1519 }; | 1535 }; |
1520 | 1536 |
1521 | 1537 |
1522 class HGoto: public HTemplateControlInstruction<1, 0> { | 1538 class HGoto: public HTemplateControlInstruction<1, 0> { |
1523 public: | 1539 public: |
1524 explicit HGoto(HBasicBlock* target) { | 1540 explicit HGoto(HBasicBlock* target) { |
1525 SetSuccessorAt(0, target); | 1541 SetSuccessorAt(0, target); |
1526 } | 1542 } |
1527 | 1543 |
1528 virtual Representation RequiredInputRepresentation(int index) { | 1544 virtual Representation RequiredInputRepresentation(int index) { |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1820 } | 1836 } |
1821 bool HasAssignedIndexAt(int index) const { | 1837 bool HasAssignedIndexAt(int index) const { |
1822 return assigned_indexes_[index] != kNoIndex; | 1838 return assigned_indexes_[index] != kNoIndex; |
1823 } | 1839 } |
1824 void AddAssignedValue(int index, HValue* value) { | 1840 void AddAssignedValue(int index, HValue* value) { |
1825 AddValue(index, value); | 1841 AddValue(index, value); |
1826 } | 1842 } |
1827 void AddPushedValue(HValue* value) { | 1843 void AddPushedValue(HValue* value) { |
1828 AddValue(kNoIndex, value); | 1844 AddValue(kNoIndex, value); |
1829 } | 1845 } |
| 1846 int ToOperandIndex(int environment_index) { |
| 1847 for (int i = 0; i < assigned_indexes_.length(); ++i) { |
| 1848 if (assigned_indexes_[i] == environment_index) return i; |
| 1849 } |
| 1850 return -1; |
| 1851 } |
1830 virtual int OperandCount() { return values_.length(); } | 1852 virtual int OperandCount() { return values_.length(); } |
1831 virtual HValue* OperandAt(int index) const { return values_[index]; } | 1853 virtual HValue* OperandAt(int index) const { return values_[index]; } |
1832 | 1854 |
1833 virtual Representation RequiredInputRepresentation(int index) { | 1855 virtual Representation RequiredInputRepresentation(int index) { |
1834 return Representation::None(); | 1856 return Representation::None(); |
1835 } | 1857 } |
1836 | 1858 |
1837 void MergeWith(ZoneList<HSimulate*>* list); | 1859 void MergeWith(ZoneList<HSimulate*>* list); |
1838 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } | 1860 bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } |
1839 | 1861 |
1840 DECLARE_CONCRETE_INSTRUCTION(Simulate) | 1862 DECLARE_CONCRETE_INSTRUCTION(Simulate) |
1841 | 1863 |
1842 #ifdef DEBUG | 1864 #ifdef DEBUG |
1843 virtual void Verify(); | 1865 virtual void Verify(); |
| 1866 void set_closure(Handle<JSFunction> closure) { closure_ = closure; } |
| 1867 Handle<JSFunction> closure() const { return closure_; } |
1844 #endif | 1868 #endif |
1845 | 1869 |
1846 protected: | 1870 protected: |
1847 virtual void InternalSetOperandAt(int index, HValue* value) { | 1871 virtual void InternalSetOperandAt(int index, HValue* value) { |
1848 values_[index] = value; | 1872 values_[index] = value; |
1849 } | 1873 } |
1850 | 1874 |
1851 private: | 1875 private: |
1852 static const int kNoIndex = -1; | 1876 static const int kNoIndex = -1; |
1853 void AddValue(int index, HValue* value) { | 1877 void AddValue(int index, HValue* value) { |
1854 assigned_indexes_.Add(index, zone_); | 1878 assigned_indexes_.Add(index, zone_); |
1855 // Resize the list of pushed values. | 1879 // Resize the list of pushed values. |
1856 values_.Add(NULL, zone_); | 1880 values_.Add(NULL, zone_); |
1857 // Set the operand through the base method in HValue to make sure that the | 1881 // Set the operand through the base method in HValue to make sure that the |
1858 // use lists are correctly updated. | 1882 // use lists are correctly updated. |
1859 SetOperandAt(values_.length() - 1, value); | 1883 SetOperandAt(values_.length() - 1, value); |
1860 } | 1884 } |
1861 BailoutId ast_id_; | 1885 BailoutId ast_id_; |
1862 int pop_count_; | 1886 int pop_count_; |
1863 ZoneList<HValue*> values_; | 1887 ZoneList<HValue*> values_; |
1864 ZoneList<int> assigned_indexes_; | 1888 ZoneList<int> assigned_indexes_; |
1865 Zone* zone_; | 1889 Zone* zone_; |
1866 RemovableSimulate removable_; | 1890 RemovableSimulate removable_; |
| 1891 |
| 1892 #ifdef DEBUG |
| 1893 Handle<JSFunction> closure_; |
| 1894 #endif |
1867 }; | 1895 }; |
1868 | 1896 |
1869 | 1897 |
| 1898 class HEnvironmentMarker: public HTemplateInstruction<1> { |
| 1899 public: |
| 1900 enum Kind { BIND, LOOKUP }; |
| 1901 |
| 1902 HEnvironmentMarker(Kind kind, int index) |
| 1903 : kind_(kind), index_(index), next_simulate_(NULL) { } |
| 1904 |
| 1905 Kind kind() { return kind_; } |
| 1906 int index() { return index_; } |
| 1907 HSimulate* next_simulate() { return next_simulate_; } |
| 1908 void set_next_simulate(HSimulate* simulate) { |
| 1909 next_simulate_ = simulate; |
| 1910 } |
| 1911 |
| 1912 virtual Representation RequiredInputRepresentation(int index) { |
| 1913 return Representation::None(); |
| 1914 } |
| 1915 |
| 1916 virtual void PrintDataTo(StringStream* stream); |
| 1917 |
| 1918 #ifdef DEBUG |
| 1919 void set_closure(Handle<JSFunction> closure) { |
| 1920 ASSERT(closure_.is_null()); |
| 1921 ASSERT(!closure.is_null()); |
| 1922 closure_ = closure; |
| 1923 } |
| 1924 Handle<JSFunction> closure() const { return closure_; } |
| 1925 #endif |
| 1926 |
| 1927 DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker); |
| 1928 |
| 1929 private: |
| 1930 Kind kind_; |
| 1931 int index_; |
| 1932 HSimulate* next_simulate_; |
| 1933 |
| 1934 #ifdef DEBUG |
| 1935 Handle<JSFunction> closure_; |
| 1936 #endif |
| 1937 }; |
| 1938 |
| 1939 |
1870 class HStackCheck: public HTemplateInstruction<1> { | 1940 class HStackCheck: public HTemplateInstruction<1> { |
1871 public: | 1941 public: |
1872 enum Type { | 1942 enum Type { |
1873 kFunctionEntry, | 1943 kFunctionEntry, |
1874 kBackwardsBranch | 1944 kBackwardsBranch |
1875 }; | 1945 }; |
1876 | 1946 |
1877 HStackCheck(HValue* context, Type type) : type_(type) { | 1947 HStackCheck(HValue* context, Type type) : type_(type) { |
1878 SetOperandAt(0, context); | 1948 SetOperandAt(0, context); |
1879 SetGVNFlag(kChangesNewSpacePromotion); | 1949 SetGVNFlag(kChangesNewSpacePromotion); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1913 | 1983 |
1914 | 1984 |
1915 class HEnterInlined: public HTemplateInstruction<0> { | 1985 class HEnterInlined: public HTemplateInstruction<0> { |
1916 public: | 1986 public: |
1917 HEnterInlined(Handle<JSFunction> closure, | 1987 HEnterInlined(Handle<JSFunction> closure, |
1918 int arguments_count, | 1988 int arguments_count, |
1919 FunctionLiteral* function, | 1989 FunctionLiteral* function, |
1920 InliningKind inlining_kind, | 1990 InliningKind inlining_kind, |
1921 Variable* arguments_var, | 1991 Variable* arguments_var, |
1922 ZoneList<HValue*>* arguments_values, | 1992 ZoneList<HValue*>* arguments_values, |
1923 bool undefined_receiver) | 1993 bool undefined_receiver, |
| 1994 Zone* zone) |
1924 : closure_(closure), | 1995 : closure_(closure), |
1925 arguments_count_(arguments_count), | 1996 arguments_count_(arguments_count), |
1926 arguments_pushed_(false), | 1997 arguments_pushed_(false), |
1927 function_(function), | 1998 function_(function), |
1928 inlining_kind_(inlining_kind), | 1999 inlining_kind_(inlining_kind), |
1929 arguments_var_(arguments_var), | 2000 arguments_var_(arguments_var), |
1930 arguments_values_(arguments_values), | 2001 arguments_values_(arguments_values), |
1931 undefined_receiver_(undefined_receiver) { | 2002 undefined_receiver_(undefined_receiver), |
| 2003 return_targets_(2, zone) { |
1932 } | 2004 } |
1933 | 2005 |
| 2006 void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); |
| 2007 ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } |
| 2008 |
1934 virtual void PrintDataTo(StringStream* stream); | 2009 virtual void PrintDataTo(StringStream* stream); |
1935 | 2010 |
1936 Handle<JSFunction> closure() const { return closure_; } | 2011 Handle<JSFunction> closure() const { return closure_; } |
1937 int arguments_count() const { return arguments_count_; } | 2012 int arguments_count() const { return arguments_count_; } |
1938 bool arguments_pushed() const { return arguments_pushed_; } | 2013 bool arguments_pushed() const { return arguments_pushed_; } |
1939 void set_arguments_pushed() { arguments_pushed_ = true; } | 2014 void set_arguments_pushed() { arguments_pushed_ = true; } |
1940 FunctionLiteral* function() const { return function_; } | 2015 FunctionLiteral* function() const { return function_; } |
1941 InliningKind inlining_kind() const { return inlining_kind_; } | 2016 InliningKind inlining_kind() const { return inlining_kind_; } |
1942 bool undefined_receiver() const { return undefined_receiver_; } | 2017 bool undefined_receiver() const { return undefined_receiver_; } |
1943 | 2018 |
1944 virtual Representation RequiredInputRepresentation(int index) { | 2019 virtual Representation RequiredInputRepresentation(int index) { |
1945 return Representation::None(); | 2020 return Representation::None(); |
1946 } | 2021 } |
1947 | 2022 |
1948 Variable* arguments_var() { return arguments_var_; } | 2023 Variable* arguments_var() { return arguments_var_; } |
1949 ZoneList<HValue*>* arguments_values() { return arguments_values_; } | 2024 ZoneList<HValue*>* arguments_values() { return arguments_values_; } |
1950 | 2025 |
1951 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) | 2026 DECLARE_CONCRETE_INSTRUCTION(EnterInlined) |
1952 | 2027 |
1953 private: | 2028 private: |
1954 Handle<JSFunction> closure_; | 2029 Handle<JSFunction> closure_; |
1955 int arguments_count_; | 2030 int arguments_count_; |
1956 bool arguments_pushed_; | 2031 bool arguments_pushed_; |
1957 FunctionLiteral* function_; | 2032 FunctionLiteral* function_; |
1958 InliningKind inlining_kind_; | 2033 InliningKind inlining_kind_; |
1959 Variable* arguments_var_; | 2034 Variable* arguments_var_; |
1960 ZoneList<HValue*>* arguments_values_; | 2035 ZoneList<HValue*>* arguments_values_; |
1961 bool undefined_receiver_; | 2036 bool undefined_receiver_; |
| 2037 ZoneList<HBasicBlock*> return_targets_; |
1962 }; | 2038 }; |
1963 | 2039 |
1964 | 2040 |
1965 class HLeaveInlined: public HTemplateInstruction<0> { | 2041 class HLeaveInlined: public HTemplateInstruction<0> { |
1966 public: | 2042 public: |
1967 HLeaveInlined() { } | 2043 HLeaveInlined() { } |
1968 | 2044 |
1969 virtual Representation RequiredInputRepresentation(int index) { | 2045 virtual Representation RequiredInputRepresentation(int index) { |
1970 return Representation::None(); | 2046 return Representation::None(); |
1971 } | 2047 } |
(...skipping 4489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6461 virtual bool IsDeletable() const { return true; } | 6537 virtual bool IsDeletable() const { return true; } |
6462 }; | 6538 }; |
6463 | 6539 |
6464 | 6540 |
6465 #undef DECLARE_INSTRUCTION | 6541 #undef DECLARE_INSTRUCTION |
6466 #undef DECLARE_CONCRETE_INSTRUCTION | 6542 #undef DECLARE_CONCRETE_INSTRUCTION |
6467 | 6543 |
6468 } } // namespace v8::internal | 6544 } } // namespace v8::internal |
6469 | 6545 |
6470 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 6546 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |