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

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 2789943002: Reland "VM: Handle null-comparisons in the flow graph type propagation" (Closed)
Patch Set: addressed comments Created 3 years, 8 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
« no previous file with comments | « runtime/vm/flow_graph_type_propagator.cc ('k') | runtime/vm/intermediate_language.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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 bool IsAssignableTo(const AbstractType& type) { 97 bool IsAssignableTo(const AbstractType& type) {
98 bool is_instance; 98 bool is_instance;
99 return CanComputeIsInstanceOf(type, kNullable, &is_instance) && is_instance; 99 return CanComputeIsInstanceOf(type, kNullable, &is_instance) && is_instance;
100 } 100 }
101 101
102 // Create a new CompileType representing given combination of class id and 102 // Create a new CompileType representing given combination of class id and
103 // abstract type. The pair is assumed to be coherent. 103 // abstract type. The pair is assumed to be coherent.
104 static CompileType Create(intptr_t cid, const AbstractType& type); 104 static CompileType Create(intptr_t cid, const AbstractType& type);
105 105
106 CompileType CopyNonNullable() const { 106 CompileType CopyNonNullable() const {
107 return CompileType(kNonNullable, cid_, type_); 107 return CompileType(kNonNullable, kIllegalCid, type_);
108 } 108 }
109 109
110 static CompileType CreateNullable(bool is_nullable, intptr_t cid) { 110 static CompileType CreateNullable(bool is_nullable, intptr_t cid) {
111 return CompileType(is_nullable, cid, NULL); 111 return CompileType(is_nullable, cid, NULL);
112 } 112 }
113 113
114 // Create a new CompileType representing given abstract type. By default 114 // Create a new CompileType representing given abstract type. By default
115 // values as assumed to be nullable. 115 // values as assumed to be nullable.
116 static CompileType FromAbstractType(const AbstractType& type, 116 static CompileType FromAbstractType(const AbstractType& type,
117 bool is_nullable = kNullable); 117 bool is_nullable = kNullable);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 // Returns true if this and other types are the same. 150 // Returns true if this and other types are the same.
151 bool IsEqualTo(CompileType* other) { 151 bool IsEqualTo(CompileType* other) {
152 return (is_nullable_ == other->is_nullable_) && 152 return (is_nullable_ == other->is_nullable_) &&
153 (ToNullableCid() == other->ToNullableCid()) && 153 (ToNullableCid() == other->ToNullableCid()) &&
154 (ToAbstractType()->Equals(*other->ToAbstractType())); 154 (ToAbstractType()->Equals(*other->ToAbstractType()));
155 } 155 }
156 156
157 bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); } 157 bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); }
158 158
159 bool IsInt() { 159 bool IsInt() {
160 return !is_nullable() && ((ToCid() == kSmiCid) || (ToCid() == kMintCid) || 160 return !is_nullable() &&
161 ((type_ != NULL) && 161 ((ToCid() == kSmiCid) || (ToCid() == kMintCid) ||
162 (type_->Equals(Type::Handle(Type::IntType()))))); 162 ((type_ != NULL) &&
163 (type_->Equals(Type::Handle(Type::Int64Type())))));
163 } 164 }
164 165
165 void PrintTo(BufferFormatter* f) const; 166 void PrintTo(BufferFormatter* f) const;
166 const char* ToCString() const; 167 const char* ToCString() const;
167 168
168 private: 169 private:
169 bool CanComputeIsInstanceOf(const AbstractType& type, 170 bool CanComputeIsInstanceOf(const AbstractType& type,
170 bool is_nullable, 171 bool is_nullable,
171 bool* is_instance); 172 bool* is_instance);
172 173
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 next_(NULL), 561 next_(NULL),
561 env_(NULL), 562 env_(NULL),
562 locs_(NULL), 563 locs_(NULL),
563 inlining_id_(-1) {} 564 inlining_id_(-1) {}
564 565
565 virtual ~Instruction() {} 566 virtual ~Instruction() {}
566 567
567 virtual Tag tag() const = 0; 568 virtual Tag tag() const = 0;
568 569
569 intptr_t deopt_id() const { 570 intptr_t deopt_id() const {
570 ASSERT(CanDeoptimize() || CanBecomeDeoptimizationTarget()); 571 ASSERT(ComputeCanDeoptimize() || CanBecomeDeoptimizationTarget());
571 return GetDeoptId(); 572 return GetDeoptId();
572 } 573 }
573 574
574 const ICData* GetICData( 575 const ICData* GetICData(
575 const ZoneGrowableArray<const ICData*>& ic_data_array) const; 576 const ZoneGrowableArray<const ICData*>& ic_data_array) const;
576 577
577 virtual TokenPosition token_pos() const { return TokenPosition::kNoSource; } 578 virtual TokenPosition token_pos() const { return TokenPosition::kNoSource; }
578 579
579 virtual intptr_t InputCount() const = 0; 580 virtual intptr_t InputCount() const = 0;
580 virtual Value* InputAt(intptr_t i) const = 0; 581 virtual Value* InputAt(intptr_t i) const = 0;
(...skipping 10 matching lines...) Expand all
591 592
592 // Call instructions override this function and return the number of 593 // Call instructions override this function and return the number of
593 // pushed arguments. 594 // pushed arguments.
594 virtual intptr_t ArgumentCount() const { return 0; } 595 virtual intptr_t ArgumentCount() const { return 0; }
595 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 596 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
596 UNREACHABLE(); 597 UNREACHABLE();
597 return NULL; 598 return NULL;
598 } 599 }
599 inline Definition* ArgumentAt(intptr_t index) const; 600 inline Definition* ArgumentAt(intptr_t index) const;
600 601
601 // Returns true, if this instruction can deoptimize. 602 // Returns true, if this instruction can deoptimize with its current imputs.
602 virtual bool CanDeoptimize() const = 0; 603 // This property can change if we add or remove redefinitions that constrain
604 // the type or the range of input operands during compilation.
605 virtual bool ComputeCanDeoptimize() const = 0;
606
607 // Once we removed the deopt environment, we assume that this
608 // instruction can't deoptimize.
609 bool CanDeoptimize() const { return env() != NULL && ComputeCanDeoptimize(); }
603 610
604 // Visiting support. 611 // Visiting support.
605 virtual void Accept(FlowGraphVisitor* visitor) = 0; 612 virtual void Accept(FlowGraphVisitor* visitor) = 0;
606 613
607 Instruction* previous() const { return previous_; } 614 Instruction* previous() const { return previous_; }
608 void set_previous(Instruction* instr) { 615 void set_previous(Instruction* instr) {
609 ASSERT(!IsBlockEntry()); 616 ASSERT(!IsBlockEntry());
610 previous_ = instr; 617 previous_ = instr;
611 } 618 }
612 619
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 void InsertBefore(Instruction* next) { InsertAfter(next->previous()); } 742 void InsertBefore(Instruction* next) { InsertAfter(next->previous()); }
736 743
737 // Insert this instruction after 'prev' after use lists are computed. 744 // Insert this instruction after 'prev' after use lists are computed.
738 void InsertAfter(Instruction* prev); 745 void InsertAfter(Instruction* prev);
739 746
740 // Append an instruction to the current one and return the tail. 747 // Append an instruction to the current one and return the tail.
741 // This function updated def-use chains of the newly appended 748 // This function updated def-use chains of the newly appended
742 // instruction. 749 // instruction.
743 Instruction* AppendInstruction(Instruction* tail); 750 Instruction* AppendInstruction(Instruction* tail);
744 751
745 virtual bool AllowsDCE() const { return false; }
746
747 // Returns true if CSE and LICM are allowed for this instruction. 752 // Returns true if CSE and LICM are allowed for this instruction.
748 virtual bool AllowsCSE() const { return false; } 753 virtual bool AllowsCSE() const { return false; }
749 754
750 // Returns set of effects created by this instruction. 755 // Returns set of effects created by this instruction.
751 virtual EffectSet Effects() const = 0; 756 virtual EffectSet Effects() const = 0;
752 757
753 // Returns set of effects that affect this instruction. 758 // Returns set of effects that affect this instruction.
754 virtual EffectSet Dependencies() const { 759 virtual EffectSet Dependencies() const {
755 UNREACHABLE(); 760 UNREACHABLE();
756 return EffectSet::All(); 761 return EffectSet::All();
(...skipping 27 matching lines...) Expand all
784 // All instructions that participate in CSE have to override this function. 789 // All instructions that participate in CSE have to override this function.
785 // This function can assume that the argument has the same type as this. 790 // This function can assume that the argument has the same type as this.
786 virtual bool AttributesEqual(Instruction* other) const { 791 virtual bool AttributesEqual(Instruction* other) const {
787 UNREACHABLE(); 792 UNREACHABLE();
788 return false; 793 return false;
789 } 794 }
790 795
791 virtual void InheritDeoptTarget(Zone* zone, Instruction* other); 796 virtual void InheritDeoptTarget(Zone* zone, Instruction* other);
792 797
793 bool NeedsEnvironment() const { 798 bool NeedsEnvironment() const {
794 return CanDeoptimize() || CanBecomeDeoptimizationTarget(); 799 return ComputeCanDeoptimize() || CanBecomeDeoptimizationTarget();
795 } 800 }
796 801
797 virtual bool CanBecomeDeoptimizationTarget() const { return false; } 802 virtual bool CanBecomeDeoptimizationTarget() const { return false; }
798 803
799 void InheritDeoptTargetAfter(FlowGraph* flow_graph, 804 void InheritDeoptTargetAfter(FlowGraph* flow_graph,
800 Definition* call, 805 Definition* call,
801 Definition* result); 806 Definition* result);
802 807
803 virtual bool MayThrow() const = 0; 808 virtual bool MayThrow() const = 0;
804 809
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 970
966 971
967 class ParallelMoveInstr : public TemplateInstruction<0, NoThrow> { 972 class ParallelMoveInstr : public TemplateInstruction<0, NoThrow> {
968 public: 973 public:
969 ParallelMoveInstr() : moves_(4) {} 974 ParallelMoveInstr() : moves_(4) {}
970 975
971 DECLARE_INSTRUCTION(ParallelMove) 976 DECLARE_INSTRUCTION(ParallelMove)
972 977
973 virtual intptr_t ArgumentCount() const { return 0; } 978 virtual intptr_t ArgumentCount() const { return 0; }
974 979
975 virtual bool CanDeoptimize() const { return false; } 980 virtual bool ComputeCanDeoptimize() const { return false; }
976 981
977 virtual EffectSet Effects() const { 982 virtual EffectSet Effects() const {
978 UNREACHABLE(); // This instruction never visited by optimization passes. 983 UNREACHABLE(); // This instruction never visited by optimization passes.
979 return EffectSet::None(); 984 return EffectSet::None();
980 } 985 }
981 986
982 virtual EffectSet Dependencies() const { 987 virtual EffectSet Dependencies() const {
983 UNREACHABLE(); // This instruction never visited by optimization passes. 988 UNREACHABLE(); // This instruction never visited by optimization passes.
984 return EffectSet::None(); 989 return EffectSet::None();
985 } 990 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 } 1102 }
1098 1103
1099 virtual intptr_t ArgumentCount() const { return 0; } 1104 virtual intptr_t ArgumentCount() const { return 0; }
1100 1105
1101 virtual bool CanBecomeDeoptimizationTarget() const { 1106 virtual bool CanBecomeDeoptimizationTarget() const {
1102 // BlockEntry environment is copied to Goto and Branch instructions 1107 // BlockEntry environment is copied to Goto and Branch instructions
1103 // when we insert new blocks targeting this block. 1108 // when we insert new blocks targeting this block.
1104 return true; 1109 return true;
1105 } 1110 }
1106 1111
1107 virtual bool CanDeoptimize() const { return false; } 1112 virtual bool ComputeCanDeoptimize() const { return false; }
1108 1113
1109 virtual EffectSet Effects() const { return EffectSet::None(); } 1114 virtual EffectSet Effects() const { return EffectSet::None(); }
1110 virtual EffectSet Dependencies() const { return EffectSet::None(); } 1115 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1111 1116
1112 virtual bool MayThrow() const { return false; } 1117 virtual bool MayThrow() const { return false; }
1113 1118
1114 intptr_t try_index() const { return try_index_; } 1119 intptr_t try_index() const { return try_index_; }
1115 void set_try_index(intptr_t index) { try_index_ = index; } 1120 void set_try_index(intptr_t index) { try_index_ = index; }
1116 1121
1117 // True for blocks inside a try { } region. 1122 // True for blocks inside a try { } region.
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 virtual BlockEntryInstr* GetBlock() { return block(); } 1835 virtual BlockEntryInstr* GetBlock() { return block(); }
1831 JoinEntryInstr* block() const { return block_; } 1836 JoinEntryInstr* block() const { return block_; }
1832 1837
1833 virtual CompileType ComputeType() const; 1838 virtual CompileType ComputeType() const;
1834 virtual bool RecomputeType(); 1839 virtual bool RecomputeType();
1835 1840
1836 intptr_t InputCount() const { return inputs_.length(); } 1841 intptr_t InputCount() const { return inputs_.length(); }
1837 1842
1838 Value* InputAt(intptr_t i) const { return inputs_[i]; } 1843 Value* InputAt(intptr_t i) const { return inputs_[i]; }
1839 1844
1840 virtual bool CanDeoptimize() const { return false; } 1845 virtual bool ComputeCanDeoptimize() const { return false; }
1841 1846
1842 virtual EffectSet Effects() const { return EffectSet::None(); } 1847 virtual EffectSet Effects() const { return EffectSet::None(); }
1843 1848
1844 // Phi is alive if it reaches a non-environment use. 1849 // Phi is alive if it reaches a non-environment use.
1845 bool is_alive() const { return is_alive_; } 1850 bool is_alive() const { return is_alive_; }
1846 void mark_alive() { is_alive_ = true; } 1851 void mark_alive() { is_alive_ = true; }
1847 void mark_dead() { is_alive_ = false; } 1852 void mark_dead() { is_alive_ = false; }
1848 1853
1849 virtual Representation RequiredInputRepresentation(intptr_t i) const { 1854 virtual Representation RequiredInputRepresentation(intptr_t i) const {
1850 return representation_; 1855 return representation_;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 1930
1926 // Get the block entry for that instruction. 1931 // Get the block entry for that instruction.
1927 virtual BlockEntryInstr* GetBlock() { return block_; } 1932 virtual BlockEntryInstr* GetBlock() { return block_; }
1928 1933
1929 intptr_t InputCount() const { return 0; } 1934 intptr_t InputCount() const { return 0; }
1930 Value* InputAt(intptr_t i) const { 1935 Value* InputAt(intptr_t i) const {
1931 UNREACHABLE(); 1936 UNREACHABLE();
1932 return NULL; 1937 return NULL;
1933 } 1938 }
1934 1939
1935 virtual bool CanDeoptimize() const { return false; } 1940 virtual bool ComputeCanDeoptimize() const { return false; }
1936 1941
1937 virtual EffectSet Effects() const { return EffectSet::None(); } 1942 virtual EffectSet Effects() const { return EffectSet::None(); }
1938 virtual EffectSet Dependencies() const { return EffectSet::None(); } 1943 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1939 1944
1940 virtual intptr_t Hashcode() const { 1945 virtual intptr_t Hashcode() const {
1941 UNREACHABLE(); 1946 UNREACHABLE();
1942 return 0; 1947 return 0;
1943 } 1948 }
1944 1949
1945 virtual CompileType ComputeType() const; 1950 virtual CompileType ComputeType() const;
(...skipping 16 matching lines...) Expand all
1962 class PushArgumentInstr : public TemplateDefinition<1, NoThrow> { 1967 class PushArgumentInstr : public TemplateDefinition<1, NoThrow> {
1963 public: 1968 public:
1964 explicit PushArgumentInstr(Value* value) { SetInputAt(0, value); } 1969 explicit PushArgumentInstr(Value* value) { SetInputAt(0, value); }
1965 1970
1966 DECLARE_INSTRUCTION(PushArgument) 1971 DECLARE_INSTRUCTION(PushArgument)
1967 1972
1968 virtual CompileType ComputeType() const; 1973 virtual CompileType ComputeType() const;
1969 1974
1970 Value* value() const { return InputAt(0); } 1975 Value* value() const { return InputAt(0); }
1971 1976
1972 virtual bool CanDeoptimize() const { return false; } 1977 virtual bool ComputeCanDeoptimize() const { return false; }
1973 1978
1974 virtual EffectSet Effects() const { return EffectSet::None(); } 1979 virtual EffectSet Effects() const { return EffectSet::None(); }
1975 1980
1976 virtual TokenPosition token_pos() const { 1981 virtual TokenPosition token_pos() const {
1977 return TokenPosition::kPushArgument; 1982 return TokenPosition::kPushArgument;
1978 } 1983 }
1979 1984
1980 PRINT_OPERANDS_TO_SUPPORT 1985 PRINT_OPERANDS_TO_SUPPORT
1981 1986
1982 private: 1987 private:
(...skipping 18 matching lines...) Expand all
2001 2006
2002 virtual TokenPosition token_pos() const { return token_pos_; } 2007 virtual TokenPosition token_pos() const { return token_pos_; }
2003 Value* value() const { return inputs_[0]; } 2008 Value* value() const { return inputs_[0]; }
2004 2009
2005 virtual bool CanBecomeDeoptimizationTarget() const { 2010 virtual bool CanBecomeDeoptimizationTarget() const {
2006 // Return instruction might turn into a Goto instruction after inlining. 2011 // Return instruction might turn into a Goto instruction after inlining.
2007 // Every Goto must have an environment. 2012 // Every Goto must have an environment.
2008 return true; 2013 return true;
2009 } 2014 }
2010 2015
2011 virtual bool CanDeoptimize() const { return false; } 2016 virtual bool ComputeCanDeoptimize() const { return false; }
2012 2017
2013 virtual EffectSet Effects() const { return EffectSet::None(); } 2018 virtual EffectSet Effects() const { return EffectSet::None(); }
2014 2019
2015 private: 2020 private:
2016 const TokenPosition token_pos_; 2021 const TokenPosition token_pos_;
2017 2022
2018 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); 2023 DISALLOW_COPY_AND_ASSIGN(ReturnInstr);
2019 }; 2024 };
2020 2025
2021 2026
2022 class ThrowInstr : public TemplateInstruction<0, Throws> { 2027 class ThrowInstr : public TemplateInstruction<0, Throws> {
2023 public: 2028 public:
2024 explicit ThrowInstr(TokenPosition token_pos) 2029 explicit ThrowInstr(TokenPosition token_pos)
2025 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 2030 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
2026 token_pos_(token_pos) {} 2031 token_pos_(token_pos) {}
2027 2032
2028 DECLARE_INSTRUCTION(Throw) 2033 DECLARE_INSTRUCTION(Throw)
2029 2034
2030 virtual intptr_t ArgumentCount() const { return 1; } 2035 virtual intptr_t ArgumentCount() const { return 1; }
2031 2036
2032 virtual TokenPosition token_pos() const { return token_pos_; } 2037 virtual TokenPosition token_pos() const { return token_pos_; }
2033 2038
2034 virtual bool CanDeoptimize() const { return true; } 2039 virtual bool ComputeCanDeoptimize() const { return true; }
2035 2040
2036 virtual EffectSet Effects() const { return EffectSet::None(); } 2041 virtual EffectSet Effects() const { return EffectSet::None(); }
2037 2042
2038 private: 2043 private:
2039 const TokenPosition token_pos_; 2044 const TokenPosition token_pos_;
2040 2045
2041 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); 2046 DISALLOW_COPY_AND_ASSIGN(ThrowInstr);
2042 }; 2047 };
2043 2048
2044 2049
2045 class ReThrowInstr : public TemplateInstruction<0, Throws> { 2050 class ReThrowInstr : public TemplateInstruction<0, Throws> {
2046 public: 2051 public:
2047 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the 2052 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the
2048 // rethrow has been artifically generated by the parser. 2053 // rethrow has been artifically generated by the parser.
2049 ReThrowInstr(TokenPosition token_pos, intptr_t catch_try_index) 2054 ReThrowInstr(TokenPosition token_pos, intptr_t catch_try_index)
2050 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 2055 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
2051 token_pos_(token_pos), 2056 token_pos_(token_pos),
2052 catch_try_index_(catch_try_index) {} 2057 catch_try_index_(catch_try_index) {}
2053 2058
2054 DECLARE_INSTRUCTION(ReThrow) 2059 DECLARE_INSTRUCTION(ReThrow)
2055 2060
2056 virtual intptr_t ArgumentCount() const { return 2; } 2061 virtual intptr_t ArgumentCount() const { return 2; }
2057 2062
2058 virtual TokenPosition token_pos() const { return token_pos_; } 2063 virtual TokenPosition token_pos() const { return token_pos_; }
2059 intptr_t catch_try_index() const { return catch_try_index_; } 2064 intptr_t catch_try_index() const { return catch_try_index_; }
2060 2065
2061 virtual bool CanDeoptimize() const { return true; } 2066 virtual bool ComputeCanDeoptimize() const { return true; }
2062 2067
2063 virtual EffectSet Effects() const { return EffectSet::None(); } 2068 virtual EffectSet Effects() const { return EffectSet::None(); }
2064 2069
2065 private: 2070 private:
2066 const TokenPosition token_pos_; 2071 const TokenPosition token_pos_;
2067 const intptr_t catch_try_index_; 2072 const intptr_t catch_try_index_;
2068 2073
2069 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr); 2074 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr);
2070 }; 2075 };
2071 2076
2072 2077
2073 class StopInstr : public TemplateInstruction<0, NoThrow> { 2078 class StopInstr : public TemplateInstruction<0, NoThrow> {
2074 public: 2079 public:
2075 explicit StopInstr(const char* message) : message_(message) { 2080 explicit StopInstr(const char* message) : message_(message) {
2076 ASSERT(message != NULL); 2081 ASSERT(message != NULL);
2077 } 2082 }
2078 2083
2079 const char* message() const { return message_; } 2084 const char* message() const { return message_; }
2080 2085
2081 DECLARE_INSTRUCTION(Stop); 2086 DECLARE_INSTRUCTION(Stop);
2082 2087
2083 virtual intptr_t ArgumentCount() const { return 0; } 2088 virtual intptr_t ArgumentCount() const { return 0; }
2084 2089
2085 virtual bool CanDeoptimize() const { return false; } 2090 virtual bool ComputeCanDeoptimize() const { return false; }
2086 2091
2087 virtual EffectSet Effects() const { return EffectSet::None(); } 2092 virtual EffectSet Effects() const { return EffectSet::None(); }
2088 2093
2089 virtual EffectSet Dependencies() const { return EffectSet::None(); } 2094 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2090 2095
2091 private: 2096 private:
2092 const char* message_; 2097 const char* message_;
2093 2098
2094 DISALLOW_COPY_AND_ASSIGN(StopInstr); 2099 DISALLOW_COPY_AND_ASSIGN(StopInstr);
2095 }; 2100 };
(...skipping 21 matching lines...) Expand all
2117 double edge_weight() const { return edge_weight_; } 2122 double edge_weight() const { return edge_weight_; }
2118 void set_edge_weight(double weight) { edge_weight_ = weight; } 2123 void set_edge_weight(double weight) { edge_weight_ = weight; }
2119 void adjust_edge_weight(double scale_factor) { edge_weight_ *= scale_factor; } 2124 void adjust_edge_weight(double scale_factor) { edge_weight_ *= scale_factor; }
2120 2125
2121 virtual bool CanBecomeDeoptimizationTarget() const { 2126 virtual bool CanBecomeDeoptimizationTarget() const {
2122 // Goto instruction can be used as a deoptimization target when LICM 2127 // Goto instruction can be used as a deoptimization target when LICM
2123 // hoists instructions out of the loop. 2128 // hoists instructions out of the loop.
2124 return true; 2129 return true;
2125 } 2130 }
2126 2131
2127 virtual bool CanDeoptimize() const { return false; } 2132 virtual bool ComputeCanDeoptimize() const { return false; }
2128 2133
2129 virtual EffectSet Effects() const { return EffectSet::None(); } 2134 virtual EffectSet Effects() const { return EffectSet::None(); }
2130 2135
2131 ParallelMoveInstr* parallel_move() const { return parallel_move_; } 2136 ParallelMoveInstr* parallel_move() const { return parallel_move_; }
2132 2137
2133 bool HasParallelMove() const { return parallel_move_ != NULL; } 2138 bool HasParallelMove() const { return parallel_move_ != NULL; }
2134 2139
2135 bool HasNonRedundantParallelMove() const { 2140 bool HasNonRedundantParallelMove() const {
2136 return HasParallelMove() && !parallel_move()->IsRedundant(); 2141 return HasParallelMove() && !parallel_move()->IsRedundant();
2137 } 2142 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2193 ASSERT(successor->next()->AsGoto()->successor()->IsIndirectEntry()); 2198 ASSERT(successor->next()->AsGoto()->successor()->IsIndirectEntry());
2194 successors_.Add(successor); 2199 successors_.Add(successor);
2195 } 2200 }
2196 2201
2197 virtual intptr_t SuccessorCount() const { return successors_.length(); } 2202 virtual intptr_t SuccessorCount() const { return successors_.length(); }
2198 virtual TargetEntryInstr* SuccessorAt(intptr_t index) const { 2203 virtual TargetEntryInstr* SuccessorAt(intptr_t index) const {
2199 ASSERT(index < SuccessorCount()); 2204 ASSERT(index < SuccessorCount());
2200 return successors_[index]; 2205 return successors_[index];
2201 } 2206 }
2202 2207
2203 virtual bool CanDeoptimize() const { return false; } 2208 virtual bool ComputeCanDeoptimize() const { return false; }
2204 virtual bool CanBecomeDeoptimizationTarget() const { return false; } 2209 virtual bool CanBecomeDeoptimizationTarget() const { return false; }
2205 2210
2206 virtual EffectSet Effects() const { return EffectSet::None(); } 2211 virtual EffectSet Effects() const { return EffectSet::None(); }
2207 2212
2208 Value* offset() const { return inputs_[0]; } 2213 Value* offset() const { return inputs_[0]; }
2209 void ComputeOffsetTable(); 2214 void ComputeOffsetTable();
2210 2215
2211 PRINT_TO_SUPPORT 2216 PRINT_TO_SUPPORT
2212 2217
2213 private: 2218 private:
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 virtual intptr_t ArgumentCount() const { 2331 virtual intptr_t ArgumentCount() const {
2327 return comparison()->ArgumentCount(); 2332 return comparison()->ArgumentCount();
2328 } 2333 }
2329 2334
2330 intptr_t InputCount() const { return comparison()->InputCount(); } 2335 intptr_t InputCount() const { return comparison()->InputCount(); }
2331 2336
2332 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); } 2337 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
2333 2338
2334 virtual TokenPosition token_pos() const { return comparison_->token_pos(); } 2339 virtual TokenPosition token_pos() const { return comparison_->token_pos(); }
2335 2340
2336 virtual bool CanDeoptimize() const { return comparison()->CanDeoptimize(); } 2341 virtual bool ComputeCanDeoptimize() const {
2342 return comparison()->ComputeCanDeoptimize();
2343 }
2337 2344
2338 virtual bool CanBecomeDeoptimizationTarget() const { 2345 virtual bool CanBecomeDeoptimizationTarget() const {
2339 return comparison()->CanBecomeDeoptimizationTarget(); 2346 return comparison()->CanBecomeDeoptimizationTarget();
2340 } 2347 }
2341 2348
2342 virtual EffectSet Effects() const { return comparison()->Effects(); } 2349 virtual EffectSet Effects() const { return comparison()->Effects(); }
2343 2350
2344 ComparisonInstr* comparison() const { return comparison_; } 2351 ComparisonInstr* comparison() const { return comparison_; }
2345 void SetComparison(ComparisonInstr* comp); 2352 void SetComparison(ComparisonInstr* comp);
2346 2353
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2387 2394
2388 DISALLOW_COPY_AND_ASSIGN(BranchInstr); 2395 DISALLOW_COPY_AND_ASSIGN(BranchInstr);
2389 }; 2396 };
2390 2397
2391 2398
2392 class DeoptimizeInstr : public TemplateInstruction<0, NoThrow, Pure> { 2399 class DeoptimizeInstr : public TemplateInstruction<0, NoThrow, Pure> {
2393 public: 2400 public:
2394 DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id) 2401 DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id)
2395 : TemplateInstruction(deopt_id), deopt_reason_(deopt_reason) {} 2402 : TemplateInstruction(deopt_id), deopt_reason_(deopt_reason) {}
2396 2403
2397 virtual bool CanDeoptimize() const { return true; } 2404 virtual bool ComputeCanDeoptimize() const { return true; }
2398 2405
2399 virtual bool AttributesEqual(Instruction* other) const { return true; } 2406 virtual bool AttributesEqual(Instruction* other) const { return true; }
2400 2407
2401 DECLARE_INSTRUCTION(Deoptimize) 2408 DECLARE_INSTRUCTION(Deoptimize)
2402 2409
2403 private: 2410 private:
2404 const ICData::DeoptReasonId deopt_reason_; 2411 const ICData::DeoptReasonId deopt_reason_;
2405 2412
2406 DISALLOW_COPY_AND_ASSIGN(DeoptimizeInstr); 2413 DISALLOW_COPY_AND_ASSIGN(DeoptimizeInstr);
2407 }; 2414 };
(...skipping 10 matching lines...) Expand all
2418 Value* value() const { return inputs_[0]; } 2425 Value* value() const { return inputs_[0]; }
2419 2426
2420 virtual CompileType ComputeType() const; 2427 virtual CompileType ComputeType() const;
2421 virtual bool RecomputeType(); 2428 virtual bool RecomputeType();
2422 2429
2423 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2430 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2424 2431
2425 void set_constrained_type(CompileType* type) { constrained_type_ = type; } 2432 void set_constrained_type(CompileType* type) { constrained_type_ = type; }
2426 CompileType* constrained_type() const { return constrained_type_; } 2433 CompileType* constrained_type() const { return constrained_type_; }
2427 2434
2428 virtual bool CanDeoptimize() const { return false; } 2435 virtual bool ComputeCanDeoptimize() const { return false; }
2429 virtual EffectSet Dependencies() const { return EffectSet::None(); } 2436 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2430 virtual EffectSet Effects() const { return EffectSet::None(); } 2437 virtual EffectSet Effects() const { return EffectSet::None(); }
2431 2438
2432 private: 2439 private:
2433 CompileType* constrained_type_; 2440 CompileType* constrained_type_;
2434 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr); 2441 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr);
2435 }; 2442 };
2436 2443
2437 2444
2438 class ConstraintInstr : public TemplateDefinition<1, NoThrow> { 2445 class ConstraintInstr : public TemplateDefinition<1, NoThrow> {
2439 public: 2446 public:
2440 ConstraintInstr(Value* value, Range* constraint) 2447 ConstraintInstr(Value* value, Range* constraint)
2441 : constraint_(constraint), target_(NULL) { 2448 : constraint_(constraint), target_(NULL) {
2442 SetInputAt(0, value); 2449 SetInputAt(0, value);
2443 } 2450 }
2444 2451
2445 DECLARE_INSTRUCTION(Constraint) 2452 DECLARE_INSTRUCTION(Constraint)
2446 2453
2447 virtual CompileType ComputeType() const; 2454 virtual CompileType ComputeType() const;
2448 2455
2449 virtual bool CanDeoptimize() const { return false; } 2456 virtual bool ComputeCanDeoptimize() const { return false; }
2450 2457
2451 virtual EffectSet Effects() const { return EffectSet::None(); } 2458 virtual EffectSet Effects() const { return EffectSet::None(); }
2452 2459
2453 virtual bool AttributesEqual(Instruction* other) const { 2460 virtual bool AttributesEqual(Instruction* other) const {
2454 UNREACHABLE(); 2461 UNREACHABLE();
2455 return false; 2462 return false;
2456 } 2463 }
2457 2464
2458 Value* value() const { return inputs_[0]; } 2465 Value* value() const { return inputs_[0]; }
2459 Range* constraint() const { return constraint_; } 2466 Range* constraint() const { return constraint_; }
(...skipping 21 matching lines...) Expand all
2481 ConstantInstr(const Object& value, 2488 ConstantInstr(const Object& value,
2482 TokenPosition token_pos = TokenPosition::kConstant); 2489 TokenPosition token_pos = TokenPosition::kConstant);
2483 2490
2484 DECLARE_INSTRUCTION(Constant) 2491 DECLARE_INSTRUCTION(Constant)
2485 virtual CompileType ComputeType() const; 2492 virtual CompileType ComputeType() const;
2486 2493
2487 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2494 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2488 2495
2489 const Object& value() const { return value_; } 2496 const Object& value() const { return value_; }
2490 2497
2491 virtual bool CanDeoptimize() const { return false; } 2498 virtual bool ComputeCanDeoptimize() const { return false; }
2492 2499
2493 virtual void InferRange(RangeAnalysis* analysis, Range* range); 2500 virtual void InferRange(RangeAnalysis* analysis, Range* range);
2494 2501
2495 virtual bool AttributesEqual(Instruction* other) const; 2502 virtual bool AttributesEqual(Instruction* other) const;
2496 2503
2497 virtual TokenPosition token_pos() const { return token_pos_; } 2504 virtual TokenPosition token_pos() const { return token_pos_; }
2498 2505
2499 PRINT_OPERANDS_TO_SUPPORT 2506 PRINT_OPERANDS_TO_SUPPORT
2500 2507
2501 private: 2508 private:
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2558 Value* instantiator_type_arguments() const { return inputs_[1]; } 2565 Value* instantiator_type_arguments() const { return inputs_[1]; }
2559 2566
2560 virtual TokenPosition token_pos() const { return token_pos_; } 2567 virtual TokenPosition token_pos() const { return token_pos_; }
2561 const AbstractType& dst_type() const { return dst_type_; } 2568 const AbstractType& dst_type() const { return dst_type_; }
2562 void set_dst_type(const AbstractType& dst_type) { 2569 void set_dst_type(const AbstractType& dst_type) {
2563 ASSERT(!dst_type.IsTypeRef()); 2570 ASSERT(!dst_type.IsTypeRef());
2564 dst_type_ = dst_type.raw(); 2571 dst_type_ = dst_type.raw();
2565 } 2572 }
2566 const String& dst_name() const { return dst_name_; } 2573 const String& dst_name() const { return dst_name_; }
2567 2574
2568 virtual bool CanDeoptimize() const { return true; } 2575 virtual bool ComputeCanDeoptimize() const { return true; }
2569 2576
2570 virtual bool CanBecomeDeoptimizationTarget() const { 2577 virtual bool CanBecomeDeoptimizationTarget() const {
2571 // AssertAssignable instructions that are specialized by the optimizer 2578 // AssertAssignable instructions that are specialized by the optimizer
2572 // (e.g. replaced with CheckClass) need a deoptimization descriptor before. 2579 // (e.g. replaced with CheckClass) need a deoptimization descriptor before.
2573 return true; 2580 return true;
2574 } 2581 }
2575 2582
2576 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2583 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2577 2584
2578 virtual bool AttributesEqual(Instruction* other) const; 2585 virtual bool AttributesEqual(Instruction* other) const;
(...skipping 16 matching lines...) Expand all
2595 token_pos_(token_pos) { 2602 token_pos_(token_pos) {
2596 SetInputAt(0, value); 2603 SetInputAt(0, value);
2597 } 2604 }
2598 2605
2599 DECLARE_INSTRUCTION(AssertBoolean) 2606 DECLARE_INSTRUCTION(AssertBoolean)
2600 virtual CompileType ComputeType() const; 2607 virtual CompileType ComputeType() const;
2601 2608
2602 virtual TokenPosition token_pos() const { return token_pos_; } 2609 virtual TokenPosition token_pos() const { return token_pos_; }
2603 Value* value() const { return inputs_[0]; } 2610 Value* value() const { return inputs_[0]; }
2604 2611
2605 virtual bool CanDeoptimize() const { return true; } 2612 virtual bool ComputeCanDeoptimize() const { return true; }
2606 2613
2607 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2614 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2608 2615
2609 virtual bool AttributesEqual(Instruction* other) const { return true; } 2616 virtual bool AttributesEqual(Instruction* other) const { return true; }
2610 2617
2611 PRINT_OPERANDS_TO_SUPPORT 2618 PRINT_OPERANDS_TO_SUPPORT
2612 2619
2613 private: 2620 private:
2614 const TokenPosition token_pos_; 2621 const TokenPosition token_pos_;
2615 2622
2616 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); 2623 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr);
2617 }; 2624 };
2618 2625
2619 2626
2620 // Denotes the current context, normally held in a register. This is 2627 // Denotes the current context, normally held in a register. This is
2621 // a computation, not a value, because it's mutable. 2628 // a computation, not a value, because it's mutable.
2622 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { 2629 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> {
2623 public: 2630 public:
2624 CurrentContextInstr() 2631 CurrentContextInstr()
2625 : TemplateDefinition(Thread::Current()->GetNextDeoptId()) {} 2632 : TemplateDefinition(Thread::Current()->GetNextDeoptId()) {}
2626 2633
2627 DECLARE_INSTRUCTION(CurrentContext) 2634 DECLARE_INSTRUCTION(CurrentContext)
2628 virtual CompileType ComputeType() const; 2635 virtual CompileType ComputeType() const;
2629 2636
2630 virtual bool CanDeoptimize() const { return false; } 2637 virtual bool ComputeCanDeoptimize() const { return false; }
2631 2638
2632 virtual EffectSet Effects() const { return EffectSet::None(); } 2639 virtual EffectSet Effects() const { return EffectSet::None(); }
2633 virtual EffectSet Dependencies() const { return EffectSet::None(); } 2640 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2634 virtual bool AttributesEqual(Instruction* other) const { return true; } 2641 virtual bool AttributesEqual(Instruction* other) const { return true; }
2635 2642
2636 private: 2643 private:
2637 DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr); 2644 DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr);
2638 }; 2645 };
2639 2646
2640 2647
(...skipping 26 matching lines...) Expand all
2667 virtual TokenPosition token_pos() const { return token_pos_; } 2674 virtual TokenPosition token_pos() const { return token_pos_; }
2668 2675
2669 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 2676 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2670 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 2677 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2671 return (*arguments_)[index]; 2678 return (*arguments_)[index];
2672 } 2679 }
2673 2680
2674 // TODO(kmillikin): implement exact call counts for closure calls. 2681 // TODO(kmillikin): implement exact call counts for closure calls.
2675 virtual intptr_t CallCount() const { return 1; } 2682 virtual intptr_t CallCount() const { return 1; }
2676 2683
2677 virtual bool CanDeoptimize() const { return true; } 2684 virtual bool ComputeCanDeoptimize() const { return true; }
2678 2685
2679 virtual EffectSet Effects() const { return EffectSet::All(); } 2686 virtual EffectSet Effects() const { return EffectSet::All(); }
2680 2687
2681 PRINT_OPERANDS_TO_SUPPORT 2688 PRINT_OPERANDS_TO_SUPPORT
2682 2689
2683 private: 2690 private:
2684 const Array& argument_names_; 2691 const Array& argument_names_;
2685 TokenPosition token_pos_; 2692 TokenPosition token_pos_;
2686 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 2693 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
2687 2694
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2735 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 2742 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2736 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 2743 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2737 return (*arguments_)[index]; 2744 return (*arguments_)[index];
2738 } 2745 }
2739 const Array& argument_names() const { return argument_names_; } 2746 const Array& argument_names() const { return argument_names_; }
2740 intptr_t checked_argument_count() const { return checked_argument_count_; } 2747 intptr_t checked_argument_count() const { return checked_argument_count_; }
2741 2748
2742 bool has_unique_selector() const { return has_unique_selector_; } 2749 bool has_unique_selector() const { return has_unique_selector_; }
2743 void set_has_unique_selector(bool b) { has_unique_selector_ = b; } 2750 void set_has_unique_selector(bool b) { has_unique_selector_ = b; }
2744 2751
2745 virtual bool CanDeoptimize() const { return true; } 2752 virtual bool ComputeCanDeoptimize() const { return true; }
2746 2753
2747 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2754 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2748 2755
2749 virtual bool CanBecomeDeoptimizationTarget() const { 2756 virtual bool CanBecomeDeoptimizationTarget() const {
2750 // Instance calls that are specialized by the optimizer need a 2757 // Instance calls that are specialized by the optimizer need a
2751 // deoptimization descriptor before the call. 2758 // deoptimization descriptor before the call.
2752 return true; 2759 return true;
2753 } 2760 }
2754 2761
2755 virtual EffectSet Effects() const { return EffectSet::All(); } 2762 virtual EffectSet Effects() const { return EffectSet::All(); }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2821 // 10 calls in the CallCount above, but the heuristics need to know that the 2828 // 10 calls in the CallCount above, but the heuristics need to know that the
2822 // last two cids cover 7% and 3% of the calls, not 70% and 30%. 2829 // last two cids cover 7% and 3% of the calls, not 70% and 30%.
2823 intptr_t total_call_count() { return total_call_count_; } 2830 intptr_t total_call_count() { return total_call_count_; }
2824 2831
2825 void set_total_call_count(intptr_t count) { total_call_count_ = count; } 2832 void set_total_call_count(intptr_t count) { total_call_count_ = count; }
2826 2833
2827 DECLARE_INSTRUCTION(PolymorphicInstanceCall) 2834 DECLARE_INSTRUCTION(PolymorphicInstanceCall)
2828 2835
2829 const ICData& ic_data() const { return ic_data_; } 2836 const ICData& ic_data() const { return ic_data_; }
2830 2837
2831 virtual bool CanDeoptimize() const { return true; } 2838 virtual bool ComputeCanDeoptimize() const { return true; }
2832 2839
2833 virtual EffectSet Effects() const { return EffectSet::All(); } 2840 virtual EffectSet Effects() const { return EffectSet::All(); }
2834 2841
2835 virtual Definition* Canonicalize(FlowGraph* graph); 2842 virtual Definition* Canonicalize(FlowGraph* graph);
2836 2843
2837 static RawType* ComputeRuntimeType(const ICData& ic_data); 2844 static RawType* ComputeRuntimeType(const ICData& ic_data);
2838 2845
2839 PRINT_OPERANDS_TO_SUPPORT 2846 PRINT_OPERANDS_TO_SUPPORT
2840 2847
2841 private: 2848 private:
(...skipping 14 matching lines...) Expand all
2856 Value* left, 2863 Value* left,
2857 Value* right, 2864 Value* right,
2858 bool needs_number_check); 2865 bool needs_number_check);
2859 2866
2860 DECLARE_INSTRUCTION(StrictCompare) 2867 DECLARE_INSTRUCTION(StrictCompare)
2861 2868
2862 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 2869 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
2863 2870
2864 virtual CompileType ComputeType() const; 2871 virtual CompileType ComputeType() const;
2865 2872
2866 virtual bool CanDeoptimize() const { return false; } 2873 virtual bool ComputeCanDeoptimize() const { return false; }
2867 2874
2868 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2875 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2869 2876
2870 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 2877 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
2871 2878
2872 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 2879 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
2873 BranchLabels labels); 2880 BranchLabels labels);
2874 2881
2875 bool needs_number_check() const { return needs_number_check_; } 2882 bool needs_number_check() const { return needs_number_check_; }
2876 void set_needs_number_check(bool value) { needs_number_check_ = value; } 2883 void set_needs_number_check(bool value) { needs_number_check_ = value; }
(...skipping 24 matching lines...) Expand all
2901 SetInputAt(0, left); 2908 SetInputAt(0, left);
2902 SetInputAt(1, right); 2909 SetInputAt(1, right);
2903 } 2910 }
2904 2911
2905 DECLARE_INSTRUCTION(TestSmi); 2912 DECLARE_INSTRUCTION(TestSmi);
2906 2913
2907 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 2914 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
2908 2915
2909 virtual CompileType ComputeType() const; 2916 virtual CompileType ComputeType() const;
2910 2917
2911 virtual bool CanDeoptimize() const { return false; } 2918 virtual bool ComputeCanDeoptimize() const { return false; }
2912 2919
2913 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 2920 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
2914 return kTagged; 2921 return kTagged;
2915 } 2922 }
2916 2923
2917 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 2924 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
2918 2925
2919 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 2926 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
2920 BranchLabels labels); 2927 BranchLabels labels);
2921 2928
(...skipping 24 matching lines...) Expand all
2946 } 2953 }
2947 2954
2948 DECLARE_INSTRUCTION(TestCids); 2955 DECLARE_INSTRUCTION(TestCids);
2949 2956
2950 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 2957 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
2951 2958
2952 virtual CompileType ComputeType() const; 2959 virtual CompileType ComputeType() const;
2953 2960
2954 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2961 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2955 2962
2956 virtual bool CanDeoptimize() const { 2963 virtual bool ComputeCanDeoptimize() const {
2957 return GetDeoptId() != Thread::kNoDeoptId; 2964 return GetDeoptId() != Thread::kNoDeoptId;
2958 } 2965 }
2959 2966
2960 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 2967 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
2961 return kTagged; 2968 return kTagged;
2962 } 2969 }
2963 2970
2964 virtual bool AttributesEqual(Instruction* other) const; 2971 virtual bool AttributesEqual(Instruction* other) const;
2965 2972
2966 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 2973 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
(...skipping 26 matching lines...) Expand all
2993 SetInputAt(1, right); 3000 SetInputAt(1, right);
2994 set_operation_cid(cid); 3001 set_operation_cid(cid);
2995 } 3002 }
2996 3003
2997 DECLARE_INSTRUCTION(EqualityCompare) 3004 DECLARE_INSTRUCTION(EqualityCompare)
2998 3005
2999 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3006 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3000 3007
3001 virtual CompileType ComputeType() const; 3008 virtual CompileType ComputeType() const;
3002 3009
3003 virtual bool CanDeoptimize() const { return false; } 3010 virtual bool ComputeCanDeoptimize() const { return false; }
3004 3011
3005 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 3012 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3006 3013
3007 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 3014 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3008 BranchLabels labels); 3015 BranchLabels labels);
3009 3016
3010 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3017 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3011 ASSERT((idx == 0) || (idx == 1)); 3018 ASSERT((idx == 0) || (idx == 1));
3012 if (operation_cid() == kDoubleCid) return kUnboxedDouble; 3019 if (operation_cid() == kDoubleCid) return kUnboxedDouble;
3013 if (operation_cid() == kMintCid) return kUnboxedMint; 3020 if (operation_cid() == kMintCid) return kUnboxedMint;
(...skipping 21 matching lines...) Expand all
3035 SetInputAt(1, right); 3042 SetInputAt(1, right);
3036 set_operation_cid(cid); 3043 set_operation_cid(cid);
3037 } 3044 }
3038 3045
3039 DECLARE_INSTRUCTION(RelationalOp) 3046 DECLARE_INSTRUCTION(RelationalOp)
3040 3047
3041 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 3048 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
3042 3049
3043 virtual CompileType ComputeType() const; 3050 virtual CompileType ComputeType() const;
3044 3051
3045 virtual bool CanDeoptimize() const { return false; } 3052 virtual bool ComputeCanDeoptimize() const { return false; }
3046 3053
3047 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch); 3054 virtual void EmitBranchCode(FlowGraphCompiler* compiler, BranchInstr* branch);
3048 3055
3049 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 3056 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
3050 BranchLabels labels); 3057 BranchLabels labels);
3051 3058
3052 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3059 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3053 ASSERT((idx == 0) || (idx == 1)); 3060 ASSERT((idx == 0) || (idx == 1));
3054 if (operation_cid() == kDoubleCid) return kUnboxedDouble; 3061 if (operation_cid() == kDoubleCid) return kUnboxedDouble;
3055 if (operation_cid() == kMintCid) return kUnboxedMint; 3062 if (operation_cid() == kMintCid) return kUnboxedMint;
(...skipping 26 matching lines...) Expand all
3082 // Returns true if this combination of comparison and values flowing on 3089 // Returns true if this combination of comparison and values flowing on
3083 // the true and false paths is supported on the current platform. 3090 // the true and false paths is supported on the current platform.
3084 static bool Supports(ComparisonInstr* comparison, Value* v1, Value* v2); 3091 static bool Supports(ComparisonInstr* comparison, Value* v1, Value* v2);
3085 3092
3086 DECLARE_INSTRUCTION(IfThenElse) 3093 DECLARE_INSTRUCTION(IfThenElse)
3087 3094
3088 intptr_t InputCount() const { return comparison()->InputCount(); } 3095 intptr_t InputCount() const { return comparison()->InputCount(); }
3089 3096
3090 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); } 3097 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
3091 3098
3092 virtual bool CanDeoptimize() const { return comparison()->CanDeoptimize(); } 3099 virtual bool ComputeCanDeoptimize() const {
3100 return comparison()->ComputeCanDeoptimize();
3101 }
3093 3102
3094 virtual bool CanBecomeDeoptimizationTarget() const { 3103 virtual bool CanBecomeDeoptimizationTarget() const {
3095 return comparison()->CanBecomeDeoptimizationTarget(); 3104 return comparison()->CanBecomeDeoptimizationTarget();
3096 } 3105 }
3097 3106
3098 virtual intptr_t DeoptimizationTarget() const { 3107 virtual intptr_t DeoptimizationTarget() const {
3099 return comparison()->DeoptimizationTarget(); 3108 return comparison()->DeoptimizationTarget();
3100 } 3109 }
3101 3110
3102 virtual Representation RequiredInputRepresentation(intptr_t i) const { 3111 virtual Representation RequiredInputRepresentation(intptr_t i) const {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3199 3208
3200 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 3209 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
3201 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 3210 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
3202 return (*arguments_)[index]; 3211 return (*arguments_)[index];
3203 } 3212 }
3204 3213
3205 virtual intptr_t CallCount() const { 3214 virtual intptr_t CallCount() const {
3206 return ic_data() == NULL ? 0 : ic_data()->AggregateCount(); 3215 return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
3207 } 3216 }
3208 3217
3209 virtual bool CanDeoptimize() const { return true; } 3218 virtual bool ComputeCanDeoptimize() const { return true; }
3210 3219
3211 virtual bool CanBecomeDeoptimizationTarget() const { 3220 virtual bool CanBecomeDeoptimizationTarget() const {
3212 // Static calls that are specialized by the optimizer (e.g. sqrt) need a 3221 // Static calls that are specialized by the optimizer (e.g. sqrt) need a
3213 // deoptimization descriptor before the call. 3222 // deoptimization descriptor before the call.
3214 return true; 3223 return true;
3215 } 3224 }
3216 3225
3217 virtual EffectSet Effects() const { return EffectSet::All(); } 3226 virtual EffectSet Effects() const { return EffectSet::All(); }
3218 3227
3219 void set_result_cid(intptr_t value) { result_cid_ = value; } 3228 void set_result_cid(intptr_t value) { result_cid_ = value; }
(...skipping 30 matching lines...) Expand all
3250 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> { 3259 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> {
3251 public: 3260 public:
3252 LoadLocalInstr(const LocalVariable& local, TokenPosition token_pos) 3261 LoadLocalInstr(const LocalVariable& local, TokenPosition token_pos)
3253 : local_(local), is_last_(false), token_pos_(token_pos) {} 3262 : local_(local), is_last_(false), token_pos_(token_pos) {}
3254 3263
3255 DECLARE_INSTRUCTION(LoadLocal) 3264 DECLARE_INSTRUCTION(LoadLocal)
3256 virtual CompileType ComputeType() const; 3265 virtual CompileType ComputeType() const;
3257 3266
3258 const LocalVariable& local() const { return local_; } 3267 const LocalVariable& local() const { return local_; }
3259 3268
3260 virtual bool CanDeoptimize() const { return false; } 3269 virtual bool ComputeCanDeoptimize() const { return false; }
3261 3270
3262 virtual EffectSet Effects() const { 3271 virtual EffectSet Effects() const {
3263 UNREACHABLE(); // Eliminated by SSA construction. 3272 UNREACHABLE(); // Eliminated by SSA construction.
3264 return EffectSet::None(); 3273 return EffectSet::None();
3265 } 3274 }
3266 3275
3267 void mark_last() { is_last_ = true; } 3276 void mark_last() { is_last_ = true; }
3268 bool is_last() const { return is_last_; } 3277 bool is_last() const { return is_last_; }
3269 3278
3270 virtual TokenPosition token_pos() const { return token_pos_; } 3279 virtual TokenPosition token_pos() const { return token_pos_; }
(...skipping 25 matching lines...) Expand all
3296 ASSERT((value_ != NULL) && (i == 0)); 3305 ASSERT((value_ != NULL) && (i == 0));
3297 return value_; 3306 return value_;
3298 } 3307 }
3299 3308
3300 Value* value() const { return value_; } 3309 Value* value() const { return value_; }
3301 3310
3302 intptr_t num_temps() const { return num_temps_; } 3311 intptr_t num_temps() const { return num_temps_; }
3303 3312
3304 virtual CompileType ComputeType() const; 3313 virtual CompileType ComputeType() const;
3305 3314
3306 virtual bool CanDeoptimize() const { return false; } 3315 virtual bool ComputeCanDeoptimize() const { return false; }
3307 3316
3308 virtual EffectSet Effects() const { 3317 virtual EffectSet Effects() const {
3309 UNREACHABLE(); // Eliminated by SSA construction. 3318 UNREACHABLE(); // Eliminated by SSA construction.
3310 return EffectSet::None(); 3319 return EffectSet::None();
3311 } 3320 }
3312 3321
3313 virtual bool MayThrow() const { 3322 virtual bool MayThrow() const {
3314 UNREACHABLE(); 3323 UNREACHABLE();
3315 return false; 3324 return false;
3316 } 3325 }
(...skipping 20 matching lines...) Expand all
3337 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) { 3346 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) {
3338 SetInputAt(0, value); 3347 SetInputAt(0, value);
3339 } 3348 }
3340 3349
3341 DECLARE_INSTRUCTION(StoreLocal) 3350 DECLARE_INSTRUCTION(StoreLocal)
3342 virtual CompileType ComputeType() const; 3351 virtual CompileType ComputeType() const;
3343 3352
3344 const LocalVariable& local() const { return local_; } 3353 const LocalVariable& local() const { return local_; }
3345 Value* value() const { return inputs_[0]; } 3354 Value* value() const { return inputs_[0]; }
3346 3355
3347 virtual bool CanDeoptimize() const { return false; } 3356 virtual bool ComputeCanDeoptimize() const { return false; }
3348 3357
3349 void mark_dead() { is_dead_ = true; } 3358 void mark_dead() { is_dead_ = true; }
3350 bool is_dead() const { return is_dead_; } 3359 bool is_dead() const { return is_dead_; }
3351 3360
3352 void mark_last() { is_last_ = true; } 3361 void mark_last() { is_last_ = true; }
3353 bool is_last() const { return is_last_; } 3362 bool is_last() const { return is_last_; }
3354 3363
3355 virtual EffectSet Effects() const { 3364 virtual EffectSet Effects() const {
3356 UNREACHABLE(); // Eliminated by SSA construction. 3365 UNREACHABLE(); // Eliminated by SSA construction.
3357 return EffectSet::None(); 3366 return EffectSet::None();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3394 3403
3395 DECLARE_INSTRUCTION(NativeCall) 3404 DECLARE_INSTRUCTION(NativeCall)
3396 3405
3397 const String& native_name() const { return *native_name_; } 3406 const String& native_name() const { return *native_name_; }
3398 const Function& function() const { return *function_; } 3407 const Function& function() const { return *function_; }
3399 NativeFunction native_c_function() const { return native_c_function_; } 3408 NativeFunction native_c_function() const { return native_c_function_; }
3400 bool is_bootstrap_native() const { return is_bootstrap_native_; } 3409 bool is_bootstrap_native() const { return is_bootstrap_native_; }
3401 bool link_lazily() const { return link_lazily_; } 3410 bool link_lazily() const { return link_lazily_; }
3402 virtual TokenPosition token_pos() const { return token_pos_; } 3411 virtual TokenPosition token_pos() const { return token_pos_; }
3403 3412
3404 virtual bool CanDeoptimize() const { return false; } 3413 virtual bool ComputeCanDeoptimize() const { return false; }
3405 3414
3406 virtual EffectSet Effects() const { return EffectSet::All(); } 3415 virtual EffectSet Effects() const { return EffectSet::All(); }
3407 3416
3408 void SetupNative(); 3417 void SetupNative();
3409 3418
3410 PRINT_OPERANDS_TO_SUPPORT 3419 PRINT_OPERANDS_TO_SUPPORT
3411 3420
3412 private: 3421 private:
3413 void set_native_c_function(NativeFunction value) { 3422 void set_native_c_function(NativeFunction value) {
3414 native_c_function_ = value; 3423 native_c_function_ = value;
(...skipping 13 matching lines...) Expand all
3428 3437
3429 3438
3430 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { 3439 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> {
3431 public: 3440 public:
3432 DebugStepCheckInstr(TokenPosition token_pos, RawPcDescriptors::Kind stub_kind) 3441 DebugStepCheckInstr(TokenPosition token_pos, RawPcDescriptors::Kind stub_kind)
3433 : token_pos_(token_pos), stub_kind_(stub_kind) {} 3442 : token_pos_(token_pos), stub_kind_(stub_kind) {}
3434 3443
3435 DECLARE_INSTRUCTION(DebugStepCheck) 3444 DECLARE_INSTRUCTION(DebugStepCheck)
3436 3445
3437 virtual TokenPosition token_pos() const { return token_pos_; } 3446 virtual TokenPosition token_pos() const { return token_pos_; }
3438 virtual bool CanDeoptimize() const { return false; } 3447 virtual bool ComputeCanDeoptimize() const { return false; }
3439 virtual EffectSet Effects() const { return EffectSet::All(); } 3448 virtual EffectSet Effects() const { return EffectSet::All(); }
3440 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 3449 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
3441 3450
3442 private: 3451 private:
3443 const TokenPosition token_pos_; 3452 const TokenPosition token_pos_;
3444 const RawPcDescriptors::Kind stub_kind_; 3453 const RawPcDescriptors::Kind stub_kind_;
3445 3454
3446 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr); 3455 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr);
3447 }; 3456 };
3448 3457
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3494 virtual TokenPosition token_pos() const { return token_pos_; } 3503 virtual TokenPosition token_pos() const { return token_pos_; }
3495 3504
3496 const Field& field() const { return field_; } 3505 const Field& field() const { return field_; }
3497 intptr_t offset_in_bytes() const { return offset_in_bytes_; } 3506 intptr_t offset_in_bytes() const { return offset_in_bytes_; }
3498 3507
3499 bool ShouldEmitStoreBarrier() const { 3508 bool ShouldEmitStoreBarrier() const {
3500 return value()->NeedsStoreBuffer() && 3509 return value()->NeedsStoreBuffer() &&
3501 (emit_store_barrier_ == kEmitStoreBarrier); 3510 (emit_store_barrier_ == kEmitStoreBarrier);
3502 } 3511 }
3503 3512
3504 virtual bool CanDeoptimize() const { return false; } 3513 virtual bool ComputeCanDeoptimize() const { return false; }
3505 3514
3506 // May require a deoptimization target for input conversions. 3515 // May require a deoptimization target for input conversions.
3507 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 3516 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
3508 3517
3509 // Currently CSE/LICM don't operate on any instructions that can be affected 3518 // Currently CSE/LICM don't operate on any instructions that can be affected
3510 // by stores/loads. LoadOptimizer handles loads separately. Hence stores 3519 // by stores/loads. LoadOptimizer handles loads separately. Hence stores
3511 // are marked as having no side-effects. 3520 // are marked as having no side-effects.
3512 virtual EffectSet Effects() const { return EffectSet::None(); } 3521 virtual EffectSet Effects() const { return EffectSet::None(); }
3513 3522
3514 bool IsUnboxedStore() const; 3523 bool IsUnboxedStore() const;
(...skipping 30 matching lines...) Expand all
3545 GuardFieldInstr(Value* value, const Field& field, intptr_t deopt_id) 3554 GuardFieldInstr(Value* value, const Field& field, intptr_t deopt_id)
3546 : TemplateInstruction(deopt_id), field_(field) { 3555 : TemplateInstruction(deopt_id), field_(field) {
3547 SetInputAt(0, value); 3556 SetInputAt(0, value);
3548 CheckField(field); 3557 CheckField(field);
3549 } 3558 }
3550 3559
3551 Value* value() const { return inputs_[0]; } 3560 Value* value() const { return inputs_[0]; }
3552 3561
3553 const Field& field() const { return field_; } 3562 const Field& field() const { return field_; }
3554 3563
3555 virtual bool CanDeoptimize() const { return true; } 3564 virtual bool ComputeCanDeoptimize() const { return true; }
3556 virtual bool CanBecomeDeoptimizationTarget() const { 3565 virtual bool CanBecomeDeoptimizationTarget() const {
3557 // Ensure that we record kDeopt PC descriptor in unoptimized code. 3566 // Ensure that we record kDeopt PC descriptor in unoptimized code.
3558 return true; 3567 return true;
3559 } 3568 }
3560 3569
3561 PRINT_OPERANDS_TO_SUPPORT 3570 PRINT_OPERANDS_TO_SUPPORT
3562 3571
3563 private: 3572 private:
3564 const Field& field_; 3573 const Field& field_;
3565 3574
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3611 SetInputAt(0, field_value); 3620 SetInputAt(0, field_value);
3612 } 3621 }
3613 3622
3614 DECLARE_INSTRUCTION(LoadStaticField) 3623 DECLARE_INSTRUCTION(LoadStaticField)
3615 virtual CompileType ComputeType() const; 3624 virtual CompileType ComputeType() const;
3616 3625
3617 const Field& StaticField() const; 3626 const Field& StaticField() const;
3618 3627
3619 Value* field_value() const { return inputs_[0]; } 3628 Value* field_value() const { return inputs_[0]; }
3620 3629
3621 virtual bool CanDeoptimize() const { return false; } 3630 virtual bool ComputeCanDeoptimize() const { return false; }
3622 3631
3623 virtual bool AllowsCSE() const { return StaticField().is_final(); } 3632 virtual bool AllowsCSE() const { return StaticField().is_final(); }
3624 virtual EffectSet Effects() const { return EffectSet::None(); } 3633 virtual EffectSet Effects() const { return EffectSet::None(); }
3625 virtual EffectSet Dependencies() const; 3634 virtual EffectSet Dependencies() const;
3626 virtual bool AttributesEqual(Instruction* other) const; 3635 virtual bool AttributesEqual(Instruction* other) const;
3627 3636
3628 virtual TokenPosition token_pos() const { return token_pos_; } 3637 virtual TokenPosition token_pos() const { return token_pos_; }
3629 3638
3630 PRINT_OPERANDS_TO_SUPPORT 3639 PRINT_OPERANDS_TO_SUPPORT
3631 3640
(...skipping 15 matching lines...) Expand all
3647 CheckField(field); 3656 CheckField(field);
3648 } 3657 }
3649 3658
3650 enum { kValuePos = 0 }; 3659 enum { kValuePos = 0 };
3651 3660
3652 DECLARE_INSTRUCTION(StoreStaticField) 3661 DECLARE_INSTRUCTION(StoreStaticField)
3653 3662
3654 const Field& field() const { return field_; } 3663 const Field& field() const { return field_; }
3655 Value* value() const { return inputs_[kValuePos]; } 3664 Value* value() const { return inputs_[kValuePos]; }
3656 3665
3657 virtual bool CanDeoptimize() const { return false; } 3666 virtual bool ComputeCanDeoptimize() const { return false; }
3658 3667
3659 // Currently CSE/LICM don't operate on any instructions that can be affected 3668 // Currently CSE/LICM don't operate on any instructions that can be affected
3660 // by stores/loads. LoadOptimizer handles loads separately. Hence stores 3669 // by stores/loads. LoadOptimizer handles loads separately. Hence stores
3661 // are marked as having no side-effects. 3670 // are marked as having no side-effects.
3662 virtual EffectSet Effects() const { return EffectSet::None(); } 3671 virtual EffectSet Effects() const { return EffectSet::None(); }
3663 3672
3664 virtual TokenPosition token_pos() const { return token_pos_; } 3673 virtual TokenPosition token_pos() const { return token_pos_; }
3665 3674
3666 PRINT_OPERANDS_TO_SUPPORT 3675 PRINT_OPERANDS_TO_SUPPORT
3667 3676
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3709 bool IsExternal() const { 3718 bool IsExternal() const {
3710 return array()->definition()->representation() == kUntagged; 3719 return array()->definition()->representation() == kUntagged;
3711 } 3720 }
3712 3721
3713 Value* array() const { return inputs_[0]; } 3722 Value* array() const { return inputs_[0]; }
3714 Value* index() const { return inputs_[1]; } 3723 Value* index() const { return inputs_[1]; }
3715 intptr_t index_scale() const { return index_scale_; } 3724 intptr_t index_scale() const { return index_scale_; }
3716 intptr_t class_id() const { return class_id_; } 3725 intptr_t class_id() const { return class_id_; }
3717 bool aligned() const { return alignment_ == kAlignedAccess; } 3726 bool aligned() const { return alignment_ == kAlignedAccess; }
3718 3727
3719 virtual bool CanDeoptimize() const { 3728 virtual bool ComputeCanDeoptimize() const {
3720 return GetDeoptId() != Thread::kNoDeoptId; 3729 return GetDeoptId() != Thread::kNoDeoptId;
3721 } 3730 }
3722 3731
3723 virtual Representation representation() const; 3732 virtual Representation representation() const;
3724 virtual void InferRange(RangeAnalysis* analysis, Range* range); 3733 virtual void InferRange(RangeAnalysis* analysis, Range* range);
3725 3734
3726 virtual EffectSet Effects() const { return EffectSet::None(); } 3735 virtual EffectSet Effects() const { return EffectSet::None(); }
3727 3736
3728 private: 3737 private:
3729 const intptr_t index_scale_; 3738 const intptr_t index_scale_;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3780 Value* array() const { return inputs_[0]; } 3789 Value* array() const { return inputs_[0]; }
3781 Value* index() const { return inputs_[1]; } 3790 Value* index() const { return inputs_[1]; }
3782 intptr_t index_scale() const { return Instance::ElementSizeFor(class_id_); } 3791 intptr_t index_scale() const { return Instance::ElementSizeFor(class_id_); }
3783 intptr_t class_id() const { return class_id_; } 3792 intptr_t class_id() const { return class_id_; }
3784 intptr_t element_count() const { return element_count_; } 3793 intptr_t element_count() const { return element_count_; }
3785 3794
3786 bool can_pack_into_smi() const { 3795 bool can_pack_into_smi() const {
3787 return element_count() <= kSmiBits / (index_scale() * kBitsPerByte); 3796 return element_count() <= kSmiBits / (index_scale() * kBitsPerByte);
3788 } 3797 }
3789 3798
3790 virtual bool CanDeoptimize() const { return false; } 3799 virtual bool ComputeCanDeoptimize() const { return false; }
3791 3800
3792 virtual Representation representation() const { return representation_; } 3801 virtual Representation representation() const { return representation_; }
3793 void set_representation(Representation repr) { representation_ = repr; } 3802 void set_representation(Representation repr) { representation_ = repr; }
3794 virtual void InferRange(RangeAnalysis* analysis, Range* range); 3803 virtual void InferRange(RangeAnalysis* analysis, Range* range);
3795 3804
3796 virtual EffectSet Effects() const { return EffectSet::None(); } 3805 virtual EffectSet Effects() const { return EffectSet::None(); }
3797 3806
3798 private: 3807 private:
3799 const intptr_t class_id_; 3808 const intptr_t class_id_;
3800 const TokenPosition token_pos_; 3809 const TokenPosition token_pos_;
3801 const intptr_t element_count_; 3810 const intptr_t element_count_;
3802 Representation representation_; 3811 Representation representation_;
3803 3812
3804 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr); 3813 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr);
3805 }; 3814 };
3806 3815
3807 3816
3808 class OneByteStringFromCharCodeInstr 3817 class OneByteStringFromCharCodeInstr
3809 : public TemplateDefinition<1, NoThrow, Pure> { 3818 : public TemplateDefinition<1, NoThrow, Pure> {
3810 public: 3819 public:
3811 explicit OneByteStringFromCharCodeInstr(Value* char_code) { 3820 explicit OneByteStringFromCharCodeInstr(Value* char_code) {
3812 SetInputAt(0, char_code); 3821 SetInputAt(0, char_code);
3813 } 3822 }
3814 3823
3815 DECLARE_INSTRUCTION(OneByteStringFromCharCode) 3824 DECLARE_INSTRUCTION(OneByteStringFromCharCode)
3816 virtual CompileType ComputeType() const; 3825 virtual CompileType ComputeType() const;
3817 3826
3818 Value* char_code() const { return inputs_[0]; } 3827 Value* char_code() const { return inputs_[0]; }
3819 3828
3820 virtual bool CanDeoptimize() const { return false; } 3829 virtual bool ComputeCanDeoptimize() const { return false; }
3821 3830
3822 virtual bool AttributesEqual(Instruction* other) const { return true; } 3831 virtual bool AttributesEqual(Instruction* other) const { return true; }
3823 3832
3824 private: 3833 private:
3825 DISALLOW_COPY_AND_ASSIGN(OneByteStringFromCharCodeInstr); 3834 DISALLOW_COPY_AND_ASSIGN(OneByteStringFromCharCodeInstr);
3826 }; 3835 };
3827 3836
3828 3837
3829 class StringToCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> { 3838 class StringToCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> {
3830 public: 3839 public:
3831 StringToCharCodeInstr(Value* str, intptr_t cid) : cid_(cid) { 3840 StringToCharCodeInstr(Value* str, intptr_t cid) : cid_(cid) {
3832 ASSERT(str != NULL); 3841 ASSERT(str != NULL);
3833 SetInputAt(0, str); 3842 SetInputAt(0, str);
3834 } 3843 }
3835 3844
3836 DECLARE_INSTRUCTION(StringToCharCode) 3845 DECLARE_INSTRUCTION(StringToCharCode)
3837 virtual CompileType ComputeType() const; 3846 virtual CompileType ComputeType() const;
3838 3847
3839 Value* str() const { return inputs_[0]; } 3848 Value* str() const { return inputs_[0]; }
3840 3849
3841 virtual bool CanDeoptimize() const { return false; } 3850 virtual bool ComputeCanDeoptimize() const { return false; }
3842 3851
3843 virtual bool AttributesEqual(Instruction* other) const { 3852 virtual bool AttributesEqual(Instruction* other) const {
3844 return other->AsStringToCharCode()->cid_ == cid_; 3853 return other->AsStringToCharCode()->cid_ == cid_;
3845 } 3854 }
3846 3855
3847 private: 3856 private:
3848 const intptr_t cid_; 3857 const intptr_t cid_;
3849 3858
3850 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); 3859 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr);
3851 }; 3860 };
3852 3861
3853 3862
3854 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { 3863 class StringInterpolateInstr : public TemplateDefinition<1, Throws> {
3855 public: 3864 public:
3856 StringInterpolateInstr(Value* value, TokenPosition token_pos) 3865 StringInterpolateInstr(Value* value, TokenPosition token_pos)
3857 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 3866 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
3858 token_pos_(token_pos), 3867 token_pos_(token_pos),
3859 function_(Function::ZoneHandle()) { 3868 function_(Function::ZoneHandle()) {
3860 SetInputAt(0, value); 3869 SetInputAt(0, value);
3861 } 3870 }
3862 3871
3863 Value* value() const { return inputs_[0]; } 3872 Value* value() const { return inputs_[0]; }
3864 virtual TokenPosition token_pos() const { return token_pos_; } 3873 virtual TokenPosition token_pos() const { return token_pos_; }
3865 3874
3866 virtual CompileType ComputeType() const; 3875 virtual CompileType ComputeType() const;
3867 // Issues a static call to Dart code which calls toString on objects. 3876 // Issues a static call to Dart code which calls toString on objects.
3868 virtual EffectSet Effects() const { return EffectSet::All(); } 3877 virtual EffectSet Effects() const { return EffectSet::All(); }
3869 virtual bool CanDeoptimize() const { return true; } 3878 virtual bool ComputeCanDeoptimize() const { return true; }
3870 3879
3871 const Function& CallFunction() const; 3880 const Function& CallFunction() const;
3872 3881
3873 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3882 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3874 3883
3875 DECLARE_INSTRUCTION(StringInterpolate) 3884 DECLARE_INSTRUCTION(StringInterpolate)
3876 3885
3877 private: 3886 private:
3878 const TokenPosition token_pos_; 3887 const TokenPosition token_pos_;
3879 Function& function_; 3888 Function& function_;
(...skipping 23 matching lines...) Expand all
3903 3912
3904 intptr_t index_scale() const { return index_scale_; } 3913 intptr_t index_scale() const { return index_scale_; }
3905 intptr_t class_id() const { return class_id_; } 3914 intptr_t class_id() const { return class_id_; }
3906 bool aligned() const { return alignment_ == kAlignedAccess; } 3915 bool aligned() const { return alignment_ == kAlignedAccess; }
3907 3916
3908 bool ShouldEmitStoreBarrier() const { 3917 bool ShouldEmitStoreBarrier() const {
3909 return value()->NeedsStoreBuffer() && 3918 return value()->NeedsStoreBuffer() &&
3910 (emit_store_barrier_ == kEmitStoreBarrier); 3919 (emit_store_barrier_ == kEmitStoreBarrier);
3911 } 3920 }
3912 3921
3913 virtual bool CanDeoptimize() const { return false; } 3922 virtual bool ComputeCanDeoptimize() const { return false; }
3914 3923
3915 virtual Representation RequiredInputRepresentation(intptr_t idx) const; 3924 virtual Representation RequiredInputRepresentation(intptr_t idx) const;
3916 3925
3917 bool IsExternal() const { 3926 bool IsExternal() const {
3918 return array()->definition()->representation() == kUntagged; 3927 return array()->definition()->representation() == kUntagged;
3919 } 3928 }
3920 3929
3921 virtual intptr_t DeoptimizationTarget() const { 3930 virtual intptr_t DeoptimizationTarget() const {
3922 // Direct access since this instruction cannot deoptimize, and the deopt-id 3931 // Direct access since this instruction cannot deoptimize, and the deopt-id
3923 // was inherited from another instruction that could deoptimize. 3932 // was inherited from another instruction that could deoptimize.
(...skipping 16 matching lines...) Expand all
3940 // Note overrideable, built-in: value ? false : true. 3949 // Note overrideable, built-in: value ? false : true.
3941 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> { 3950 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> {
3942 public: 3951 public:
3943 explicit BooleanNegateInstr(Value* value) { SetInputAt(0, value); } 3952 explicit BooleanNegateInstr(Value* value) { SetInputAt(0, value); }
3944 3953
3945 DECLARE_INSTRUCTION(BooleanNegate) 3954 DECLARE_INSTRUCTION(BooleanNegate)
3946 virtual CompileType ComputeType() const; 3955 virtual CompileType ComputeType() const;
3947 3956
3948 Value* value() const { return inputs_[0]; } 3957 Value* value() const { return inputs_[0]; }
3949 3958
3950 virtual bool CanDeoptimize() const { return false; } 3959 virtual bool ComputeCanDeoptimize() const { return false; }
3951 3960
3952 virtual EffectSet Effects() const { return EffectSet::None(); } 3961 virtual EffectSet Effects() const { return EffectSet::None(); }
3953 3962
3954 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3963 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3955 3964
3956 private: 3965 private:
3957 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr); 3966 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr);
3958 }; 3967 };
3959 3968
3960 3969
(...skipping 14 matching lines...) Expand all
3975 3984
3976 DECLARE_INSTRUCTION(InstanceOf) 3985 DECLARE_INSTRUCTION(InstanceOf)
3977 virtual CompileType ComputeType() const; 3986 virtual CompileType ComputeType() const;
3978 3987
3979 Value* value() const { return inputs_[0]; } 3988 Value* value() const { return inputs_[0]; }
3980 Value* instantiator_type_arguments() const { return inputs_[1]; } 3989 Value* instantiator_type_arguments() const { return inputs_[1]; }
3981 3990
3982 const AbstractType& type() const { return type_; } 3991 const AbstractType& type() const { return type_; }
3983 virtual TokenPosition token_pos() const { return token_pos_; } 3992 virtual TokenPosition token_pos() const { return token_pos_; }
3984 3993
3985 virtual bool CanDeoptimize() const { return true; } 3994 virtual bool ComputeCanDeoptimize() const { return true; }
3986 3995
3987 virtual EffectSet Effects() const { return EffectSet::None(); } 3996 virtual EffectSet Effects() const { return EffectSet::None(); }
3988 3997
3989 PRINT_OPERANDS_TO_SUPPORT 3998 PRINT_OPERANDS_TO_SUPPORT
3990 3999
3991 private: 4000 private:
3992 const TokenPosition token_pos_; 4001 const TokenPosition token_pos_;
3993 Value* value_; 4002 Value* value_;
3994 Value* type_arguments_; 4003 Value* type_arguments_;
3995 const AbstractType& type_; 4004 const AbstractType& type_;
(...skipping 25 matching lines...) Expand all
4021 } 4030 }
4022 4031
4023 const Class& cls() const { return cls_; } 4032 const Class& cls() const { return cls_; }
4024 virtual TokenPosition token_pos() const { return token_pos_; } 4033 virtual TokenPosition token_pos() const { return token_pos_; }
4025 4034
4026 const Function& closure_function() const { return closure_function_; } 4035 const Function& closure_function() const { return closure_function_; }
4027 void set_closure_function(const Function& function) { 4036 void set_closure_function(const Function& function) {
4028 closure_function_ ^= function.raw(); 4037 closure_function_ ^= function.raw();
4029 } 4038 }
4030 4039
4031 virtual bool CanDeoptimize() const { return false; } 4040 virtual bool ComputeCanDeoptimize() const { return false; }
4032 4041
4033 virtual EffectSet Effects() const { return EffectSet::None(); } 4042 virtual EffectSet Effects() const { return EffectSet::None(); }
4034 4043
4035 virtual AliasIdentity Identity() const { return identity_; } 4044 virtual AliasIdentity Identity() const { return identity_; }
4036 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4045 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4037 4046
4038 PRINT_OPERANDS_TO_SUPPORT 4047 PRINT_OPERANDS_TO_SUPPORT
4039 4048
4040 private: 4049 private:
4041 const TokenPosition token_pos_; 4050 const TokenPosition token_pos_;
(...skipping 14 matching lines...) Expand all
4056 : token_pos_(token_pos), 4065 : token_pos_(token_pos),
4057 num_context_variables_(num_context_variables), 4066 num_context_variables_(num_context_variables),
4058 identity_(AliasIdentity::Unknown()) {} 4067 identity_(AliasIdentity::Unknown()) {}
4059 4068
4060 DECLARE_INSTRUCTION(AllocateUninitializedContext) 4069 DECLARE_INSTRUCTION(AllocateUninitializedContext)
4061 virtual CompileType ComputeType() const; 4070 virtual CompileType ComputeType() const;
4062 4071
4063 virtual TokenPosition token_pos() const { return token_pos_; } 4072 virtual TokenPosition token_pos() const { return token_pos_; }
4064 intptr_t num_context_variables() const { return num_context_variables_; } 4073 intptr_t num_context_variables() const { return num_context_variables_; }
4065 4074
4066 virtual bool CanDeoptimize() const { return false; } 4075 virtual bool ComputeCanDeoptimize() const { return false; }
4067 4076
4068 virtual EffectSet Effects() const { return EffectSet::None(); } 4077 virtual EffectSet Effects() const { return EffectSet::None(); }
4069 4078
4070 virtual AliasIdentity Identity() const { return identity_; } 4079 virtual AliasIdentity Identity() const { return identity_; }
4071 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4080 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4072 4081
4073 PRINT_OPERANDS_TO_SUPPORT 4082 PRINT_OPERANDS_TO_SUPPORT
4074 4083
4075 private: 4084 private:
4076 const TokenPosition token_pos_; 4085 const TokenPosition token_pos_;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
4143 // SelectRepresentations pass is run once more while MaterializeObject 4152 // SelectRepresentations pass is run once more while MaterializeObject
4144 // instructions are still in the graph. To avoid any redundant boxing 4153 // instructions are still in the graph. To avoid any redundant boxing
4145 // operations inserted by that pass we should indicate that this 4154 // operations inserted by that pass we should indicate that this
4146 // instruction can cope with any representation as it is essentially 4155 // instruction can cope with any representation as it is essentially
4147 // an environment use. 4156 // an environment use.
4148 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 4157 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
4149 ASSERT(0 <= idx && idx < InputCount()); 4158 ASSERT(0 <= idx && idx < InputCount());
4150 return kNoRepresentation; 4159 return kNoRepresentation;
4151 } 4160 }
4152 4161
4153 virtual bool CanDeoptimize() const { return false; } 4162 virtual bool ComputeCanDeoptimize() const { return false; }
4154 virtual EffectSet Effects() const { return EffectSet::None(); } 4163 virtual EffectSet Effects() const { return EffectSet::None(); }
4155 4164
4156 Location* locations() { return locations_; } 4165 Location* locations() { return locations_; }
4157 void set_locations(Location* locations) { locations_ = locations; } 4166 void set_locations(Location* locations) { locations_ = locations; }
4158 4167
4159 virtual bool MayThrow() const { return false; } 4168 virtual bool MayThrow() const { return false; }
4160 4169
4161 void RemapRegisters(intptr_t* cpu_reg_slots, intptr_t* fpu_reg_slots); 4170 void RemapRegisters(intptr_t* cpu_reg_slots, intptr_t* fpu_reg_slots);
4162 4171
4163 bool was_visited_for_liveness() const { return visited_for_liveness_; } 4172 bool was_visited_for_liveness() const { return visited_for_liveness_; }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4200 4209
4201 DECLARE_INSTRUCTION(CreateArray) 4210 DECLARE_INSTRUCTION(CreateArray)
4202 virtual CompileType ComputeType() const; 4211 virtual CompileType ComputeType() const;
4203 4212
4204 virtual TokenPosition token_pos() const { return token_pos_; } 4213 virtual TokenPosition token_pos() const { return token_pos_; }
4205 Value* element_type() const { return inputs_[kElementTypePos]; } 4214 Value* element_type() const { return inputs_[kElementTypePos]; }
4206 Value* num_elements() const { return inputs_[kLengthPos]; } 4215 Value* num_elements() const { return inputs_[kLengthPos]; }
4207 4216
4208 // Throw needs environment, which is created only if instruction can 4217 // Throw needs environment, which is created only if instruction can
4209 // deoptimize. 4218 // deoptimize.
4210 virtual bool CanDeoptimize() const { return MayThrow(); } 4219 virtual bool ComputeCanDeoptimize() const { return MayThrow(); }
4211 4220
4212 virtual EffectSet Effects() const { return EffectSet::None(); } 4221 virtual EffectSet Effects() const { return EffectSet::None(); }
4213 4222
4214 virtual AliasIdentity Identity() const { return identity_; } 4223 virtual AliasIdentity Identity() const { return identity_; }
4215 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4224 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4216 4225
4217 private: 4226 private:
4218 const TokenPosition token_pos_; 4227 const TokenPosition token_pos_;
4219 AliasIdentity identity_; 4228 AliasIdentity identity_;
4220 4229
(...skipping 18 matching lines...) Expand all
4239 4248
4240 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 4249 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
4241 ASSERT(idx == 0); 4250 ASSERT(idx == 0);
4242 // The object may be tagged or untagged (for external objects). 4251 // The object may be tagged or untagged (for external objects).
4243 return kNoRepresentation; 4252 return kNoRepresentation;
4244 } 4253 }
4245 4254
4246 Value* object() const { return inputs_[0]; } 4255 Value* object() const { return inputs_[0]; }
4247 intptr_t offset() const { return offset_; } 4256 intptr_t offset() const { return offset_; }
4248 4257
4249 virtual bool CanDeoptimize() const { return false; } 4258 virtual bool ComputeCanDeoptimize() const { return false; }
4250 4259
4251 virtual EffectSet Effects() const { return EffectSet::None(); } 4260 virtual EffectSet Effects() const { return EffectSet::None(); }
4252 virtual bool AttributesEqual(Instruction* other) const { return true; } 4261 virtual bool AttributesEqual(Instruction* other) const { return true; }
4253 4262
4254 private: 4263 private:
4255 intptr_t offset_; 4264 intptr_t offset_;
4256 4265
4257 DISALLOW_COPY_AND_ASSIGN(LoadUntaggedInstr); 4266 DISALLOW_COPY_AND_ASSIGN(LoadUntaggedInstr);
4258 }; 4267 };
4259 4268
4260 4269
4261 class LoadClassIdInstr : public TemplateDefinition<1, NoThrow> { 4270 class LoadClassIdInstr : public TemplateDefinition<1, NoThrow> {
4262 public: 4271 public:
4263 explicit LoadClassIdInstr(Value* object) { SetInputAt(0, object); } 4272 explicit LoadClassIdInstr(Value* object) { SetInputAt(0, object); }
4264 4273
4265 virtual Representation representation() const { return kTagged; } 4274 virtual Representation representation() const { return kTagged; }
4266 DECLARE_INSTRUCTION(LoadClassId) 4275 DECLARE_INSTRUCTION(LoadClassId)
4267 virtual CompileType ComputeType() const; 4276 virtual CompileType ComputeType() const;
4268 4277
4269 Value* object() const { return inputs_[0]; } 4278 Value* object() const { return inputs_[0]; }
4270 4279
4271 virtual bool CanDeoptimize() const { return false; } 4280 virtual bool ComputeCanDeoptimize() const { return false; }
4272 4281
4273 virtual bool AllowsCSE() const { return true; } 4282 virtual bool AllowsCSE() const { return true; }
4274 virtual EffectSet Dependencies() const { 4283 virtual EffectSet Dependencies() const {
4275 return EffectSet::Externalization(); 4284 return EffectSet::Externalization();
4276 } 4285 }
4277 virtual EffectSet Effects() const { return EffectSet::None(); } 4286 virtual EffectSet Effects() const { return EffectSet::None(); }
4278 virtual bool AttributesEqual(Instruction* other) const { return true; } 4287 virtual bool AttributesEqual(Instruction* other) const { return true; }
4279 4288
4280 private: 4289 private:
4281 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); 4290 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
4345 4354
4346 void set_recognized_kind(MethodRecognizer::Kind kind) { 4355 void set_recognized_kind(MethodRecognizer::Kind kind) {
4347 recognized_kind_ = kind; 4356 recognized_kind_ = kind;
4348 } 4357 }
4349 4358
4350 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } 4359 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
4351 4360
4352 DECLARE_INSTRUCTION(LoadField) 4361 DECLARE_INSTRUCTION(LoadField)
4353 virtual CompileType ComputeType() const; 4362 virtual CompileType ComputeType() const;
4354 4363
4355 virtual bool CanDeoptimize() const { return false; } 4364 virtual bool ComputeCanDeoptimize() const { return false; }
4356 4365
4357 virtual void InferRange(RangeAnalysis* analysis, Range* range); 4366 virtual void InferRange(RangeAnalysis* analysis, Range* range);
4358 4367
4359 bool IsImmutableLengthLoad() const; 4368 bool IsImmutableLengthLoad() const;
4360 4369
4361 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4370 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4362 4371
4363 static MethodRecognizer::Kind RecognizedKindFromArrayCid(intptr_t cid); 4372 static MethodRecognizer::Kind RecognizedKindFromArrayCid(intptr_t cid);
4364 4373
4365 static bool IsFixedLengthArrayCid(intptr_t cid); 4374 static bool IsFixedLengthArrayCid(intptr_t cid);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4398 ASSERT(function_type_arguments == NULL); // TODO(regis): Implement. 4407 ASSERT(function_type_arguments == NULL); // TODO(regis): Implement.
4399 SetInputAt(0, instantiator_type_arguments); 4408 SetInputAt(0, instantiator_type_arguments);
4400 } 4409 }
4401 4410
4402 DECLARE_INSTRUCTION(InstantiateType) 4411 DECLARE_INSTRUCTION(InstantiateType)
4403 4412
4404 Value* instantiator_type_arguments() const { return inputs_[0]; } 4413 Value* instantiator_type_arguments() const { return inputs_[0]; }
4405 const AbstractType& type() const { return type_; } 4414 const AbstractType& type() const { return type_; }
4406 virtual TokenPosition token_pos() const { return token_pos_; } 4415 virtual TokenPosition token_pos() const { return token_pos_; }
4407 4416
4408 virtual bool CanDeoptimize() const { return true; } 4417 virtual bool ComputeCanDeoptimize() const { return true; }
4409 4418
4410 virtual EffectSet Effects() const { return EffectSet::None(); } 4419 virtual EffectSet Effects() const { return EffectSet::None(); }
4411 4420
4412 PRINT_OPERANDS_TO_SUPPORT 4421 PRINT_OPERANDS_TO_SUPPORT
4413 4422
4414 private: 4423 private:
4415 const TokenPosition token_pos_; 4424 const TokenPosition token_pos_;
4416 const AbstractType& type_; 4425 const AbstractType& type_;
4417 4426
4418 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); 4427 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr);
(...skipping 16 matching lines...) Expand all
4435 SetInputAt(0, instantiator_type_arguments); 4444 SetInputAt(0, instantiator_type_arguments);
4436 } 4445 }
4437 4446
4438 DECLARE_INSTRUCTION(InstantiateTypeArguments) 4447 DECLARE_INSTRUCTION(InstantiateTypeArguments)
4439 4448
4440 Value* instantiator_type_arguments() const { return inputs_[0]; } 4449 Value* instantiator_type_arguments() const { return inputs_[0]; }
4441 const TypeArguments& type_arguments() const { return type_arguments_; } 4450 const TypeArguments& type_arguments() const { return type_arguments_; }
4442 const Class& instantiator_class() const { return instantiator_class_; } 4451 const Class& instantiator_class() const { return instantiator_class_; }
4443 virtual TokenPosition token_pos() const { return token_pos_; } 4452 virtual TokenPosition token_pos() const { return token_pos_; }
4444 4453
4445 virtual bool CanDeoptimize() const { return true; } 4454 virtual bool ComputeCanDeoptimize() const { return true; }
4446 4455
4447 virtual EffectSet Effects() const { return EffectSet::None(); } 4456 virtual EffectSet Effects() const { return EffectSet::None(); }
4448 4457
4449 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4458 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4450 4459
4451 PRINT_OPERANDS_TO_SUPPORT 4460 PRINT_OPERANDS_TO_SUPPORT
4452 4461
4453 private: 4462 private:
4454 const TokenPosition token_pos_; 4463 const TokenPosition token_pos_;
4455 const TypeArguments& type_arguments_; 4464 const TypeArguments& type_arguments_;
4456 const Class& instantiator_class_; 4465 const Class& instantiator_class_;
4457 4466
4458 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr); 4467 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr);
4459 }; 4468 };
4460 4469
4461 4470
4462 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> { 4471 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> {
4463 public: 4472 public:
4464 AllocateContextInstr(TokenPosition token_pos, intptr_t num_context_variables) 4473 AllocateContextInstr(TokenPosition token_pos, intptr_t num_context_variables)
4465 : token_pos_(token_pos), num_context_variables_(num_context_variables) {} 4474 : token_pos_(token_pos), num_context_variables_(num_context_variables) {}
4466 4475
4467 DECLARE_INSTRUCTION(AllocateContext) 4476 DECLARE_INSTRUCTION(AllocateContext)
4468 virtual CompileType ComputeType() const; 4477 virtual CompileType ComputeType() const;
4469 4478
4470 virtual TokenPosition token_pos() const { return token_pos_; } 4479 virtual TokenPosition token_pos() const { return token_pos_; }
4471 intptr_t num_context_variables() const { return num_context_variables_; } 4480 intptr_t num_context_variables() const { return num_context_variables_; }
4472 4481
4473 virtual bool CanDeoptimize() const { return false; } 4482 virtual bool ComputeCanDeoptimize() const { return false; }
4474 4483
4475 virtual EffectSet Effects() const { return EffectSet::None(); } 4484 virtual EffectSet Effects() const { return EffectSet::None(); }
4476 4485
4477 PRINT_OPERANDS_TO_SUPPORT 4486 PRINT_OPERANDS_TO_SUPPORT
4478 4487
4479 private: 4488 private:
4480 const TokenPosition token_pos_; 4489 const TokenPosition token_pos_;
4481 const intptr_t num_context_variables_; 4490 const intptr_t num_context_variables_;
4482 4491
4483 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); 4492 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr);
4484 }; 4493 };
4485 4494
4486 4495
4487 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { 4496 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> {
4488 public: 4497 public:
4489 InitStaticFieldInstr(Value* input, const Field& field) 4498 InitStaticFieldInstr(Value* input, const Field& field)
4490 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 4499 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
4491 field_(field) { 4500 field_(field) {
4492 SetInputAt(0, input); 4501 SetInputAt(0, input);
4493 CheckField(field); 4502 CheckField(field);
4494 } 4503 }
4495 4504
4496 virtual TokenPosition token_pos() const { return field_.token_pos(); } 4505 virtual TokenPosition token_pos() const { return field_.token_pos(); }
4497 const Field& field() const { return field_; } 4506 const Field& field() const { return field_; }
4498 4507
4499 DECLARE_INSTRUCTION(InitStaticField) 4508 DECLARE_INSTRUCTION(InitStaticField)
4500 4509
4501 virtual bool CanDeoptimize() const { return true; } 4510 virtual bool ComputeCanDeoptimize() const { return true; }
4502 virtual EffectSet Effects() const { return EffectSet::All(); } 4511 virtual EffectSet Effects() const { return EffectSet::All(); }
4503 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 4512 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
4504 4513
4505 private: 4514 private:
4506 const Field& field_; 4515 const Field& field_;
4507 4516
4508 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); 4517 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr);
4509 }; 4518 };
4510 4519
4511 4520
4512 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { 4521 class CloneContextInstr : public TemplateDefinition<1, NoThrow> {
4513 public: 4522 public:
4514 CloneContextInstr(TokenPosition token_pos, Value* context_value) 4523 CloneContextInstr(TokenPosition token_pos, Value* context_value)
4515 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 4524 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
4516 token_pos_(token_pos) { 4525 token_pos_(token_pos) {
4517 SetInputAt(0, context_value); 4526 SetInputAt(0, context_value);
4518 } 4527 }
4519 4528
4520 virtual TokenPosition token_pos() const { return token_pos_; } 4529 virtual TokenPosition token_pos() const { return token_pos_; }
4521 Value* context_value() const { return inputs_[0]; } 4530 Value* context_value() const { return inputs_[0]; }
4522 4531
4523 DECLARE_INSTRUCTION(CloneContext) 4532 DECLARE_INSTRUCTION(CloneContext)
4524 virtual CompileType ComputeType() const; 4533 virtual CompileType ComputeType() const;
4525 4534
4526 virtual bool CanDeoptimize() const { return true; } 4535 virtual bool ComputeCanDeoptimize() const { return true; }
4527 4536
4528 virtual EffectSet Effects() const { return EffectSet::None(); } 4537 virtual EffectSet Effects() const { return EffectSet::None(); }
4529 4538
4530 private: 4539 private:
4531 const TokenPosition token_pos_; 4540 const TokenPosition token_pos_;
4532 4541
4533 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr); 4542 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr);
4534 }; 4543 };
4535 4544
4536 4545
4537 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> { 4546 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> {
4538 public: 4547 public:
4539 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id) 4548 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id)
4540 : TemplateInstruction(deopt_id), licm_hoisted_(false) { 4549 : TemplateInstruction(deopt_id), licm_hoisted_(false) {
4541 SetInputAt(0, left); 4550 SetInputAt(0, left);
4542 SetInputAt(1, right); 4551 SetInputAt(1, right);
4543 } 4552 }
4544 4553
4545 Value* left() const { return inputs_[0]; } 4554 Value* left() const { return inputs_[0]; }
4546 Value* right() const { return inputs_[1]; } 4555 Value* right() const { return inputs_[1]; }
4547 4556
4548 DECLARE_INSTRUCTION(CheckEitherNonSmi) 4557 DECLARE_INSTRUCTION(CheckEitherNonSmi)
4549 4558
4550 virtual bool CanDeoptimize() const { return true; } 4559 virtual bool ComputeCanDeoptimize() const { return true; }
4551 4560
4552 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 4561 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
4553 4562
4554 virtual bool AttributesEqual(Instruction* other) const { return true; } 4563 virtual bool AttributesEqual(Instruction* other) const { return true; }
4555 4564
4556 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 4565 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
4557 4566
4558 private: 4567 private:
4559 bool licm_hoisted_; 4568 bool licm_hoisted_;
4560 4569
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
4625 class BoxInstr : public TemplateDefinition<1, NoThrow, Pure> { 4634 class BoxInstr : public TemplateDefinition<1, NoThrow, Pure> {
4626 public: 4635 public:
4627 static BoxInstr* Create(Representation from, Value* value); 4636 static BoxInstr* Create(Representation from, Value* value);
4628 4637
4629 Value* value() const { return inputs_[0]; } 4638 Value* value() const { return inputs_[0]; }
4630 Representation from_representation() const { return from_representation_; } 4639 Representation from_representation() const { return from_representation_; }
4631 4640
4632 DECLARE_INSTRUCTION(Box) 4641 DECLARE_INSTRUCTION(Box)
4633 virtual CompileType ComputeType() const; 4642 virtual CompileType ComputeType() const;
4634 4643
4635 virtual bool CanDeoptimize() const { return false; } 4644 virtual bool ComputeCanDeoptimize() const { return false; }
4636 virtual intptr_t DeoptimizationTarget() const { return Thread::kNoDeoptId; } 4645 virtual intptr_t DeoptimizationTarget() const { return Thread::kNoDeoptId; }
4637 4646
4638 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 4647 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
4639 ASSERT(idx == 0); 4648 ASSERT(idx == 0);
4640 return from_representation(); 4649 return from_representation();
4641 } 4650 }
4642 4651
4643 virtual bool AttributesEqual(Instruction* other) const { 4652 virtual bool AttributesEqual(Instruction* other) const {
4644 return other->AsBox()->from_representation() == from_representation(); 4653 return other->AsBox()->from_representation() == from_representation();
4645 } 4654 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
4734 DISALLOW_COPY_AND_ASSIGN(BoxInt64Instr); 4743 DISALLOW_COPY_AND_ASSIGN(BoxInt64Instr);
4735 }; 4744 };
4736 4745
4737 4746
4738 class UnboxInstr : public TemplateDefinition<1, NoThrow, Pure> { 4747 class UnboxInstr : public TemplateDefinition<1, NoThrow, Pure> {
4739 public: 4748 public:
4740 static UnboxInstr* Create(Representation to, Value* value, intptr_t deopt_id); 4749 static UnboxInstr* Create(Representation to, Value* value, intptr_t deopt_id);
4741 4750
4742 Value* value() const { return inputs_[0]; } 4751 Value* value() const { return inputs_[0]; }
4743 4752
4744 virtual bool CanDeoptimize() const { 4753 virtual bool ComputeCanDeoptimize() const {
4745 const intptr_t value_cid = value()->Type()->ToCid(); 4754 const intptr_t value_cid = value()->Type()->ToCid();
4746 4755
4747 if (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid)) { 4756 if (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid)) {
4748 return false; 4757 return false;
4749 } 4758 }
4750 4759
4751 return (value_cid != BoxCid()); 4760 return (value_cid != BoxCid());
4752 } 4761 }
4753 4762
4754 virtual Representation representation() const { return representation_; } 4763 virtual Representation representation() const { return representation_; }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
4836 }; 4845 };
4837 4846
4838 4847
4839 class UnboxUint32Instr : public UnboxInteger32Instr { 4848 class UnboxUint32Instr : public UnboxInteger32Instr {
4840 public: 4849 public:
4841 UnboxUint32Instr(Value* value, intptr_t deopt_id) 4850 UnboxUint32Instr(Value* value, intptr_t deopt_id)
4842 : UnboxInteger32Instr(kUnboxedUint32, kTruncate, value, deopt_id) { 4851 : UnboxInteger32Instr(kUnboxedUint32, kTruncate, value, deopt_id) {
4843 ASSERT(is_truncating()); 4852 ASSERT(is_truncating());
4844 } 4853 }
4845 4854
4846 virtual bool CanDeoptimize() const; 4855 virtual bool ComputeCanDeoptimize() const;
4847 4856
4848 virtual void InferRange(RangeAnalysis* analysis, Range* range); 4857 virtual void InferRange(RangeAnalysis* analysis, Range* range);
4849 4858
4850 DECLARE_INSTRUCTION_NO_BACKEND(UnboxUint32) 4859 DECLARE_INSTRUCTION_NO_BACKEND(UnboxUint32)
4851 4860
4852 private: 4861 private:
4853 DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr); 4862 DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
4854 }; 4863 };
4855 4864
4856 4865
4857 class UnboxInt32Instr : public UnboxInteger32Instr { 4866 class UnboxInt32Instr : public UnboxInteger32Instr {
4858 public: 4867 public:
4859 UnboxInt32Instr(TruncationMode truncation_mode, 4868 UnboxInt32Instr(TruncationMode truncation_mode,
4860 Value* value, 4869 Value* value,
4861 intptr_t deopt_id) 4870 intptr_t deopt_id)
4862 : UnboxInteger32Instr(kUnboxedInt32, truncation_mode, value, deopt_id) {} 4871 : UnboxInteger32Instr(kUnboxedInt32, truncation_mode, value, deopt_id) {}
4863 4872
4864 virtual bool CanDeoptimize() const; 4873 virtual bool ComputeCanDeoptimize() const;
4865 4874
4866 virtual void InferRange(RangeAnalysis* analysis, Range* range); 4875 virtual void InferRange(RangeAnalysis* analysis, Range* range);
4867 4876
4868 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4877 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4869 4878
4870 DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt32) 4879 DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt32)
4871 4880
4872 private: 4881 private:
4873 DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr); 4882 DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr);
4874 }; 4883 };
(...skipping 27 matching lines...) Expand all
4902 kDoubleSquare, 4911 kDoubleSquare,
4903 }; 4912 };
4904 MathUnaryInstr(MathUnaryKind kind, Value* value, intptr_t deopt_id) 4913 MathUnaryInstr(MathUnaryKind kind, Value* value, intptr_t deopt_id)
4905 : TemplateDefinition(deopt_id), kind_(kind) { 4914 : TemplateDefinition(deopt_id), kind_(kind) {
4906 SetInputAt(0, value); 4915 SetInputAt(0, value);
4907 } 4916 }
4908 4917
4909 Value* value() const { return inputs_[0]; } 4918 Value* value() const { return inputs_[0]; }
4910 MathUnaryKind kind() const { return kind_; } 4919 MathUnaryKind kind() const { return kind_; }
4911 4920
4912 virtual bool CanDeoptimize() const { return false; } 4921 virtual bool ComputeCanDeoptimize() const { return false; }
4913 4922
4914 virtual Representation representation() const { return kUnboxedDouble; } 4923 virtual Representation representation() const { return kUnboxedDouble; }
4915 4924
4916 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 4925 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
4917 ASSERT(idx == 0); 4926 ASSERT(idx == 0);
4918 return kUnboxedDouble; 4927 return kUnboxedDouble;
4919 } 4928 }
4920 4929
4921 virtual intptr_t DeoptimizationTarget() const { 4930 virtual intptr_t DeoptimizationTarget() const {
4922 // Direct access since this instruction cannot deoptimize, and the deopt-id 4931 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
4970 Value* str() const { return inputs_[0]; } 4979 Value* str() const { return inputs_[0]; }
4971 Value* lhs_index() const { return inputs_[1]; } 4980 Value* lhs_index() const { return inputs_[1]; }
4972 Value* rhs_index() const { return inputs_[2]; } 4981 Value* rhs_index() const { return inputs_[2]; }
4973 Value* length() const { return inputs_[3]; } 4982 Value* length() const { return inputs_[3]; }
4974 4983
4975 const RuntimeEntry& TargetFunction() const; 4984 const RuntimeEntry& TargetFunction() const;
4976 bool IsExternal() const { return cid_ == kExternalTwoByteStringCid; } 4985 bool IsExternal() const { return cid_ == kExternalTwoByteStringCid; }
4977 intptr_t class_id() const { return cid_; } 4986 intptr_t class_id() const { return cid_; }
4978 intptr_t index_scale() const { return Instance::ElementSizeFor(cid_); } 4987 intptr_t index_scale() const { return Instance::ElementSizeFor(cid_); }
4979 4988
4980 virtual bool CanDeoptimize() const { return false; } 4989 virtual bool ComputeCanDeoptimize() const { return false; }
4981 4990
4982 virtual Representation representation() const { return kTagged; } 4991 virtual Representation representation() const { return kTagged; }
4983 4992
4984 DECLARE_INSTRUCTION(CaseInsensitiveCompareUC16) 4993 DECLARE_INSTRUCTION(CaseInsensitiveCompareUC16)
4985 virtual CompileType ComputeType() const; 4994 virtual CompileType ComputeType() const;
4986 4995
4987 virtual bool AttributesEqual(Instruction* other) const { 4996 virtual bool AttributesEqual(Instruction* other) const {
4988 return other->AsCaseInsensitiveCompareUC16()->cid_ == cid_; 4997 return other->AsCaseInsensitiveCompareUC16()->cid_ == cid_;
4989 } 4998 }
4990 4999
(...skipping 20 matching lines...) Expand all
5011 SetInputAt(1, right_value); 5020 SetInputAt(1, right_value);
5012 } 5021 }
5013 5022
5014 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5023 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5015 5024
5016 Value* left() const { return inputs_[0]; } 5025 Value* left() const { return inputs_[0]; }
5017 Value* right() const { return inputs_[1]; } 5026 Value* right() const { return inputs_[1]; }
5018 5027
5019 intptr_t result_cid() const { return result_cid_; } 5028 intptr_t result_cid() const { return result_cid_; }
5020 5029
5021 virtual bool CanDeoptimize() const { return false; } 5030 virtual bool ComputeCanDeoptimize() const { return false; }
5022 5031
5023 virtual Representation representation() const { 5032 virtual Representation representation() const {
5024 if (result_cid() == kSmiCid) { 5033 if (result_cid() == kSmiCid) {
5025 return kTagged; 5034 return kTagged;
5026 } 5035 }
5027 ASSERT(result_cid() == kDoubleCid); 5036 ASSERT(result_cid() == kDoubleCid);
5028 return kUnboxedDouble; 5037 return kUnboxedDouble;
5029 } 5038 }
5030 5039
5031 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5040 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
5066 SetInputAt(1, right); 5075 SetInputAt(1, right);
5067 } 5076 }
5068 5077
5069 Value* left() const { return inputs_[0]; } 5078 Value* left() const { return inputs_[0]; }
5070 Value* right() const { return inputs_[1]; } 5079 Value* right() const { return inputs_[1]; }
5071 5080
5072 Token::Kind op_kind() const { return op_kind_; } 5081 Token::Kind op_kind() const { return op_kind_; }
5073 5082
5074 virtual TokenPosition token_pos() const { return token_pos_; } 5083 virtual TokenPosition token_pos() const { return token_pos_; }
5075 5084
5076 virtual bool CanDeoptimize() const { return false; } 5085 virtual bool ComputeCanDeoptimize() const { return false; }
5077 5086
5078 virtual Representation representation() const { return kUnboxedDouble; } 5087 virtual Representation representation() const { return kUnboxedDouble; }
5079 5088
5080 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5089 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5081 ASSERT((idx == 0) || (idx == 1)); 5090 ASSERT((idx == 0) || (idx == 1));
5082 return kUnboxedDouble; 5091 return kUnboxedDouble;
5083 } 5092 }
5084 5093
5085 virtual intptr_t DeoptimizationTarget() const { 5094 virtual intptr_t DeoptimizationTarget() const {
5086 // Direct access since this instruction cannot deoptimize, and the deopt-id 5095 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 27 matching lines...) Expand all
5114 intptr_t deopt_id, 5123 intptr_t deopt_id,
5115 TokenPosition token_pos) 5124 TokenPosition token_pos)
5116 : TemplateComparison(token_pos, Token::kEQ, deopt_id), op_kind_(op_kind) { 5125 : TemplateComparison(token_pos, Token::kEQ, deopt_id), op_kind_(op_kind) {
5117 SetInputAt(0, value); 5126 SetInputAt(0, value);
5118 } 5127 }
5119 5128
5120 Value* value() const { return InputAt(0); } 5129 Value* value() const { return InputAt(0); }
5121 5130
5122 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5131 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5123 5132
5124 virtual bool CanDeoptimize() const { return false; } 5133 virtual bool ComputeCanDeoptimize() const { return false; }
5125 5134
5126 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5135 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5127 ASSERT(idx == 0); 5136 ASSERT(idx == 0);
5128 return kUnboxedDouble; 5137 return kUnboxedDouble;
5129 } 5138 }
5130 5139
5131 PRINT_OPERANDS_TO_SUPPORT 5140 PRINT_OPERANDS_TO_SUPPORT
5132 5141
5133 DECLARE_INSTRUCTION(DoubleTestOp) 5142 DECLARE_INSTRUCTION(DoubleTestOp)
5134 virtual CompileType ComputeType() const; 5143 virtual CompileType ComputeType() const;
(...skipping 28 matching lines...) Expand all
5163 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5172 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5164 SetInputAt(0, left); 5173 SetInputAt(0, left);
5165 SetInputAt(1, right); 5174 SetInputAt(1, right);
5166 } 5175 }
5167 5176
5168 Value* left() const { return inputs_[0]; } 5177 Value* left() const { return inputs_[0]; }
5169 Value* right() const { return inputs_[1]; } 5178 Value* right() const { return inputs_[1]; }
5170 5179
5171 Token::Kind op_kind() const { return op_kind_; } 5180 Token::Kind op_kind() const { return op_kind_; }
5172 5181
5173 virtual bool CanDeoptimize() const { return false; } 5182 virtual bool ComputeCanDeoptimize() const { return false; }
5174 5183
5175 virtual Representation representation() const { return kUnboxedFloat32x4; } 5184 virtual Representation representation() const { return kUnboxedFloat32x4; }
5176 5185
5177 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5186 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5178 ASSERT((idx == 0) || (idx == 1)); 5187 ASSERT((idx == 0) || (idx == 1));
5179 return kUnboxedFloat32x4; 5188 return kUnboxedFloat32x4;
5180 } 5189 }
5181 5190
5182 virtual intptr_t DeoptimizationTarget() const { 5191 virtual intptr_t DeoptimizationTarget() const {
5183 // Direct access since this instruction cannot deoptimize, and the deopt-id 5192 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
5210 : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) { 5219 : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
5211 SetInputAt(0, value); 5220 SetInputAt(0, value);
5212 } 5221 }
5213 5222
5214 Value* value() const { return inputs_[0]; } 5223 Value* value() const { return inputs_[0]; }
5215 5224
5216 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5225 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5217 5226
5218 intptr_t mask() const { return mask_; } 5227 intptr_t mask() const { return mask_; }
5219 5228
5220 virtual bool CanDeoptimize() const { return false; } 5229 virtual bool ComputeCanDeoptimize() const { return false; }
5221 5230
5222 virtual Representation representation() const { 5231 virtual Representation representation() const {
5223 if ((op_kind_ == MethodRecognizer::kFloat32x4ShuffleX) || 5232 if ((op_kind_ == MethodRecognizer::kFloat32x4ShuffleX) ||
5224 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleY) || 5233 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleY) ||
5225 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleZ) || 5234 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleZ) ||
5226 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleW)) { 5235 (op_kind_ == MethodRecognizer::kFloat32x4ShuffleW)) {
5227 return kUnboxedDouble; 5236 return kUnboxedDouble;
5228 } 5237 }
5229 if ((op_kind_ == MethodRecognizer::kInt32x4Shuffle)) { 5238 if ((op_kind_ == MethodRecognizer::kInt32x4Shuffle)) {
5230 return kUnboxedInt32x4; 5239 return kUnboxedInt32x4;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
5282 SetInputAt(1, zw); 5291 SetInputAt(1, zw);
5283 } 5292 }
5284 5293
5285 Value* xy() const { return inputs_[0]; } 5294 Value* xy() const { return inputs_[0]; }
5286 Value* zw() const { return inputs_[1]; } 5295 Value* zw() const { return inputs_[1]; }
5287 5296
5288 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5297 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5289 5298
5290 intptr_t mask() const { return mask_; } 5299 intptr_t mask() const { return mask_; }
5291 5300
5292 virtual bool CanDeoptimize() const { return false; } 5301 virtual bool ComputeCanDeoptimize() const { return false; }
5293 5302
5294 virtual Representation representation() const { 5303 virtual Representation representation() const {
5295 if (op_kind() == MethodRecognizer::kInt32x4ShuffleMix) { 5304 if (op_kind() == MethodRecognizer::kInt32x4ShuffleMix) {
5296 return kUnboxedInt32x4; 5305 return kUnboxedInt32x4;
5297 } 5306 }
5298 ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix); 5307 ASSERT(op_kind() == MethodRecognizer::kFloat32x4ShuffleMix);
5299 return kUnboxedFloat32x4; 5308 return kUnboxedFloat32x4;
5300 } 5309 }
5301 5310
5302 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5311 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
5344 SetInputAt(1, value1); 5353 SetInputAt(1, value1);
5345 SetInputAt(2, value2); 5354 SetInputAt(2, value2);
5346 SetInputAt(3, value3); 5355 SetInputAt(3, value3);
5347 } 5356 }
5348 5357
5349 Value* value0() const { return inputs_[0]; } 5358 Value* value0() const { return inputs_[0]; }
5350 Value* value1() const { return inputs_[1]; } 5359 Value* value1() const { return inputs_[1]; }
5351 Value* value2() const { return inputs_[2]; } 5360 Value* value2() const { return inputs_[2]; }
5352 Value* value3() const { return inputs_[3]; } 5361 Value* value3() const { return inputs_[3]; }
5353 5362
5354 virtual bool CanDeoptimize() const { return false; } 5363 virtual bool ComputeCanDeoptimize() const { return false; }
5355 5364
5356 virtual Representation representation() const { return kUnboxedFloat32x4; } 5365 virtual Representation representation() const { return kUnboxedFloat32x4; }
5357 5366
5358 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5367 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5359 ASSERT(idx >= 0 && idx < 4); 5368 ASSERT(idx >= 0 && idx < 4);
5360 return kUnboxedDouble; 5369 return kUnboxedDouble;
5361 } 5370 }
5362 5371
5363 virtual intptr_t DeoptimizationTarget() const { 5372 virtual intptr_t DeoptimizationTarget() const {
5364 // Direct access since this instruction cannot deoptimize, and the deopt-id 5373 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 15 matching lines...) Expand all
5380 5389
5381 class Float32x4SplatInstr : public TemplateDefinition<1, NoThrow, Pure> { 5390 class Float32x4SplatInstr : public TemplateDefinition<1, NoThrow, Pure> {
5382 public: 5391 public:
5383 Float32x4SplatInstr(Value* value, intptr_t deopt_id) 5392 Float32x4SplatInstr(Value* value, intptr_t deopt_id)
5384 : TemplateDefinition(deopt_id) { 5393 : TemplateDefinition(deopt_id) {
5385 SetInputAt(0, value); 5394 SetInputAt(0, value);
5386 } 5395 }
5387 5396
5388 Value* value() const { return inputs_[0]; } 5397 Value* value() const { return inputs_[0]; }
5389 5398
5390 virtual bool CanDeoptimize() const { return false; } 5399 virtual bool ComputeCanDeoptimize() const { return false; }
5391 5400
5392 virtual Representation representation() const { return kUnboxedFloat32x4; } 5401 virtual Representation representation() const { return kUnboxedFloat32x4; }
5393 5402
5394 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5403 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5395 ASSERT(idx == 0); 5404 ASSERT(idx == 0);
5396 return kUnboxedDouble; 5405 return kUnboxedDouble;
5397 } 5406 }
5398 5407
5399 virtual intptr_t DeoptimizationTarget() const { 5408 virtual intptr_t DeoptimizationTarget() const {
5400 // Direct access since this instruction cannot deoptimize, and the deopt-id 5409 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 11 matching lines...) Expand all
5412 private: 5421 private:
5413 DISALLOW_COPY_AND_ASSIGN(Float32x4SplatInstr); 5422 DISALLOW_COPY_AND_ASSIGN(Float32x4SplatInstr);
5414 }; 5423 };
5415 5424
5416 5425
5417 // TODO(vegorov) replace with UnboxedConstantInstr. 5426 // TODO(vegorov) replace with UnboxedConstantInstr.
5418 class Float32x4ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> { 5427 class Float32x4ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
5419 public: 5428 public:
5420 Float32x4ZeroInstr() {} 5429 Float32x4ZeroInstr() {}
5421 5430
5422 virtual bool CanDeoptimize() const { return false; } 5431 virtual bool ComputeCanDeoptimize() const { return false; }
5423 5432
5424 virtual Representation representation() const { return kUnboxedFloat32x4; } 5433 virtual Representation representation() const { return kUnboxedFloat32x4; }
5425 5434
5426 DECLARE_INSTRUCTION(Float32x4Zero) 5435 DECLARE_INSTRUCTION(Float32x4Zero)
5427 virtual CompileType ComputeType() const; 5436 virtual CompileType ComputeType() const;
5428 5437
5429 virtual bool AttributesEqual(Instruction* other) const { return true; } 5438 virtual bool AttributesEqual(Instruction* other) const { return true; }
5430 5439
5431 private: 5440 private:
5432 DISALLOW_COPY_AND_ASSIGN(Float32x4ZeroInstr); 5441 DISALLOW_COPY_AND_ASSIGN(Float32x4ZeroInstr);
5433 }; 5442 };
5434 5443
5435 5444
5436 class Float32x4ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { 5445 class Float32x4ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> {
5437 public: 5446 public:
5438 Float32x4ComparisonInstr(MethodRecognizer::Kind op_kind, 5447 Float32x4ComparisonInstr(MethodRecognizer::Kind op_kind,
5439 Value* left, 5448 Value* left,
5440 Value* right, 5449 Value* right,
5441 intptr_t deopt_id) 5450 intptr_t deopt_id)
5442 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5451 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5443 SetInputAt(0, left); 5452 SetInputAt(0, left);
5444 SetInputAt(1, right); 5453 SetInputAt(1, right);
5445 } 5454 }
5446 5455
5447 Value* left() const { return inputs_[0]; } 5456 Value* left() const { return inputs_[0]; }
5448 Value* right() const { return inputs_[1]; } 5457 Value* right() const { return inputs_[1]; }
5449 5458
5450 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5459 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5451 5460
5452 virtual bool CanDeoptimize() const { return false; } 5461 virtual bool ComputeCanDeoptimize() const { return false; }
5453 5462
5454 virtual Representation representation() const { return kUnboxedInt32x4; } 5463 virtual Representation representation() const { return kUnboxedInt32x4; }
5455 5464
5456 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5465 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5457 ASSERT((idx == 0) || (idx == 1)); 5466 ASSERT((idx == 0) || (idx == 1));
5458 return kUnboxedFloat32x4; 5467 return kUnboxedFloat32x4;
5459 } 5468 }
5460 5469
5461 virtual intptr_t DeoptimizationTarget() const { 5470 virtual intptr_t DeoptimizationTarget() const {
5462 // Direct access since this instruction cannot deoptimize, and the deopt-id 5471 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
5489 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5498 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5490 SetInputAt(0, left); 5499 SetInputAt(0, left);
5491 SetInputAt(1, right); 5500 SetInputAt(1, right);
5492 } 5501 }
5493 5502
5494 Value* left() const { return inputs_[0]; } 5503 Value* left() const { return inputs_[0]; }
5495 Value* right() const { return inputs_[1]; } 5504 Value* right() const { return inputs_[1]; }
5496 5505
5497 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5506 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5498 5507
5499 virtual bool CanDeoptimize() const { return false; } 5508 virtual bool ComputeCanDeoptimize() const { return false; }
5500 5509
5501 virtual Representation representation() const { return kUnboxedFloat32x4; } 5510 virtual Representation representation() const { return kUnboxedFloat32x4; }
5502 5511
5503 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5512 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5504 ASSERT((idx == 0) || (idx == 1)); 5513 ASSERT((idx == 0) || (idx == 1));
5505 return kUnboxedFloat32x4; 5514 return kUnboxedFloat32x4;
5506 } 5515 }
5507 5516
5508 virtual intptr_t DeoptimizationTarget() const { 5517 virtual intptr_t DeoptimizationTarget() const {
5509 // Direct access since this instruction cannot deoptimize, and the deopt-id 5518 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
5536 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5545 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5537 SetInputAt(0, left); 5546 SetInputAt(0, left);
5538 SetInputAt(1, right); 5547 SetInputAt(1, right);
5539 } 5548 }
5540 5549
5541 Value* left() const { return inputs_[0]; } 5550 Value* left() const { return inputs_[0]; }
5542 Value* right() const { return inputs_[1]; } 5551 Value* right() const { return inputs_[1]; }
5543 5552
5544 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5553 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5545 5554
5546 virtual bool CanDeoptimize() const { return false; } 5555 virtual bool ComputeCanDeoptimize() const { return false; }
5547 5556
5548 virtual Representation representation() const { return kUnboxedFloat32x4; } 5557 virtual Representation representation() const { return kUnboxedFloat32x4; }
5549 5558
5550 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5559 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5551 ASSERT((idx == 0) || (idx == 1)); 5560 ASSERT((idx == 0) || (idx == 1));
5552 if (idx == 0) { 5561 if (idx == 0) {
5553 return kUnboxedDouble; 5562 return kUnboxedDouble;
5554 } 5563 }
5555 return kUnboxedFloat32x4; 5564 return kUnboxedFloat32x4;
5556 } 5565 }
(...skipping 26 matching lines...) Expand all
5583 Value* left, 5592 Value* left,
5584 intptr_t deopt_id) 5593 intptr_t deopt_id)
5585 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5594 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5586 SetInputAt(0, left); 5595 SetInputAt(0, left);
5587 } 5596 }
5588 5597
5589 Value* left() const { return inputs_[0]; } 5598 Value* left() const { return inputs_[0]; }
5590 5599
5591 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5600 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5592 5601
5593 virtual bool CanDeoptimize() const { return false; } 5602 virtual bool ComputeCanDeoptimize() const { return false; }
5594 5603
5595 virtual Representation representation() const { return kUnboxedFloat32x4; } 5604 virtual Representation representation() const { return kUnboxedFloat32x4; }
5596 5605
5597 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5606 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5598 ASSERT(idx == 0); 5607 ASSERT(idx == 0);
5599 return kUnboxedFloat32x4; 5608 return kUnboxedFloat32x4;
5600 } 5609 }
5601 5610
5602 virtual intptr_t DeoptimizationTarget() const { 5611 virtual intptr_t DeoptimizationTarget() const {
5603 // Direct access since this instruction cannot deoptimize, and the deopt-id 5612 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 24 matching lines...) Expand all
5628 Value* left, 5637 Value* left,
5629 intptr_t deopt_id) 5638 intptr_t deopt_id)
5630 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5639 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5631 SetInputAt(0, left); 5640 SetInputAt(0, left);
5632 } 5641 }
5633 5642
5634 Value* left() const { return inputs_[0]; } 5643 Value* left() const { return inputs_[0]; }
5635 5644
5636 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5645 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5637 5646
5638 virtual bool CanDeoptimize() const { return false; } 5647 virtual bool ComputeCanDeoptimize() const { return false; }
5639 5648
5640 virtual Representation representation() const { return kUnboxedFloat32x4; } 5649 virtual Representation representation() const { return kUnboxedFloat32x4; }
5641 5650
5642 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5651 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5643 ASSERT(idx == 0); 5652 ASSERT(idx == 0);
5644 return kUnboxedFloat32x4; 5653 return kUnboxedFloat32x4;
5645 } 5654 }
5646 5655
5647 virtual intptr_t DeoptimizationTarget() const { 5656 virtual intptr_t DeoptimizationTarget() const {
5648 // Direct access since this instruction cannot deoptimize, and the deopt-id 5657 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
5675 : TemplateDefinition(deopt_id) { 5684 : TemplateDefinition(deopt_id) {
5676 SetInputAt(0, left); 5685 SetInputAt(0, left);
5677 SetInputAt(1, lower); 5686 SetInputAt(1, lower);
5678 SetInputAt(2, upper); 5687 SetInputAt(2, upper);
5679 } 5688 }
5680 5689
5681 Value* left() const { return inputs_[0]; } 5690 Value* left() const { return inputs_[0]; }
5682 Value* lower() const { return inputs_[1]; } 5691 Value* lower() const { return inputs_[1]; }
5683 Value* upper() const { return inputs_[2]; } 5692 Value* upper() const { return inputs_[2]; }
5684 5693
5685 virtual bool CanDeoptimize() const { return false; } 5694 virtual bool ComputeCanDeoptimize() const { return false; }
5686 5695
5687 virtual Representation representation() const { return kUnboxedFloat32x4; } 5696 virtual Representation representation() const { return kUnboxedFloat32x4; }
5688 5697
5689 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5698 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5690 ASSERT((idx == 0) || (idx == 1) || (idx == 2)); 5699 ASSERT((idx == 0) || (idx == 1) || (idx == 2));
5691 return kUnboxedFloat32x4; 5700 return kUnboxedFloat32x4;
5692 } 5701 }
5693 5702
5694 virtual intptr_t DeoptimizationTarget() const { 5703 virtual intptr_t DeoptimizationTarget() const {
5695 // Direct access since this instruction cannot deoptimize, and the deopt-id 5704 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 22 matching lines...) Expand all
5718 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 5727 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
5719 SetInputAt(0, replacement); 5728 SetInputAt(0, replacement);
5720 SetInputAt(1, left); 5729 SetInputAt(1, left);
5721 } 5730 }
5722 5731
5723 Value* left() const { return inputs_[1]; } 5732 Value* left() const { return inputs_[1]; }
5724 Value* replacement() const { return inputs_[0]; } 5733 Value* replacement() const { return inputs_[0]; }
5725 5734
5726 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5735 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5727 5736
5728 virtual bool CanDeoptimize() const { return false; } 5737 virtual bool ComputeCanDeoptimize() const { return false; }
5729 5738
5730 virtual Representation representation() const { return kUnboxedFloat32x4; } 5739 virtual Representation representation() const { return kUnboxedFloat32x4; }
5731 5740
5732 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5741 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5733 ASSERT((idx == 0) || (idx == 1)); 5742 ASSERT((idx == 0) || (idx == 1));
5734 if (idx == 0) { 5743 if (idx == 0) {
5735 return kUnboxedDouble; 5744 return kUnboxedDouble;
5736 } 5745 }
5737 return kUnboxedFloat32x4; 5746 return kUnboxedFloat32x4;
5738 } 5747 }
(...skipping 29 matching lines...) Expand all
5768 : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) { 5777 : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
5769 SetInputAt(0, value); 5778 SetInputAt(0, value);
5770 } 5779 }
5771 5780
5772 Value* value() const { return inputs_[0]; } 5781 Value* value() const { return inputs_[0]; }
5773 5782
5774 MethodRecognizer::Kind op_kind() const { return op_kind_; } 5783 MethodRecognizer::Kind op_kind() const { return op_kind_; }
5775 5784
5776 intptr_t mask() const { return mask_; } 5785 intptr_t mask() const { return mask_; }
5777 5786
5778 virtual bool CanDeoptimize() const { return false; } 5787 virtual bool ComputeCanDeoptimize() const { return false; }
5779 5788
5780 virtual Representation representation() const { 5789 virtual Representation representation() const {
5781 if ((op_kind_ == MethodRecognizer::kFloat64x2GetX) || 5790 if ((op_kind_ == MethodRecognizer::kFloat64x2GetX) ||
5782 (op_kind_ == MethodRecognizer::kFloat64x2GetY)) { 5791 (op_kind_ == MethodRecognizer::kFloat64x2GetY)) {
5783 return kUnboxedDouble; 5792 return kUnboxedDouble;
5784 } 5793 }
5785 UNIMPLEMENTED(); 5794 UNIMPLEMENTED();
5786 return kUnboxedDouble; 5795 return kUnboxedDouble;
5787 } 5796 }
5788 5797
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5822 5831
5823 class Float32x4ToInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> { 5832 class Float32x4ToInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
5824 public: 5833 public:
5825 Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id) 5834 Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id)
5826 : TemplateDefinition(deopt_id) { 5835 : TemplateDefinition(deopt_id) {
5827 SetInputAt(0, left); 5836 SetInputAt(0, left);
5828 } 5837 }
5829 5838
5830 Value* left() const { return inputs_[0]; } 5839 Value* left() const { return inputs_[0]; }
5831 5840
5832 virtual bool CanDeoptimize() const { return false; } 5841 virtual bool ComputeCanDeoptimize() const { return false; }
5833 5842
5834 virtual Representation representation() const { return kUnboxedInt32x4; } 5843 virtual Representation representation() const { return kUnboxedInt32x4; }
5835 5844
5836 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5845 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5837 ASSERT(idx == 0); 5846 ASSERT(idx == 0);
5838 return kUnboxedFloat32x4; 5847 return kUnboxedFloat32x4;
5839 } 5848 }
5840 5849
5841 virtual intptr_t DeoptimizationTarget() const { 5850 virtual intptr_t DeoptimizationTarget() const {
5842 // Direct access since this instruction cannot deoptimize, and the deopt-id 5851 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 15 matching lines...) Expand all
5858 5867
5859 class Float32x4ToFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> { 5868 class Float32x4ToFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
5860 public: 5869 public:
5861 Float32x4ToFloat64x2Instr(Value* left, intptr_t deopt_id) 5870 Float32x4ToFloat64x2Instr(Value* left, intptr_t deopt_id)
5862 : TemplateDefinition(deopt_id) { 5871 : TemplateDefinition(deopt_id) {
5863 SetInputAt(0, left); 5872 SetInputAt(0, left);
5864 } 5873 }
5865 5874
5866 Value* left() const { return inputs_[0]; } 5875 Value* left() const { return inputs_[0]; }
5867 5876
5868 virtual bool CanDeoptimize() const { return false; } 5877 virtual bool ComputeCanDeoptimize() const { return false; }
5869 5878
5870 virtual Representation representation() const { return kUnboxedFloat64x2; } 5879 virtual Representation representation() const { return kUnboxedFloat64x2; }
5871 5880
5872 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5881 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5873 ASSERT(idx == 0); 5882 ASSERT(idx == 0);
5874 return kUnboxedFloat32x4; 5883 return kUnboxedFloat32x4;
5875 } 5884 }
5876 5885
5877 virtual intptr_t DeoptimizationTarget() const { 5886 virtual intptr_t DeoptimizationTarget() const {
5878 // Direct access since this instruction cannot deoptimize, and the deopt-id 5887 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 15 matching lines...) Expand all
5894 5903
5895 class Float64x2ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> { 5904 class Float64x2ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
5896 public: 5905 public:
5897 Float64x2ToFloat32x4Instr(Value* left, intptr_t deopt_id) 5906 Float64x2ToFloat32x4Instr(Value* left, intptr_t deopt_id)
5898 : TemplateDefinition(deopt_id) { 5907 : TemplateDefinition(deopt_id) {
5899 SetInputAt(0, left); 5908 SetInputAt(0, left);
5900 } 5909 }
5901 5910
5902 Value* left() const { return inputs_[0]; } 5911 Value* left() const { return inputs_[0]; }
5903 5912
5904 virtual bool CanDeoptimize() const { return false; } 5913 virtual bool ComputeCanDeoptimize() const { return false; }
5905 5914
5906 virtual Representation representation() const { return kUnboxedFloat32x4; } 5915 virtual Representation representation() const { return kUnboxedFloat32x4; }
5907 5916
5908 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5917 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5909 ASSERT(idx == 0); 5918 ASSERT(idx == 0);
5910 return kUnboxedFloat64x2; 5919 return kUnboxedFloat64x2;
5911 } 5920 }
5912 5921
5913 virtual intptr_t DeoptimizationTarget() const { 5922 virtual intptr_t DeoptimizationTarget() const {
5914 // Direct access since this instruction cannot deoptimize, and the deopt-id 5923 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 17 matching lines...) Expand all
5932 public: 5941 public:
5933 Float64x2ConstructorInstr(Value* value0, Value* value1, intptr_t deopt_id) 5942 Float64x2ConstructorInstr(Value* value0, Value* value1, intptr_t deopt_id)
5934 : TemplateDefinition(deopt_id) { 5943 : TemplateDefinition(deopt_id) {
5935 SetInputAt(0, value0); 5944 SetInputAt(0, value0);
5936 SetInputAt(1, value1); 5945 SetInputAt(1, value1);
5937 } 5946 }
5938 5947
5939 Value* value0() const { return inputs_[0]; } 5948 Value* value0() const { return inputs_[0]; }
5940 Value* value1() const { return inputs_[1]; } 5949 Value* value1() const { return inputs_[1]; }
5941 5950
5942 virtual bool CanDeoptimize() const { return false; } 5951 virtual bool ComputeCanDeoptimize() const { return false; }
5943 5952
5944 virtual Representation representation() const { return kUnboxedFloat64x2; } 5953 virtual Representation representation() const { return kUnboxedFloat64x2; }
5945 5954
5946 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5955 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5947 ASSERT(idx >= 0 && idx < 2); 5956 ASSERT(idx >= 0 && idx < 2);
5948 return kUnboxedDouble; 5957 return kUnboxedDouble;
5949 } 5958 }
5950 5959
5951 virtual intptr_t DeoptimizationTarget() const { 5960 virtual intptr_t DeoptimizationTarget() const {
5952 // Direct access since this instruction cannot deoptimize, and the deopt-id 5961 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 15 matching lines...) Expand all
5968 5977
5969 class Float64x2SplatInstr : public TemplateDefinition<1, NoThrow, Pure> { 5978 class Float64x2SplatInstr : public TemplateDefinition<1, NoThrow, Pure> {
5970 public: 5979 public:
5971 Float64x2SplatInstr(Value* value, intptr_t deopt_id) 5980 Float64x2SplatInstr(Value* value, intptr_t deopt_id)
5972 : TemplateDefinition(deopt_id) { 5981 : TemplateDefinition(deopt_id) {
5973 SetInputAt(0, value); 5982 SetInputAt(0, value);
5974 } 5983 }
5975 5984
5976 Value* value() const { return inputs_[0]; } 5985 Value* value() const { return inputs_[0]; }
5977 5986
5978 virtual bool CanDeoptimize() const { return false; } 5987 virtual bool ComputeCanDeoptimize() const { return false; }
5979 5988
5980 virtual Representation representation() const { return kUnboxedFloat64x2; } 5989 virtual Representation representation() const { return kUnboxedFloat64x2; }
5981 5990
5982 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5991 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
5983 ASSERT(idx == 0); 5992 ASSERT(idx == 0);
5984 return kUnboxedDouble; 5993 return kUnboxedDouble;
5985 } 5994 }
5986 5995
5987 virtual intptr_t DeoptimizationTarget() const { 5996 virtual intptr_t DeoptimizationTarget() const {
5988 // Direct access since this instruction cannot deoptimize, and the deopt-id 5997 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 10 matching lines...) Expand all
5999 6008
6000 private: 6009 private:
6001 DISALLOW_COPY_AND_ASSIGN(Float64x2SplatInstr); 6010 DISALLOW_COPY_AND_ASSIGN(Float64x2SplatInstr);
6002 }; 6011 };
6003 6012
6004 6013
6005 class Float64x2ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> { 6014 class Float64x2ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
6006 public: 6015 public:
6007 Float64x2ZeroInstr() {} 6016 Float64x2ZeroInstr() {}
6008 6017
6009 virtual bool CanDeoptimize() const { return false; } 6018 virtual bool ComputeCanDeoptimize() const { return false; }
6010 6019
6011 virtual Representation representation() const { return kUnboxedFloat64x2; } 6020 virtual Representation representation() const { return kUnboxedFloat64x2; }
6012 6021
6013 DECLARE_INSTRUCTION(Float64x2Zero) 6022 DECLARE_INSTRUCTION(Float64x2Zero)
6014 virtual CompileType ComputeType() const; 6023 virtual CompileType ComputeType() const;
6015 6024
6016 virtual bool AttributesEqual(Instruction* other) const { return true; } 6025 virtual bool AttributesEqual(Instruction* other) const { return true; }
6017 6026
6018 private: 6027 private:
6019 DISALLOW_COPY_AND_ASSIGN(Float64x2ZeroInstr); 6028 DISALLOW_COPY_AND_ASSIGN(Float64x2ZeroInstr);
6020 }; 6029 };
6021 6030
6022 6031
6023 // TODO(vegorov) rename to Unary to match arithmetic instructions. 6032 // TODO(vegorov) rename to Unary to match arithmetic instructions.
6024 class Float64x2ZeroArgInstr : public TemplateDefinition<1, NoThrow, Pure> { 6033 class Float64x2ZeroArgInstr : public TemplateDefinition<1, NoThrow, Pure> {
6025 public: 6034 public:
6026 Float64x2ZeroArgInstr(MethodRecognizer::Kind op_kind, 6035 Float64x2ZeroArgInstr(MethodRecognizer::Kind op_kind,
6027 Value* left, 6036 Value* left,
6028 intptr_t deopt_id) 6037 intptr_t deopt_id)
6029 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6038 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6030 SetInputAt(0, left); 6039 SetInputAt(0, left);
6031 } 6040 }
6032 6041
6033 Value* left() const { return inputs_[0]; } 6042 Value* left() const { return inputs_[0]; }
6034 6043
6035 MethodRecognizer::Kind op_kind() const { return op_kind_; } 6044 MethodRecognizer::Kind op_kind() const { return op_kind_; }
6036 6045
6037 virtual bool CanDeoptimize() const { return false; } 6046 virtual bool ComputeCanDeoptimize() const { return false; }
6038 6047
6039 virtual Representation representation() const { 6048 virtual Representation representation() const {
6040 if (op_kind() == MethodRecognizer::kFloat64x2GetSignMask) { 6049 if (op_kind() == MethodRecognizer::kFloat64x2GetSignMask) {
6041 // Smi. 6050 // Smi.
6042 return kTagged; 6051 return kTagged;
6043 } 6052 }
6044 return kUnboxedFloat64x2; 6053 return kUnboxedFloat64x2;
6045 } 6054 }
6046 6055
6047 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6056 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
6080 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6089 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6081 SetInputAt(0, left); 6090 SetInputAt(0, left);
6082 SetInputAt(1, right); 6091 SetInputAt(1, right);
6083 } 6092 }
6084 6093
6085 Value* left() const { return inputs_[0]; } 6094 Value* left() const { return inputs_[0]; }
6086 Value* right() const { return inputs_[1]; } 6095 Value* right() const { return inputs_[1]; }
6087 6096
6088 MethodRecognizer::Kind op_kind() const { return op_kind_; } 6097 MethodRecognizer::Kind op_kind() const { return op_kind_; }
6089 6098
6090 virtual bool CanDeoptimize() const { return false; } 6099 virtual bool ComputeCanDeoptimize() const { return false; }
6091 6100
6092 virtual Representation representation() const { return kUnboxedFloat64x2; } 6101 virtual Representation representation() const { return kUnboxedFloat64x2; }
6093 6102
6094 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6103 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6095 if (idx == 0) { 6104 if (idx == 0) {
6096 return kUnboxedFloat64x2; 6105 return kUnboxedFloat64x2;
6097 } 6106 }
6098 ASSERT(idx == 1); 6107 ASSERT(idx == 1);
6099 if ((op_kind() == MethodRecognizer::kFloat64x2WithX) || 6108 if ((op_kind() == MethodRecognizer::kFloat64x2WithX) ||
6100 (op_kind() == MethodRecognizer::kFloat64x2WithY) || 6109 (op_kind() == MethodRecognizer::kFloat64x2WithY) ||
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
6138 SetInputAt(1, value1); 6147 SetInputAt(1, value1);
6139 SetInputAt(2, value2); 6148 SetInputAt(2, value2);
6140 SetInputAt(3, value3); 6149 SetInputAt(3, value3);
6141 } 6150 }
6142 6151
6143 Value* value0() const { return inputs_[0]; } 6152 Value* value0() const { return inputs_[0]; }
6144 Value* value1() const { return inputs_[1]; } 6153 Value* value1() const { return inputs_[1]; }
6145 Value* value2() const { return inputs_[2]; } 6154 Value* value2() const { return inputs_[2]; }
6146 Value* value3() const { return inputs_[3]; } 6155 Value* value3() const { return inputs_[3]; }
6147 6156
6148 virtual bool CanDeoptimize() const { return false; } 6157 virtual bool ComputeCanDeoptimize() const { return false; }
6149 6158
6150 virtual Representation representation() const { return kUnboxedInt32x4; } 6159 virtual Representation representation() const { return kUnboxedInt32x4; }
6151 6160
6152 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6161 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6153 ASSERT((idx >= 0) && (idx < 4)); 6162 ASSERT((idx >= 0) && (idx < 4));
6154 return kUnboxedInt32; 6163 return kUnboxedInt32;
6155 } 6164 }
6156 6165
6157 virtual intptr_t DeoptimizationTarget() const { 6166 virtual intptr_t DeoptimizationTarget() const {
6158 // Direct access since this instruction cannot deoptimize, and the deopt-id 6167 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
6185 SetInputAt(1, value1); 6194 SetInputAt(1, value1);
6186 SetInputAt(2, value2); 6195 SetInputAt(2, value2);
6187 SetInputAt(3, value3); 6196 SetInputAt(3, value3);
6188 } 6197 }
6189 6198
6190 Value* value0() const { return inputs_[0]; } 6199 Value* value0() const { return inputs_[0]; }
6191 Value* value1() const { return inputs_[1]; } 6200 Value* value1() const { return inputs_[1]; }
6192 Value* value2() const { return inputs_[2]; } 6201 Value* value2() const { return inputs_[2]; }
6193 Value* value3() const { return inputs_[3]; } 6202 Value* value3() const { return inputs_[3]; }
6194 6203
6195 virtual bool CanDeoptimize() const { return false; } 6204 virtual bool ComputeCanDeoptimize() const { return false; }
6196 6205
6197 virtual Representation representation() const { return kUnboxedInt32x4; } 6206 virtual Representation representation() const { return kUnboxedInt32x4; }
6198 6207
6199 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6208 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6200 ASSERT((idx >= 0) && (idx < 4)); 6209 ASSERT((idx >= 0) && (idx < 4));
6201 return kTagged; 6210 return kTagged;
6202 } 6211 }
6203 6212
6204 virtual intptr_t DeoptimizationTarget() const { 6213 virtual intptr_t DeoptimizationTarget() const {
6205 // Direct access since this instruction cannot deoptimize, and the deopt-id 6214 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 19 matching lines...) Expand all
6225 Value* value, 6234 Value* value,
6226 intptr_t deopt_id) 6235 intptr_t deopt_id)
6227 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6236 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6228 SetInputAt(0, value); 6237 SetInputAt(0, value);
6229 } 6238 }
6230 6239
6231 Value* value() const { return inputs_[0]; } 6240 Value* value() const { return inputs_[0]; }
6232 6241
6233 MethodRecognizer::Kind op_kind() const { return op_kind_; } 6242 MethodRecognizer::Kind op_kind() const { return op_kind_; }
6234 6243
6235 virtual bool CanDeoptimize() const { return false; } 6244 virtual bool ComputeCanDeoptimize() const { return false; }
6236 6245
6237 virtual Representation representation() const { return kTagged; } 6246 virtual Representation representation() const { return kTagged; }
6238 6247
6239 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6248 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6240 ASSERT(idx == 0); 6249 ASSERT(idx == 0);
6241 return kUnboxedInt32x4; 6250 return kUnboxedInt32x4;
6242 } 6251 }
6243 6252
6244 virtual intptr_t DeoptimizationTarget() const { 6253 virtual intptr_t DeoptimizationTarget() const {
6245 // Direct access since this instruction cannot deoptimize, and the deopt-id 6254 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 23 matching lines...) Expand all
6269 Value* value, 6278 Value* value,
6270 intptr_t deopt_id) 6279 intptr_t deopt_id)
6271 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6280 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6272 SetInputAt(0, value); 6281 SetInputAt(0, value);
6273 } 6282 }
6274 6283
6275 Value* value() const { return inputs_[0]; } 6284 Value* value() const { return inputs_[0]; }
6276 6285
6277 MethodRecognizer::Kind op_kind() const { return op_kind_; } 6286 MethodRecognizer::Kind op_kind() const { return op_kind_; }
6278 6287
6279 virtual bool CanDeoptimize() const { return false; } 6288 virtual bool ComputeCanDeoptimize() const { return false; }
6280 6289
6281 virtual Representation representation() const { return kTagged; } 6290 virtual Representation representation() const { return kTagged; }
6282 6291
6283 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6292 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6284 ASSERT(idx == 0); 6293 ASSERT(idx == 0);
6285 if (op_kind_ == MethodRecognizer::kFloat32x4GetSignMask) { 6294 if (op_kind_ == MethodRecognizer::kFloat32x4GetSignMask) {
6286 return kUnboxedFloat32x4; 6295 return kUnboxedFloat32x4;
6287 } 6296 }
6288 ASSERT(op_kind_ == MethodRecognizer::kInt32x4GetSignMask); 6297 ASSERT(op_kind_ == MethodRecognizer::kInt32x4GetSignMask);
6289 return kUnboxedInt32x4; 6298 return kUnboxedInt32x4;
(...skipping 30 matching lines...) Expand all
6320 : TemplateDefinition(deopt_id) { 6329 : TemplateDefinition(deopt_id) {
6321 SetInputAt(0, mask); 6330 SetInputAt(0, mask);
6322 SetInputAt(1, trueValue); 6331 SetInputAt(1, trueValue);
6323 SetInputAt(2, falseValue); 6332 SetInputAt(2, falseValue);
6324 } 6333 }
6325 6334
6326 Value* mask() const { return inputs_[0]; } 6335 Value* mask() const { return inputs_[0]; }
6327 Value* trueValue() const { return inputs_[1]; } 6336 Value* trueValue() const { return inputs_[1]; }
6328 Value* falseValue() const { return inputs_[2]; } 6337 Value* falseValue() const { return inputs_[2]; }
6329 6338
6330 virtual bool CanDeoptimize() const { return false; } 6339 virtual bool ComputeCanDeoptimize() const { return false; }
6331 6340
6332 virtual Representation representation() const { return kUnboxedFloat32x4; } 6341 virtual Representation representation() const { return kUnboxedFloat32x4; }
6333 6342
6334 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6343 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6335 ASSERT((idx == 0) || (idx == 1) || (idx == 2)); 6344 ASSERT((idx == 0) || (idx == 1) || (idx == 2));
6336 if (idx == 0) { 6345 if (idx == 0) {
6337 return kUnboxedInt32x4; 6346 return kUnboxedInt32x4;
6338 } 6347 }
6339 return kUnboxedFloat32x4; 6348 return kUnboxedFloat32x4;
6340 } 6349 }
(...skipping 25 matching lines...) Expand all
6366 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6375 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6367 SetInputAt(0, value); 6376 SetInputAt(0, value);
6368 SetInputAt(1, flagValue); 6377 SetInputAt(1, flagValue);
6369 } 6378 }
6370 6379
6371 Value* value() const { return inputs_[0]; } 6380 Value* value() const { return inputs_[0]; }
6372 Value* flagValue() const { return inputs_[1]; } 6381 Value* flagValue() const { return inputs_[1]; }
6373 6382
6374 MethodRecognizer::Kind op_kind() const { return op_kind_; } 6383 MethodRecognizer::Kind op_kind() const { return op_kind_; }
6375 6384
6376 virtual bool CanDeoptimize() const { return false; } 6385 virtual bool ComputeCanDeoptimize() const { return false; }
6377 6386
6378 virtual Representation representation() const { return kUnboxedInt32x4; } 6387 virtual Representation representation() const { return kUnboxedInt32x4; }
6379 6388
6380 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6389 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6381 ASSERT((idx == 0) || (idx == 1)); 6390 ASSERT((idx == 0) || (idx == 1));
6382 if (idx == 1) { 6391 if (idx == 1) {
6383 return kTagged; 6392 return kTagged;
6384 } 6393 }
6385 return kUnboxedInt32x4; 6394 return kUnboxedInt32x4;
6386 } 6395 }
(...skipping 22 matching lines...) Expand all
6409 6418
6410 class Int32x4ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> { 6419 class Int32x4ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
6411 public: 6420 public:
6412 Int32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id) 6421 Int32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id)
6413 : TemplateDefinition(deopt_id) { 6422 : TemplateDefinition(deopt_id) {
6414 SetInputAt(0, left); 6423 SetInputAt(0, left);
6415 } 6424 }
6416 6425
6417 Value* left() const { return inputs_[0]; } 6426 Value* left() const { return inputs_[0]; }
6418 6427
6419 virtual bool CanDeoptimize() const { return false; } 6428 virtual bool ComputeCanDeoptimize() const { return false; }
6420 6429
6421 virtual Representation representation() const { return kUnboxedFloat32x4; } 6430 virtual Representation representation() const { return kUnboxedFloat32x4; }
6422 6431
6423 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6432 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6424 ASSERT(idx == 0); 6433 ASSERT(idx == 0);
6425 return kUnboxedInt32x4; 6434 return kUnboxedInt32x4;
6426 } 6435 }
6427 6436
6428 virtual intptr_t DeoptimizationTarget() const { 6437 virtual intptr_t DeoptimizationTarget() const {
6429 // Direct access since this instruction cannot deoptimize, and the deopt-id 6438 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 22 matching lines...) Expand all
6452 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6461 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6453 SetInputAt(0, left); 6462 SetInputAt(0, left);
6454 SetInputAt(1, right); 6463 SetInputAt(1, right);
6455 } 6464 }
6456 6465
6457 Value* left() const { return inputs_[0]; } 6466 Value* left() const { return inputs_[0]; }
6458 Value* right() const { return inputs_[1]; } 6467 Value* right() const { return inputs_[1]; }
6459 6468
6460 Token::Kind op_kind() const { return op_kind_; } 6469 Token::Kind op_kind() const { return op_kind_; }
6461 6470
6462 virtual bool CanDeoptimize() const { return false; } 6471 virtual bool ComputeCanDeoptimize() const { return false; }
6463 6472
6464 virtual Representation representation() const { return kUnboxedInt32x4; } 6473 virtual Representation representation() const { return kUnboxedInt32x4; }
6465 6474
6466 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6475 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6467 ASSERT((idx == 0) || (idx == 1)); 6476 ASSERT((idx == 0) || (idx == 1));
6468 return kUnboxedInt32x4; 6477 return kUnboxedInt32x4;
6469 } 6478 }
6470 6479
6471 virtual intptr_t DeoptimizationTarget() const { 6480 virtual intptr_t DeoptimizationTarget() const {
6472 // Direct access since this instruction cannot deoptimize, and the deopt-id 6481 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 26 matching lines...) Expand all
6499 : TemplateDefinition(deopt_id), op_kind_(op_kind) { 6508 : TemplateDefinition(deopt_id), op_kind_(op_kind) {
6500 SetInputAt(0, left); 6509 SetInputAt(0, left);
6501 SetInputAt(1, right); 6510 SetInputAt(1, right);
6502 } 6511 }
6503 6512
6504 Value* left() const { return inputs_[0]; } 6513 Value* left() const { return inputs_[0]; }
6505 Value* right() const { return inputs_[1]; } 6514 Value* right() const { return inputs_[1]; }
6506 6515
6507 Token::Kind op_kind() const { return op_kind_; } 6516 Token::Kind op_kind() const { return op_kind_; }
6508 6517
6509 virtual bool CanDeoptimize() const { return false; } 6518 virtual bool ComputeCanDeoptimize() const { return false; }
6510 6519
6511 virtual Representation representation() const { return kUnboxedFloat64x2; } 6520 virtual Representation representation() const { return kUnboxedFloat64x2; }
6512 6521
6513 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6522 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6514 ASSERT((idx == 0) || (idx == 1)); 6523 ASSERT((idx == 0) || (idx == 1));
6515 return kUnboxedFloat64x2; 6524 return kUnboxedFloat64x2;
6516 } 6525 }
6517 6526
6518 virtual intptr_t DeoptimizationTarget() const { 6527 virtual intptr_t DeoptimizationTarget() const {
6519 // Direct access since this instruction cannot deoptimize, and the deopt-id 6528 // Direct access since this instruction cannot deoptimize, and the deopt-id
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
6574 const Token::Kind op_kind_; 6583 const Token::Kind op_kind_;
6575 }; 6584 };
6576 6585
6577 6586
6578 // Handles both Smi operations: BIT_OR and NEGATE. 6587 // Handles both Smi operations: BIT_OR and NEGATE.
6579 class UnarySmiOpInstr : public UnaryIntegerOpInstr { 6588 class UnarySmiOpInstr : public UnaryIntegerOpInstr {
6580 public: 6589 public:
6581 UnarySmiOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id) 6590 UnarySmiOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
6582 : UnaryIntegerOpInstr(op_kind, value, deopt_id) {} 6591 : UnaryIntegerOpInstr(op_kind, value, deopt_id) {}
6583 6592
6584 virtual bool CanDeoptimize() const { return op_kind() == Token::kNEGATE; } 6593 virtual bool ComputeCanDeoptimize() const {
6594 return op_kind() == Token::kNEGATE;
6595 }
6585 6596
6586 virtual CompileType ComputeType() const; 6597 virtual CompileType ComputeType() const;
6587 6598
6588 DECLARE_INSTRUCTION(UnarySmiOp) 6599 DECLARE_INSTRUCTION(UnarySmiOp)
6589 6600
6590 private: 6601 private:
6591 DISALLOW_COPY_AND_ASSIGN(UnarySmiOpInstr); 6602 DISALLOW_COPY_AND_ASSIGN(UnarySmiOpInstr);
6592 }; 6603 };
6593 6604
6594 6605
6595 class UnaryUint32OpInstr : public UnaryIntegerOpInstr { 6606 class UnaryUint32OpInstr : public UnaryIntegerOpInstr {
6596 public: 6607 public:
6597 UnaryUint32OpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id) 6608 UnaryUint32OpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
6598 : UnaryIntegerOpInstr(op_kind, value, deopt_id) { 6609 : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
6599 ASSERT(op_kind == Token::kBIT_NOT); 6610 ASSERT(op_kind == Token::kBIT_NOT);
6600 } 6611 }
6601 6612
6602 virtual bool CanDeoptimize() const { return false; } 6613 virtual bool ComputeCanDeoptimize() const { return false; }
6603 6614
6604 virtual CompileType ComputeType() const; 6615 virtual CompileType ComputeType() const;
6605 6616
6606 virtual Representation representation() const { return kUnboxedUint32; } 6617 virtual Representation representation() const { return kUnboxedUint32; }
6607 6618
6608 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6619 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6609 ASSERT(idx == 0); 6620 ASSERT(idx == 0);
6610 return kUnboxedUint32; 6621 return kUnboxedUint32;
6611 } 6622 }
6612 6623
6613 DECLARE_INSTRUCTION(UnaryUint32Op) 6624 DECLARE_INSTRUCTION(UnaryUint32Op)
6614 6625
6615 private: 6626 private:
6616 DISALLOW_COPY_AND_ASSIGN(UnaryUint32OpInstr); 6627 DISALLOW_COPY_AND_ASSIGN(UnaryUint32OpInstr);
6617 }; 6628 };
6618 6629
6619 6630
6620 class UnaryMintOpInstr : public UnaryIntegerOpInstr { 6631 class UnaryMintOpInstr : public UnaryIntegerOpInstr {
6621 public: 6632 public:
6622 UnaryMintOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id) 6633 UnaryMintOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
6623 : UnaryIntegerOpInstr(op_kind, value, deopt_id) { 6634 : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
6624 ASSERT(op_kind == Token::kBIT_NOT); 6635 ASSERT(op_kind == Token::kBIT_NOT);
6625 } 6636 }
6626 6637
6627 virtual bool CanDeoptimize() const { return false; } 6638 virtual bool ComputeCanDeoptimize() const { return false; }
6628 6639
6629 virtual CompileType ComputeType() const; 6640 virtual CompileType ComputeType() const;
6630 6641
6631 virtual Representation representation() const { return kUnboxedMint; } 6642 virtual Representation representation() const { return kUnboxedMint; }
6632 6643
6633 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6644 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6634 ASSERT(idx == 0); 6645 ASSERT(idx == 0);
6635 return kUnboxedMint; 6646 return kUnboxedMint;
6636 } 6647 }
6637 6648
(...skipping 13 matching lines...) Expand all
6651 : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) { 6662 : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
6652 SetInputAt(0, left); 6663 SetInputAt(0, left);
6653 SetInputAt(1, right); 6664 SetInputAt(1, right);
6654 } 6665 }
6655 6666
6656 InstanceCallInstr* call() const { return call_; } 6667 InstanceCallInstr* call() const { return call_; }
6657 Token::Kind op_kind() const { return op_kind_; } 6668 Token::Kind op_kind() const { return op_kind_; }
6658 Value* left() const { return inputs_[0]; } 6669 Value* left() const { return inputs_[0]; }
6659 Value* right() const { return inputs_[1]; } 6670 Value* right() const { return inputs_[1]; }
6660 6671
6661 virtual bool CanDeoptimize() const { return false; } 6672 virtual bool ComputeCanDeoptimize() const { return false; }
6662 6673
6663 virtual EffectSet Effects() const { return EffectSet::All(); } 6674 virtual EffectSet Effects() const { return EffectSet::All(); }
6664 6675
6665 virtual Definition* Canonicalize(FlowGraph* flow_graph); 6676 virtual Definition* Canonicalize(FlowGraph* flow_graph);
6666 6677
6667 PRINT_OPERANDS_TO_SUPPORT 6678 PRINT_OPERANDS_TO_SUPPORT
6668 6679
6669 DECLARE_INSTRUCTION(CheckedSmiOp) 6680 DECLARE_INSTRUCTION(CheckedSmiOp)
6670 6681
6671 private: 6682 private:
(...skipping 11 matching lines...) Expand all
6683 InstanceCallInstr* call) 6694 InstanceCallInstr* call)
6684 : TemplateComparison(call->token_pos(), op_kind, call->deopt_id()), 6695 : TemplateComparison(call->token_pos(), op_kind, call->deopt_id()),
6685 call_(call), 6696 call_(call),
6686 is_negated_(false) { 6697 is_negated_(false) {
6687 SetInputAt(0, left); 6698 SetInputAt(0, left);
6688 SetInputAt(1, right); 6699 SetInputAt(1, right);
6689 } 6700 }
6690 6701
6691 InstanceCallInstr* call() const { return call_; } 6702 InstanceCallInstr* call() const { return call_; }
6692 6703
6693 virtual bool CanDeoptimize() const { return false; } 6704 virtual bool ComputeCanDeoptimize() const { return false; }
6694 6705
6695 virtual Definition* Canonicalize(FlowGraph* flow_graph); 6706 virtual Definition* Canonicalize(FlowGraph* flow_graph);
6696 6707
6697 virtual void NegateComparison() { 6708 virtual void NegateComparison() {
6698 ComparisonInstr::NegateComparison(); 6709 ComparisonInstr::NegateComparison();
6699 is_negated_ = !is_negated_; 6710 is_negated_ = !is_negated_;
6700 } 6711 }
6701 6712
6702 bool is_negated() const { return is_negated_; } 6713 bool is_negated() const { return is_negated_; }
6703 6714
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
6761 } 6772 }
6762 6773
6763 // Returns true if right is a non-zero Smi constant which absolute value is 6774 // Returns true if right is a non-zero Smi constant which absolute value is
6764 // a power of two. 6775 // a power of two.
6765 bool RightIsPowerOfTwoConstant() const; 6776 bool RightIsPowerOfTwoConstant() const;
6766 6777
6767 RawInteger* Evaluate(const Integer& left, const Integer& right) const; 6778 RawInteger* Evaluate(const Integer& left, const Integer& right) const;
6768 6779
6769 virtual Definition* Canonicalize(FlowGraph* flow_graph); 6780 virtual Definition* Canonicalize(FlowGraph* flow_graph);
6770 6781
6771 virtual bool AllowsDCE() const {
6772 switch (op_kind()) {
6773 case Token::kADD:
6774 case Token::kSUB:
6775 case Token::kMUL:
6776 case Token::kBIT_AND:
6777 case Token::kBIT_OR:
6778 case Token::kBIT_XOR:
6779 return true;
6780
6781 case Token::kSHR:
6782 case Token::kSHL:
6783 // These instructions throw on negative shifts.
6784 return !CanDeoptimize();
6785
6786 default:
6787 return false;
6788 }
6789 }
6790
6791 virtual bool AttributesEqual(Instruction* other) const; 6782 virtual bool AttributesEqual(Instruction* other) const;
6792 6783
6793 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 6784 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
6794 6785
6795 6786
6796 PRINT_OPERANDS_TO_SUPPORT 6787 PRINT_OPERANDS_TO_SUPPORT
6797 6788
6798 DEFINE_INSTRUCTION_TYPE_CHECK(BinaryIntegerOp) 6789 DEFINE_INSTRUCTION_TYPE_CHECK(BinaryIntegerOp)
6799 6790
6800 protected: 6791 protected:
(...skipping 12 matching lines...) Expand all
6813 6804
6814 6805
6815 class BinarySmiOpInstr : public BinaryIntegerOpInstr { 6806 class BinarySmiOpInstr : public BinaryIntegerOpInstr {
6816 public: 6807 public:
6817 BinarySmiOpInstr(Token::Kind op_kind, 6808 BinarySmiOpInstr(Token::Kind op_kind,
6818 Value* left, 6809 Value* left,
6819 Value* right, 6810 Value* right,
6820 intptr_t deopt_id) 6811 intptr_t deopt_id)
6821 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {} 6812 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {}
6822 6813
6823 virtual bool CanDeoptimize() const; 6814 virtual bool ComputeCanDeoptimize() const;
6824 6815
6825 virtual void InferRange(RangeAnalysis* analysis, Range* range); 6816 virtual void InferRange(RangeAnalysis* analysis, Range* range);
6826 virtual CompileType ComputeType() const; 6817 virtual CompileType ComputeType() const;
6827 6818
6828 DECLARE_INSTRUCTION(BinarySmiOp) 6819 DECLARE_INSTRUCTION(BinarySmiOp)
6829 6820
6830 private: 6821 private:
6831 DISALLOW_COPY_AND_ASSIGN(BinarySmiOpInstr); 6822 DISALLOW_COPY_AND_ASSIGN(BinarySmiOpInstr);
6832 }; 6823 };
6833 6824
(...skipping 25 matching lines...) Expand all
6859 return right->BindsToConstant(); 6850 return right->BindsToConstant();
6860 6851
6861 default: 6852 default:
6862 return false; 6853 return false;
6863 } 6854 }
6864 #else 6855 #else
6865 return false; 6856 return false;
6866 #endif 6857 #endif
6867 } 6858 }
6868 6859
6869 virtual bool CanDeoptimize() const; 6860 virtual bool ComputeCanDeoptimize() const;
6870 6861
6871 virtual Representation representation() const { return kUnboxedInt32; } 6862 virtual Representation representation() const { return kUnboxedInt32; }
6872 6863
6873 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6864 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6874 ASSERT((idx == 0) || (idx == 1)); 6865 ASSERT((idx == 0) || (idx == 1));
6875 return kUnboxedInt32; 6866 return kUnboxedInt32;
6876 } 6867 }
6877 6868
6878 virtual void InferRange(RangeAnalysis* analysis, Range* range); 6869 virtual void InferRange(RangeAnalysis* analysis, Range* range);
6879 virtual CompileType ComputeType() const; 6870 virtual CompileType ComputeType() const;
6880 6871
6881 DECLARE_INSTRUCTION(BinaryInt32Op) 6872 DECLARE_INSTRUCTION(BinaryInt32Op)
6882 6873
6883 private: 6874 private:
6884 DISALLOW_COPY_AND_ASSIGN(BinaryInt32OpInstr); 6875 DISALLOW_COPY_AND_ASSIGN(BinaryInt32OpInstr);
6885 }; 6876 };
6886 6877
6887 6878
6888 class BinaryUint32OpInstr : public BinaryIntegerOpInstr { 6879 class BinaryUint32OpInstr : public BinaryIntegerOpInstr {
6889 public: 6880 public:
6890 BinaryUint32OpInstr(Token::Kind op_kind, 6881 BinaryUint32OpInstr(Token::Kind op_kind,
6891 Value* left, 6882 Value* left,
6892 Value* right, 6883 Value* right,
6893 intptr_t deopt_id) 6884 intptr_t deopt_id)
6894 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) { 6885 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
6895 mark_truncating(); 6886 mark_truncating();
6896 } 6887 }
6897 6888
6898 virtual bool CanDeoptimize() const { return false; } 6889 virtual bool ComputeCanDeoptimize() const { return false; }
6899 6890
6900 virtual Representation representation() const { return kUnboxedUint32; } 6891 virtual Representation representation() const { return kUnboxedUint32; }
6901 6892
6902 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6893 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6903 ASSERT((idx == 0) || (idx == 1)); 6894 ASSERT((idx == 0) || (idx == 1));
6904 return kUnboxedUint32; 6895 return kUnboxedUint32;
6905 } 6896 }
6906 6897
6907 virtual CompileType ComputeType() const; 6898 virtual CompileType ComputeType() const;
6908 6899
6909 DECLARE_INSTRUCTION(BinaryUint32Op) 6900 DECLARE_INSTRUCTION(BinaryUint32Op)
6910 6901
6911 private: 6902 private:
6912 DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr); 6903 DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
6913 }; 6904 };
6914 6905
6915 6906
6916 class ShiftUint32OpInstr : public BinaryIntegerOpInstr { 6907 class ShiftUint32OpInstr : public BinaryIntegerOpInstr {
6917 public: 6908 public:
6918 ShiftUint32OpInstr(Token::Kind op_kind, 6909 ShiftUint32OpInstr(Token::Kind op_kind,
6919 Value* left, 6910 Value* left,
6920 Value* right, 6911 Value* right,
6921 intptr_t deopt_id) 6912 intptr_t deopt_id)
6922 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) { 6913 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
6923 ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL)); 6914 ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
6924 } 6915 }
6925 6916
6926 virtual bool CanDeoptimize() const { return true; } 6917 virtual bool ComputeCanDeoptimize() const { return true; }
6927 6918
6928 virtual Representation representation() const { return kUnboxedUint32; } 6919 virtual Representation representation() const { return kUnboxedUint32; }
6929 6920
6930 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6921 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6931 ASSERT((idx == 0) || (idx == 1)); 6922 ASSERT((idx == 0) || (idx == 1));
6932 return (idx == 0) ? kUnboxedUint32 : kTagged; 6923 return (idx == 0) ? kUnboxedUint32 : kTagged;
6933 } 6924 }
6934 6925
6935 virtual CompileType ComputeType() const; 6926 virtual CompileType ComputeType() const;
6936 6927
6937 DECLARE_INSTRUCTION(ShiftUint32Op) 6928 DECLARE_INSTRUCTION(ShiftUint32Op)
6938 6929
6939 private: 6930 private:
6940 DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr); 6931 DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
6941 }; 6932 };
6942 6933
6943 6934
6944 class BinaryMintOpInstr : public BinaryIntegerOpInstr { 6935 class BinaryMintOpInstr : public BinaryIntegerOpInstr {
6945 public: 6936 public:
6946 BinaryMintOpInstr(Token::Kind op_kind, 6937 BinaryMintOpInstr(Token::Kind op_kind,
6947 Value* left, 6938 Value* left,
6948 Value* right, 6939 Value* right,
6949 intptr_t deopt_id) 6940 intptr_t deopt_id)
6950 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {} 6941 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {}
6951 6942
6952 virtual bool CanDeoptimize() const { 6943 virtual bool ComputeCanDeoptimize() const {
6953 return (can_overflow() && 6944 return (can_overflow() &&
6954 ((op_kind() == Token::kADD) || (op_kind() == Token::kSUB))) || 6945 ((op_kind() == Token::kADD) || (op_kind() == Token::kSUB))) ||
6955 (op_kind() == Token::kMUL); // Deopt if inputs are not int32. 6946 (op_kind() == Token::kMUL); // Deopt if inputs are not int32.
6956 } 6947 }
6957 6948
6958 virtual Representation representation() const { return kUnboxedMint; } 6949 virtual Representation representation() const { return kUnboxedMint; }
6959 6950
6960 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6951 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6961 ASSERT((idx == 0) || (idx == 1)); 6952 ASSERT((idx == 0) || (idx == 1));
6962 return kUnboxedMint; 6953 return kUnboxedMint;
(...skipping 12 matching lines...) Expand all
6975 class ShiftMintOpInstr : public BinaryIntegerOpInstr { 6966 class ShiftMintOpInstr : public BinaryIntegerOpInstr {
6976 public: 6967 public:
6977 ShiftMintOpInstr(Token::Kind op_kind, 6968 ShiftMintOpInstr(Token::Kind op_kind,
6978 Value* left, 6969 Value* left,
6979 Value* right, 6970 Value* right,
6980 intptr_t deopt_id) 6971 intptr_t deopt_id)
6981 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) { 6972 : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
6982 ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL)); 6973 ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
6983 } 6974 }
6984 6975
6985 virtual bool CanDeoptimize() const { 6976 virtual bool ComputeCanDeoptimize() const {
6986 return has_shift_count_check() || 6977 return has_shift_count_check() ||
6987 (can_overflow() && (op_kind() == Token::kSHL)); 6978 (can_overflow() && (op_kind() == Token::kSHL));
6988 } 6979 }
6989 6980
6990 virtual Representation representation() const { return kUnboxedMint; } 6981 virtual Representation representation() const { return kUnboxedMint; }
6991 6982
6992 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 6983 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
6993 ASSERT((idx == 0) || (idx == 1)); 6984 ASSERT((idx == 0) || (idx == 1));
6994 return (idx == 0) ? kUnboxedMint : kTagged; 6985 return (idx == 0) ? kUnboxedMint : kTagged;
6995 } 6986 }
(...skipping 18 matching lines...) Expand all
7014 ASSERT(op_kind == Token::kNEGATE); 7005 ASSERT(op_kind == Token::kNEGATE);
7015 SetInputAt(0, value); 7006 SetInputAt(0, value);
7016 } 7007 }
7017 7008
7018 Value* value() const { return inputs_[0]; } 7009 Value* value() const { return inputs_[0]; }
7019 Token::Kind op_kind() const { return op_kind_; } 7010 Token::Kind op_kind() const { return op_kind_; }
7020 7011
7021 DECLARE_INSTRUCTION(UnaryDoubleOp) 7012 DECLARE_INSTRUCTION(UnaryDoubleOp)
7022 virtual CompileType ComputeType() const; 7013 virtual CompileType ComputeType() const;
7023 7014
7024 virtual bool CanDeoptimize() const { return false; } 7015 virtual bool ComputeCanDeoptimize() const { return false; }
7025 7016
7026 virtual intptr_t DeoptimizationTarget() const { 7017 virtual intptr_t DeoptimizationTarget() const {
7027 // Direct access since this instruction cannot deoptimize, and the deopt-id 7018 // Direct access since this instruction cannot deoptimize, and the deopt-id
7028 // was inherited from another instruction that could deoptimize. 7019 // was inherited from another instruction that could deoptimize.
7029 return GetDeoptId(); 7020 return GetDeoptId();
7030 } 7021 }
7031 7022
7032 virtual Representation representation() const { return kUnboxedDouble; } 7023 virtual Representation representation() const { return kUnboxedDouble; }
7033 7024
7034 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7025 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 18 matching lines...) Expand all
7053 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 7044 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
7054 token_pos_(token_pos), 7045 token_pos_(token_pos),
7055 loop_depth_(loop_depth) {} 7046 loop_depth_(loop_depth) {}
7056 7047
7057 virtual TokenPosition token_pos() const { return token_pos_; } 7048 virtual TokenPosition token_pos() const { return token_pos_; }
7058 bool in_loop() const { return loop_depth_ > 0; } 7049 bool in_loop() const { return loop_depth_ > 0; }
7059 intptr_t loop_depth() const { return loop_depth_; } 7050 intptr_t loop_depth() const { return loop_depth_; }
7060 7051
7061 DECLARE_INSTRUCTION(CheckStackOverflow) 7052 DECLARE_INSTRUCTION(CheckStackOverflow)
7062 7053
7063 virtual bool CanDeoptimize() const { return true; } 7054 virtual bool ComputeCanDeoptimize() const { return true; }
7064 7055
7065 virtual EffectSet Effects() const { return EffectSet::None(); } 7056 virtual EffectSet Effects() const { return EffectSet::None(); }
7066 7057
7067 PRINT_OPERANDS_TO_SUPPORT 7058 PRINT_OPERANDS_TO_SUPPORT
7068 7059
7069 private: 7060 private:
7070 const TokenPosition token_pos_; 7061 const TokenPosition token_pos_;
7071 const intptr_t loop_depth_; 7062 const intptr_t loop_depth_;
7072 7063
7073 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr); 7064 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr);
7074 }; 7065 };
7075 7066
7076 7067
7077 // TODO(vegorov): remove this instruction in favor of Int32ToDouble. 7068 // TODO(vegorov): remove this instruction in favor of Int32ToDouble.
7078 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { 7069 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
7079 public: 7070 public:
7080 SmiToDoubleInstr(Value* value, TokenPosition token_pos) 7071 SmiToDoubleInstr(Value* value, TokenPosition token_pos)
7081 : token_pos_(token_pos) { 7072 : token_pos_(token_pos) {
7082 SetInputAt(0, value); 7073 SetInputAt(0, value);
7083 } 7074 }
7084 7075
7085 Value* value() const { return inputs_[0]; } 7076 Value* value() const { return inputs_[0]; }
7086 virtual TokenPosition token_pos() const { return token_pos_; } 7077 virtual TokenPosition token_pos() const { return token_pos_; }
7087 7078
7088 DECLARE_INSTRUCTION(SmiToDouble) 7079 DECLARE_INSTRUCTION(SmiToDouble)
7089 virtual CompileType ComputeType() const; 7080 virtual CompileType ComputeType() const;
7090 7081
7091 virtual Representation representation() const { return kUnboxedDouble; } 7082 virtual Representation representation() const { return kUnboxedDouble; }
7092 7083
7093 virtual bool CanDeoptimize() const { return false; } 7084 virtual bool ComputeCanDeoptimize() const { return false; }
7094 7085
7095 virtual bool AttributesEqual(Instruction* other) const { return true; } 7086 virtual bool AttributesEqual(Instruction* other) const { return true; }
7096 7087
7097 private: 7088 private:
7098 const TokenPosition token_pos_; 7089 const TokenPosition token_pos_;
7099 7090
7100 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr); 7091 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr);
7101 }; 7092 };
7102 7093
7103 7094
7104 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { 7095 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
7105 public: 7096 public:
7106 explicit Int32ToDoubleInstr(Value* value) { SetInputAt(0, value); } 7097 explicit Int32ToDoubleInstr(Value* value) { SetInputAt(0, value); }
7107 7098
7108 Value* value() const { return inputs_[0]; } 7099 Value* value() const { return inputs_[0]; }
7109 7100
7110 DECLARE_INSTRUCTION(Int32ToDouble) 7101 DECLARE_INSTRUCTION(Int32ToDouble)
7111 virtual CompileType ComputeType() const; 7102 virtual CompileType ComputeType() const;
7112 7103
7113 virtual Representation RequiredInputRepresentation(intptr_t index) const { 7104 virtual Representation RequiredInputRepresentation(intptr_t index) const {
7114 ASSERT(index == 0); 7105 ASSERT(index == 0);
7115 return kUnboxedInt32; 7106 return kUnboxedInt32;
7116 } 7107 }
7117 7108
7118 virtual Representation representation() const { return kUnboxedDouble; } 7109 virtual Representation representation() const { return kUnboxedDouble; }
7119 7110
7120 virtual bool CanDeoptimize() const { return false; } 7111 virtual bool ComputeCanDeoptimize() const { return false; }
7121 7112
7122 virtual bool AttributesEqual(Instruction* other) const { return true; } 7113 virtual bool AttributesEqual(Instruction* other) const { return true; }
7123 7114
7124 private: 7115 private:
7125 DISALLOW_COPY_AND_ASSIGN(Int32ToDoubleInstr); 7116 DISALLOW_COPY_AND_ASSIGN(Int32ToDoubleInstr);
7126 }; 7117 };
7127 7118
7128 7119
7129 class MintToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { 7120 class MintToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
7130 public: 7121 public:
(...skipping 13 matching lines...) Expand all
7144 } 7135 }
7145 7136
7146 virtual Representation representation() const { return kUnboxedDouble; } 7137 virtual Representation representation() const { return kUnboxedDouble; }
7147 7138
7148 virtual intptr_t DeoptimizationTarget() const { 7139 virtual intptr_t DeoptimizationTarget() const {
7149 // Direct access since this instruction cannot deoptimize, and the deopt-id 7140 // Direct access since this instruction cannot deoptimize, and the deopt-id
7150 // was inherited from another instruction that could deoptimize. 7141 // was inherited from another instruction that could deoptimize.
7151 return GetDeoptId(); 7142 return GetDeoptId();
7152 } 7143 }
7153 7144
7154 virtual bool CanDeoptimize() const { return false; } 7145 virtual bool ComputeCanDeoptimize() const { return false; }
7155 virtual bool AttributesEqual(Instruction* other) const { return true; } 7146 virtual bool AttributesEqual(Instruction* other) const { return true; }
7156 7147
7157 private: 7148 private:
7158 DISALLOW_COPY_AND_ASSIGN(MintToDoubleInstr); 7149 DISALLOW_COPY_AND_ASSIGN(MintToDoubleInstr);
7159 }; 7150 };
7160 7151
7161 7152
7162 class DoubleToIntegerInstr : public TemplateDefinition<1, Throws> { 7153 class DoubleToIntegerInstr : public TemplateDefinition<1, Throws> {
7163 public: 7154 public:
7164 DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call) 7155 DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call)
7165 : TemplateDefinition(instance_call->deopt_id()), 7156 : TemplateDefinition(instance_call->deopt_id()),
7166 instance_call_(instance_call) { 7157 instance_call_(instance_call) {
7167 SetInputAt(0, value); 7158 SetInputAt(0, value);
7168 } 7159 }
7169 7160
7170 Value* value() const { return inputs_[0]; } 7161 Value* value() const { return inputs_[0]; }
7171 InstanceCallInstr* instance_call() const { return instance_call_; } 7162 InstanceCallInstr* instance_call() const { return instance_call_; }
7172 7163
7173 DECLARE_INSTRUCTION(DoubleToInteger) 7164 DECLARE_INSTRUCTION(DoubleToInteger)
7174 virtual CompileType ComputeType() const; 7165 virtual CompileType ComputeType() const;
7175 7166
7176 virtual intptr_t ArgumentCount() const { return 1; } 7167 virtual intptr_t ArgumentCount() const { return 1; }
7177 7168
7178 virtual bool CanDeoptimize() const { return true; } 7169 virtual bool ComputeCanDeoptimize() const { return true; }
7179 7170
7180 virtual EffectSet Effects() const { return EffectSet::None(); } 7171 virtual EffectSet Effects() const { return EffectSet::None(); }
7181 7172
7182 private: 7173 private:
7183 InstanceCallInstr* instance_call_; 7174 InstanceCallInstr* instance_call_;
7184 7175
7185 DISALLOW_COPY_AND_ASSIGN(DoubleToIntegerInstr); 7176 DISALLOW_COPY_AND_ASSIGN(DoubleToIntegerInstr);
7186 }; 7177 };
7187 7178
7188 7179
7189 // Similar to 'DoubleToIntegerInstr' but expects unboxed double as input 7180 // Similar to 'DoubleToIntegerInstr' but expects unboxed double as input
7190 // and creates a Smi. 7181 // and creates a Smi.
7191 class DoubleToSmiInstr : public TemplateDefinition<1, NoThrow, Pure> { 7182 class DoubleToSmiInstr : public TemplateDefinition<1, NoThrow, Pure> {
7192 public: 7183 public:
7193 DoubleToSmiInstr(Value* value, intptr_t deopt_id) 7184 DoubleToSmiInstr(Value* value, intptr_t deopt_id)
7194 : TemplateDefinition(deopt_id) { 7185 : TemplateDefinition(deopt_id) {
7195 SetInputAt(0, value); 7186 SetInputAt(0, value);
7196 } 7187 }
7197 7188
7198 Value* value() const { return inputs_[0]; } 7189 Value* value() const { return inputs_[0]; }
7199 7190
7200 DECLARE_INSTRUCTION(DoubleToSmi) 7191 DECLARE_INSTRUCTION(DoubleToSmi)
7201 virtual CompileType ComputeType() const; 7192 virtual CompileType ComputeType() const;
7202 7193
7203 virtual bool CanDeoptimize() const { return true; } 7194 virtual bool ComputeCanDeoptimize() const { return true; }
7204 7195
7205 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7196 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7206 ASSERT(idx == 0); 7197 ASSERT(idx == 0);
7207 return kUnboxedDouble; 7198 return kUnboxedDouble;
7208 } 7199 }
7209 7200
7210 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 7201 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
7211 7202
7212 virtual bool AttributesEqual(Instruction* other) const { return true; } 7203 virtual bool AttributesEqual(Instruction* other) const { return true; }
7213 7204
(...skipping 11 matching lines...) Expand all
7225 SetInputAt(0, value); 7216 SetInputAt(0, value);
7226 } 7217 }
7227 7218
7228 Value* value() const { return inputs_[0]; } 7219 Value* value() const { return inputs_[0]; }
7229 7220
7230 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } 7221 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
7231 7222
7232 DECLARE_INSTRUCTION(DoubleToDouble) 7223 DECLARE_INSTRUCTION(DoubleToDouble)
7233 virtual CompileType ComputeType() const; 7224 virtual CompileType ComputeType() const;
7234 7225
7235 virtual bool CanDeoptimize() const { return false; } 7226 virtual bool ComputeCanDeoptimize() const { return false; }
7236 7227
7237 virtual Representation representation() const { return kUnboxedDouble; } 7228 virtual Representation representation() const { return kUnboxedDouble; }
7238 7229
7239 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7230 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7240 ASSERT(idx == 0); 7231 ASSERT(idx == 0);
7241 return kUnboxedDouble; 7232 return kUnboxedDouble;
7242 } 7233 }
7243 7234
7244 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 7235 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
7245 7236
(...skipping 14 matching lines...) Expand all
7260 : TemplateDefinition(deopt_id) { 7251 : TemplateDefinition(deopt_id) {
7261 SetInputAt(0, value); 7252 SetInputAt(0, value);
7262 } 7253 }
7263 7254
7264 Value* value() const { return inputs_[0]; } 7255 Value* value() const { return inputs_[0]; }
7265 7256
7266 DECLARE_INSTRUCTION(DoubleToFloat) 7257 DECLARE_INSTRUCTION(DoubleToFloat)
7267 7258
7268 virtual CompileType ComputeType() const; 7259 virtual CompileType ComputeType() const;
7269 7260
7270 virtual bool CanDeoptimize() const { return false; } 7261 virtual bool ComputeCanDeoptimize() const { return false; }
7271 7262
7272 virtual Representation representation() const { 7263 virtual Representation representation() const {
7273 // This works since double is the representation that the typed array 7264 // This works since double is the representation that the typed array
7274 // store expects. 7265 // store expects.
7275 // TODO(fschneider): Change this to a genuine float representation once it 7266 // TODO(fschneider): Change this to a genuine float representation once it
7276 // is supported. 7267 // is supported.
7277 return kUnboxedDouble; 7268 return kUnboxedDouble;
7278 } 7269 }
7279 7270
7280 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7271 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 18 matching lines...) Expand all
7299 : TemplateDefinition(deopt_id) { 7290 : TemplateDefinition(deopt_id) {
7300 SetInputAt(0, value); 7291 SetInputAt(0, value);
7301 } 7292 }
7302 7293
7303 Value* value() const { return inputs_[0]; } 7294 Value* value() const { return inputs_[0]; }
7304 7295
7305 DECLARE_INSTRUCTION(FloatToDouble) 7296 DECLARE_INSTRUCTION(FloatToDouble)
7306 7297
7307 virtual CompileType ComputeType() const; 7298 virtual CompileType ComputeType() const;
7308 7299
7309 virtual bool CanDeoptimize() const { return false; } 7300 virtual bool ComputeCanDeoptimize() const { return false; }
7310 7301
7311 virtual Representation representation() const { return kUnboxedDouble; } 7302 virtual Representation representation() const { return kUnboxedDouble; }
7312 7303
7313 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7304 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7314 ASSERT(idx == 0); 7305 ASSERT(idx == 0);
7315 return kUnboxedDouble; 7306 return kUnboxedDouble;
7316 } 7307 }
7317 7308
7318 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 7309 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
7319 7310
(...skipping 17 matching lines...) Expand all
7337 7328
7338 const RuntimeEntry& TargetFunction() const; 7329 const RuntimeEntry& TargetFunction() const;
7339 7330
7340 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } 7331 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
7341 7332
7342 virtual TokenPosition token_pos() const { return token_pos_; } 7333 virtual TokenPosition token_pos() const { return token_pos_; }
7343 7334
7344 DECLARE_INSTRUCTION(InvokeMathCFunction) 7335 DECLARE_INSTRUCTION(InvokeMathCFunction)
7345 virtual CompileType ComputeType() const; 7336 virtual CompileType ComputeType() const;
7346 7337
7347 virtual bool CanDeoptimize() const { return false; } 7338 virtual bool ComputeCanDeoptimize() const { return false; }
7348 7339
7349 virtual Representation representation() const { return kUnboxedDouble; } 7340 virtual Representation representation() const { return kUnboxedDouble; }
7350 7341
7351 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7342 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7352 ASSERT((0 <= idx) && (idx < InputCount())); 7343 ASSERT((0 <= idx) && (idx < InputCount()));
7353 return kUnboxedDouble; 7344 return kUnboxedDouble;
7354 } 7345 }
7355 7346
7356 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); } 7347 virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
7357 7348
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
7396 definition_rep_(definition_rep), 7387 definition_rep_(definition_rep),
7397 definition_cid_(definition_cid) { 7388 definition_cid_(definition_cid) {
7398 SetInputAt(0, value); 7389 SetInputAt(0, value);
7399 } 7390 }
7400 7391
7401 Value* value() const { return inputs_[0]; } 7392 Value* value() const { return inputs_[0]; }
7402 7393
7403 DECLARE_INSTRUCTION(ExtractNthOutput) 7394 DECLARE_INSTRUCTION(ExtractNthOutput)
7404 7395
7405 virtual CompileType ComputeType() const; 7396 virtual CompileType ComputeType() const;
7406 virtual bool CanDeoptimize() const { return false; } 7397 virtual bool ComputeCanDeoptimize() const { return false; }
7407 7398
7408 intptr_t index() const { return index_; } 7399 intptr_t index() const { return index_; }
7409 7400
7410 virtual Representation representation() const { return definition_rep_; } 7401 virtual Representation representation() const { return definition_rep_; }
7411 7402
7412 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7403 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7413 ASSERT(idx == 0); 7404 ASSERT(idx == 0);
7414 if (representation() == kTagged) { 7405 if (representation() == kTagged) {
7415 return kPairOfTagged; 7406 return kPairOfTagged;
7416 } 7407 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
7457 7448
7458 virtual intptr_t InputCount() const { return inputs_->length(); } 7449 virtual intptr_t InputCount() const { return inputs_->length(); }
7459 7450
7460 virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; } 7451 virtual Value* InputAt(intptr_t i) const { return (*inputs_)[i]; }
7461 7452
7462 static intptr_t OutputIndexOf(MethodRecognizer::Kind kind); 7453 static intptr_t OutputIndexOf(MethodRecognizer::Kind kind);
7463 static intptr_t OutputIndexOf(Token::Kind token); 7454 static intptr_t OutputIndexOf(Token::Kind token);
7464 7455
7465 virtual CompileType ComputeType() const; 7456 virtual CompileType ComputeType() const;
7466 7457
7467 virtual bool CanDeoptimize() const { 7458 virtual bool ComputeCanDeoptimize() const {
7468 if (kind_ == kTruncDivMod) { 7459 if (kind_ == kTruncDivMod) {
7469 return true; 7460 return true;
7470 } else { 7461 } else {
7471 UNIMPLEMENTED(); 7462 UNIMPLEMENTED();
7472 return false; 7463 return false;
7473 } 7464 }
7474 } 7465 }
7475 7466
7476 virtual Representation representation() const { 7467 virtual Representation representation() const {
7477 if (kind_ == kTruncDivMod) { 7468 if (kind_ == kTruncDivMod) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
7523 7514
7524 class CheckClassInstr : public TemplateInstruction<1, NoThrow> { 7515 class CheckClassInstr : public TemplateInstruction<1, NoThrow> {
7525 public: 7516 public:
7526 CheckClassInstr(Value* value, 7517 CheckClassInstr(Value* value,
7527 intptr_t deopt_id, 7518 intptr_t deopt_id,
7528 const ICData& unary_checks, 7519 const ICData& unary_checks,
7529 TokenPosition token_pos); 7520 TokenPosition token_pos);
7530 7521
7531 DECLARE_INSTRUCTION(CheckClass) 7522 DECLARE_INSTRUCTION(CheckClass)
7532 7523
7533 virtual bool CanDeoptimize() const { return true; } 7524 virtual bool ComputeCanDeoptimize() const { return true; }
7534 7525
7535 virtual TokenPosition token_pos() const { return token_pos_; } 7526 virtual TokenPosition token_pos() const { return token_pos_; }
7536 7527
7537 Value* value() const { return inputs_[0]; } 7528 Value* value() const { return inputs_[0]; }
7538 7529
7539 const ICData& unary_checks() const { return unary_checks_; } 7530 const ICData& unary_checks() const { return unary_checks_; }
7540 7531
7541 const GrowableArray<intptr_t>& cids() const { return cids_; } 7532 const GrowableArray<intptr_t>& cids() const { return cids_; }
7542 7533
7543 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7534 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
7580 token_pos_(token_pos), 7571 token_pos_(token_pos),
7581 licm_hoisted_(false) { 7572 licm_hoisted_(false) {
7582 SetInputAt(0, value); 7573 SetInputAt(0, value);
7583 } 7574 }
7584 7575
7585 Value* value() const { return inputs_[0]; } 7576 Value* value() const { return inputs_[0]; }
7586 virtual TokenPosition token_pos() const { return token_pos_; } 7577 virtual TokenPosition token_pos() const { return token_pos_; }
7587 7578
7588 DECLARE_INSTRUCTION(CheckSmi) 7579 DECLARE_INSTRUCTION(CheckSmi)
7589 7580
7590 virtual bool CanDeoptimize() const { return true; } 7581 virtual bool ComputeCanDeoptimize() const { return true; }
7591 7582
7592 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7583 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7593 7584
7594 virtual bool AttributesEqual(Instruction* other) const { return true; } 7585 virtual bool AttributesEqual(Instruction* other) const { return true; }
7595 7586
7596 bool licm_hoisted() const { return licm_hoisted_; } 7587 bool licm_hoisted() const { return licm_hoisted_; }
7597 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 7588 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
7598 7589
7599 private: 7590 private:
7600 const TokenPosition token_pos_; 7591 const TokenPosition token_pos_;
7601 bool licm_hoisted_; 7592 bool licm_hoisted_;
7602 7593
7603 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr); 7594 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr);
7604 }; 7595 };
7605 7596
7606 7597
7607 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> { 7598 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> {
7608 public: 7599 public:
7609 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) 7600 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id)
7610 : TemplateInstruction(deopt_id), cid_(cid) { 7601 : TemplateInstruction(deopt_id), cid_(cid) {
7611 SetInputAt(0, value); 7602 SetInputAt(0, value);
7612 } 7603 }
7613 7604
7614 Value* value() const { return inputs_[0]; } 7605 Value* value() const { return inputs_[0]; }
7615 intptr_t cid() const { return cid_; } 7606 intptr_t cid() const { return cid_; }
7616 7607
7617 DECLARE_INSTRUCTION(CheckClassId) 7608 DECLARE_INSTRUCTION(CheckClassId)
7618 7609
7619 virtual bool CanDeoptimize() const { return true; } 7610 virtual bool ComputeCanDeoptimize() const { return true; }
7620 7611
7621 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7612 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7622 7613
7623 virtual bool AllowsCSE() const { return true; } 7614 virtual bool AllowsCSE() const { return true; }
7624 virtual EffectSet Dependencies() const; 7615 virtual EffectSet Dependencies() const;
7625 virtual EffectSet Effects() const { return EffectSet::None(); } 7616 virtual EffectSet Effects() const { return EffectSet::None(); }
7626 virtual bool AttributesEqual(Instruction* other) const { return true; } 7617 virtual bool AttributesEqual(Instruction* other) const { return true; }
7627 7618
7628 PRINT_OPERANDS_TO_SUPPORT 7619 PRINT_OPERANDS_TO_SUPPORT
7629 7620
(...skipping 12 matching lines...) Expand all
7642 licm_hoisted_(false) { 7633 licm_hoisted_(false) {
7643 SetInputAt(kLengthPos, length); 7634 SetInputAt(kLengthPos, length);
7644 SetInputAt(kIndexPos, index); 7635 SetInputAt(kIndexPos, index);
7645 } 7636 }
7646 7637
7647 Value* length() const { return inputs_[kLengthPos]; } 7638 Value* length() const { return inputs_[kLengthPos]; }
7648 Value* index() const { return inputs_[kIndexPos]; } 7639 Value* index() const { return inputs_[kIndexPos]; }
7649 7640
7650 DECLARE_INSTRUCTION(CheckArrayBound) 7641 DECLARE_INSTRUCTION(CheckArrayBound)
7651 7642
7652 virtual bool CanDeoptimize() const { return true; } 7643 virtual bool ComputeCanDeoptimize() const { return true; }
7653 7644
7654 bool IsRedundant(const RangeBoundary& length); 7645 bool IsRedundant(const RangeBoundary& length);
7655 7646
7656 void mark_generalized() { generalized_ = true; } 7647 void mark_generalized() { generalized_ = true; }
7657 7648
7658 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7649 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7659 7650
7660 // Returns the length offset for array and string types. 7651 // Returns the length offset for array and string types.
7661 static intptr_t LengthOffsetFor(intptr_t class_id); 7652 static intptr_t LengthOffsetFor(intptr_t class_id);
7662 7653
(...skipping 23 matching lines...) Expand all
7686 } 7677 }
7687 7678
7688 Value* length() const { return inputs_[kLengthPos]; } 7679 Value* length() const { return inputs_[kLengthPos]; }
7689 Value* index() const { return inputs_[kIndexPos]; } 7680 Value* index() const { return inputs_[kIndexPos]; }
7690 7681
7691 virtual EffectSet Effects() const { return EffectSet::None(); } 7682 virtual EffectSet Effects() const { return EffectSet::None(); }
7692 virtual EffectSet Dependencies() const { return EffectSet::None(); } 7683 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7693 7684
7694 DECLARE_INSTRUCTION(GenericCheckBound) 7685 DECLARE_INSTRUCTION(GenericCheckBound)
7695 7686
7696 virtual bool CanDeoptimize() const { return true; } 7687 virtual bool ComputeCanDeoptimize() const { return true; }
7697 7688
7698 // Give a name to the location/input indices. 7689 // Give a name to the location/input indices.
7699 enum { kLengthPos = 0, kIndexPos = 1 }; 7690 enum { kLengthPos = 0, kIndexPos = 1 };
7700 7691
7701 private: 7692 private:
7702 DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr); 7693 DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr);
7703 }; 7694 };
7704 7695
7705 7696
7706 class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> { 7697 class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> {
(...skipping 17 matching lines...) Expand all
7724 Value* value() const { return inputs_[0]; } 7715 Value* value() const { return inputs_[0]; }
7725 7716
7726 Representation from() const { return from_representation_; } 7717 Representation from() const { return from_representation_; }
7727 Representation to() const { return to_representation_; } 7718 Representation to() const { return to_representation_; }
7728 bool is_truncating() const { return is_truncating_; } 7719 bool is_truncating() const { return is_truncating_; }
7729 7720
7730 void mark_truncating() { is_truncating_ = true; } 7721 void mark_truncating() { is_truncating_ = true; }
7731 7722
7732 Definition* Canonicalize(FlowGraph* flow_graph); 7723 Definition* Canonicalize(FlowGraph* flow_graph);
7733 7724
7734 virtual bool CanDeoptimize() const; 7725 virtual bool ComputeCanDeoptimize() const;
7735 7726
7736 virtual Representation representation() const { return to(); } 7727 virtual Representation representation() const { return to(); }
7737 7728
7738 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7729 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7739 ASSERT(idx == 0); 7730 ASSERT(idx == 0);
7740 return from(); 7731 return from();
7741 } 7732 }
7742 7733
7743 virtual EffectSet Effects() const { return EffectSet::None(); } 7734 virtual EffectSet Effects() const { return EffectSet::None(); }
7744 virtual EffectSet Dependencies() const { return EffectSet::None(); } 7735 virtual EffectSet Dependencies() const { return EffectSet::None(); }
(...skipping 25 matching lines...) Expand all
7770 7761
7771 7762
7772 class GrowRegExpStackInstr : public TemplateDefinition<1, Throws> { 7763 class GrowRegExpStackInstr : public TemplateDefinition<1, Throws> {
7773 public: 7764 public:
7774 explicit GrowRegExpStackInstr(Value* typed_data_cell) { 7765 explicit GrowRegExpStackInstr(Value* typed_data_cell) {
7775 SetInputAt(0, typed_data_cell); 7766 SetInputAt(0, typed_data_cell);
7776 } 7767 }
7777 7768
7778 Value* typed_data_cell() const { return inputs_[0]; } 7769 Value* typed_data_cell() const { return inputs_[0]; }
7779 7770
7780 virtual bool CanDeoptimize() const { return MayThrow(); } 7771 virtual bool ComputeCanDeoptimize() const { return MayThrow(); }
7781 virtual EffectSet Effects() const { return EffectSet::None(); } 7772 virtual EffectSet Effects() const { return EffectSet::None(); }
7782 7773
7783 DECLARE_INSTRUCTION(GrowRegExpStack); 7774 DECLARE_INSTRUCTION(GrowRegExpStack);
7784 7775
7785 private: 7776 private:
7786 DISALLOW_COPY_AND_ASSIGN(GrowRegExpStackInstr); 7777 DISALLOW_COPY_AND_ASSIGN(GrowRegExpStackInstr);
7787 }; 7778 };
7788 7779
7789 7780
7790 #undef DECLARE_INSTRUCTION 7781 #undef DECLARE_INSTRUCTION
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
7976 // On all other architectures caller drops outgoing arguments itself 7967 // On all other architectures caller drops outgoing arguments itself
7977 // hence the difference. 7968 // hence the difference.
7978 // Note: this method can only be used at the code generation stage because 7969 // Note: this method can only be used at the code generation stage because
7979 // it mutates environment in unsafe way (e.g. does not update def-use 7970 // it mutates environment in unsafe way (e.g. does not update def-use
7980 // chains). 7971 // chains).
7981 void DropArguments(intptr_t argc); 7972 void DropArguments(intptr_t argc);
7982 #endif 7973 #endif
7983 7974
7984 private: 7975 private:
7985 friend class ShallowIterator; 7976 friend class ShallowIterator;
7977 friend class BlockBuilder; // For Environment constructor.
7986 7978
7987 Environment(intptr_t length, 7979 Environment(intptr_t length,
7988 intptr_t fixed_parameter_count, 7980 intptr_t fixed_parameter_count,
7989 intptr_t deopt_id, 7981 intptr_t deopt_id,
7990 const ParsedFunction& parsed_function, 7982 const ParsedFunction& parsed_function,
7991 Environment* outer) 7983 Environment* outer)
7992 : values_(length), 7984 : values_(length),
7993 locations_(NULL), 7985 locations_(NULL),
7994 fixed_parameter_count_(fixed_parameter_count), 7986 fixed_parameter_count_(fixed_parameter_count),
7995 deopt_id_(deopt_id), 7987 deopt_id_(deopt_id),
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
8047 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ 8039 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \
8048 UNIMPLEMENTED(); \ 8040 UNIMPLEMENTED(); \
8049 return NULL; \ 8041 return NULL; \
8050 } \ 8042 } \
8051 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } 8043 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
8052 8044
8053 8045
8054 } // namespace dart 8046 } // namespace dart
8055 8047
8056 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 8048 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_type_propagator.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698