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

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

Issue 3001403002: [vm] Cleanup Instruction::Dependencies(), EffectSet, BlockEffects (Closed)
Patch Set: Created 3 years, 4 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_range_analysis.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/flags.h" 10 #include "vm/flags.h"
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 private: 171 private:
172 bool CanComputeIsInstanceOf(const AbstractType& type, 172 bool CanComputeIsInstanceOf(const AbstractType& type,
173 bool is_nullable, 173 bool is_nullable,
174 bool* is_instance); 174 bool* is_instance);
175 175
176 bool is_nullable_; 176 bool is_nullable_;
177 intptr_t cid_; 177 intptr_t cid_;
178 const AbstractType* type_; 178 const AbstractType* type_;
179 }; 179 };
180 180
181 // TODO(dartbug.com/30474): remove EffectSet as there are no tracked effects
182 // anymore.
183 class EffectSet : public ValueObject {
184 public:
185 enum Effects {
186 kNoEffects = 0,
187 kUnusedEffect = 1, // Currently unused.
188 kLastEffect = kUnusedEffect
189 };
190
191 EffectSet(const EffectSet& other) : ValueObject(), effects_(other.effects_) {}
192
193 bool IsNone() const { return effects_ == kNoEffects; }
194
195 static EffectSet None() { return EffectSet(kNoEffects); }
196 static EffectSet All() {
197 ASSERT(EffectSet::kLastEffect == 1);
198 return EffectSet(kUnusedEffect);
199 }
200
201 bool ToInt() { return effects_; }
202
203 private:
204 explicit EffectSet(intptr_t effects) : effects_(effects) {}
205
206 intptr_t effects_;
207 };
208
209 class Value : public ZoneAllocated { 181 class Value : public ZoneAllocated {
210 public: 182 public:
211 // A forward iterator that allows removing the current value from the 183 // A forward iterator that allows removing the current value from the
212 // underlying use list during iteration. 184 // underlying use list during iteration.
213 class Iterator { 185 class Iterator {
214 public: 186 public:
215 explicit Iterator(Value* head) : next_(head) { Advance(); } 187 explicit Iterator(Value* head) : next_(head) { Advance(); }
216 Value* Current() const { return current_; } 188 Value* Current() const { return current_; }
217 bool Done() const { return current_ == NULL; } 189 bool Done() const { return current_ == NULL; }
218 void Advance() { 190 void Advance() {
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 // instruction. 842 // instruction.
871 Instruction* AppendInstruction(Instruction* tail); 843 Instruction* AppendInstruction(Instruction* tail);
872 844
873 // Returns true if CSE and LICM are allowed for this instruction. 845 // Returns true if CSE and LICM are allowed for this instruction.
874 virtual bool AllowsCSE() const { return false; } 846 virtual bool AllowsCSE() const { return false; }
875 847
876 // Returns true if this instruction has any side-effects besides storing. 848 // Returns true if this instruction has any side-effects besides storing.
877 // See StoreInstanceFieldInstr::HasUnknownSideEffects() for rationale. 849 // See StoreInstanceFieldInstr::HasUnknownSideEffects() for rationale.
878 virtual bool HasUnknownSideEffects() const = 0; 850 virtual bool HasUnknownSideEffects() const = 0;
879 851
880 // Returns set of effects that affect this instruction.
881 virtual EffectSet Dependencies() const {
882 UNREACHABLE();
883 return EffectSet::All();
884 }
885
886 // Get the block entry for this instruction. 852 // Get the block entry for this instruction.
887 virtual BlockEntryInstr* GetBlock(); 853 virtual BlockEntryInstr* GetBlock();
888 854
889 // Place identifiers used by the load optimization pass. 855 // Place identifiers used by the load optimization pass.
890 intptr_t place_id() const { return place_id_; } 856 intptr_t place_id() const { return place_id_; }
891 void set_place_id(intptr_t place_id) { place_id_ = place_id; } 857 void set_place_id(intptr_t place_id) { place_id_ = place_id; }
892 bool HasPlaceId() const { return place_id_ != kNoPlaceId; } 858 bool HasPlaceId() const { return place_id_ != kNoPlaceId; }
893 859
894 intptr_t inlining_id() const { return inlining_id_; } 860 intptr_t inlining_id() const { return inlining_id_; }
895 void set_inlining_id(intptr_t value) { 861 void set_inlining_id(intptr_t value) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 Label* true_label; 945 Label* true_label;
980 Label* false_label; 946 Label* false_label;
981 Label* fall_through; 947 Label* fall_through;
982 }; 948 };
983 949
984 class PureInstruction : public Instruction { 950 class PureInstruction : public Instruction {
985 public: 951 public:
986 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {} 952 explicit PureInstruction(intptr_t deopt_id) : Instruction(deopt_id) {}
987 953
988 virtual bool AllowsCSE() const { return true; } 954 virtual bool AllowsCSE() const { return true; }
989 virtual EffectSet Dependencies() const { return EffectSet::None(); }
990
991 virtual bool HasUnknownSideEffects() const { return false; } 955 virtual bool HasUnknownSideEffects() const { return false; }
992 }; 956 };
993 957
994 // Types to be used as ThrowsTrait for TemplateInstruction/TemplateDefinition. 958 // Types to be used as ThrowsTrait for TemplateInstruction/TemplateDefinition.
995 struct Throws { 959 struct Throws {
996 static const bool kCanThrow = true; 960 static const bool kCanThrow = true;
997 }; 961 };
998 962
999 struct NoThrow { 963 struct NoThrow {
1000 static const bool kCanThrow = false; 964 static const bool kCanThrow = false;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 1063
1100 virtual intptr_t ArgumentCount() const { return 0; } 1064 virtual intptr_t ArgumentCount() const { return 0; }
1101 1065
1102 virtual bool ComputeCanDeoptimize() const { return false; } 1066 virtual bool ComputeCanDeoptimize() const { return false; }
1103 1067
1104 virtual bool HasUnknownSideEffects() const { 1068 virtual bool HasUnknownSideEffects() const {
1105 UNREACHABLE(); // This instruction never visited by optimization passes. 1069 UNREACHABLE(); // This instruction never visited by optimization passes.
1106 return false; 1070 return false;
1107 } 1071 }
1108 1072
1109 virtual EffectSet Dependencies() const {
1110 UNREACHABLE(); // This instruction never visited by optimization passes.
1111 return EffectSet::None();
1112 }
1113
1114 MoveOperands* AddMove(Location dest, Location src) { 1073 MoveOperands* AddMove(Location dest, Location src) {
1115 MoveOperands* move = new MoveOperands(dest, src); 1074 MoveOperands* move = new MoveOperands(dest, src);
1116 moves_.Add(move); 1075 moves_.Add(move);
1117 return move; 1076 return move;
1118 } 1077 }
1119 1078
1120 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; } 1079 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; }
1121 1080
1122 intptr_t NumMoves() const { return moves_.length(); } 1081 intptr_t NumMoves() const { return moves_.length(); }
1123 1082
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 1178
1220 virtual bool CanBecomeDeoptimizationTarget() const { 1179 virtual bool CanBecomeDeoptimizationTarget() const {
1221 // BlockEntry environment is copied to Goto and Branch instructions 1180 // BlockEntry environment is copied to Goto and Branch instructions
1222 // when we insert new blocks targeting this block. 1181 // when we insert new blocks targeting this block.
1223 return true; 1182 return true;
1224 } 1183 }
1225 1184
1226 virtual bool ComputeCanDeoptimize() const { return false; } 1185 virtual bool ComputeCanDeoptimize() const { return false; }
1227 1186
1228 virtual bool HasUnknownSideEffects() const { return false; } 1187 virtual bool HasUnknownSideEffects() const { return false; }
1229 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1230 1188
1231 virtual bool MayThrow() const { return false; } 1189 virtual bool MayThrow() const { return false; }
1232 1190
1233 intptr_t try_index() const { return try_index_; } 1191 intptr_t try_index() const { return try_index_; }
1234 void set_try_index(intptr_t index) { try_index_ = index; } 1192 void set_try_index(intptr_t index) { try_index_ = index; }
1235 1193
1236 // True for blocks inside a try { } region. 1194 // True for blocks inside a try { } region.
1237 bool InsideTryBlock() const { 1195 bool InsideTryBlock() const {
1238 return try_index_ != CatchClauseNode::kInvalidTryIndex; 1196 return try_index_ != CatchClauseNode::kInvalidTryIndex;
1239 } 1197 }
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 1423
1466 ZoneGrowableArray<PhiInstr*>* phis() const { return phis_; } 1424 ZoneGrowableArray<PhiInstr*>* phis() const { return phis_; }
1467 1425
1468 PhiInstr* InsertPhi(intptr_t var_index, intptr_t var_count); 1426 PhiInstr* InsertPhi(intptr_t var_index, intptr_t var_count);
1469 void RemoveDeadPhis(Definition* replacement); 1427 void RemoveDeadPhis(Definition* replacement);
1470 1428
1471 void InsertPhi(PhiInstr* phi); 1429 void InsertPhi(PhiInstr* phi);
1472 void RemovePhi(PhiInstr* phi); 1430 void RemovePhi(PhiInstr* phi);
1473 1431
1474 virtual bool HasUnknownSideEffects() const { return false; } 1432 virtual bool HasUnknownSideEffects() const { return false; }
1475 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1476 1433
1477 PRINT_TO_SUPPORT 1434 PRINT_TO_SUPPORT
1478 1435
1479 private: 1436 private:
1480 // Classes that have access to predecessors_ when inlining. 1437 // Classes that have access to predecessors_ when inlining.
1481 friend class BlockEntryInstr; 1438 friend class BlockEntryInstr;
1482 friend class InlineExitCollector; 1439 friend class InlineExitCollector;
1483 friend class PolymorphicInliner; 1440 friend class PolymorphicInliner;
1484 friend class IndirectEntryInstr; // Access in il_printer.cc. 1441 friend class IndirectEntryInstr; // Access in il_printer.cc.
1485 1442
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
1877 RemoveFromUseList(); 1834 RemoveFromUseList();
1878 set_definition(def); 1835 set_definition(def);
1879 def->AddEnvUse(this); 1836 def->AddEnvUse(this);
1880 } 1837 }
1881 1838
1882 class PureDefinition : public Definition { 1839 class PureDefinition : public Definition {
1883 public: 1840 public:
1884 explicit PureDefinition(intptr_t deopt_id) : Definition(deopt_id) {} 1841 explicit PureDefinition(intptr_t deopt_id) : Definition(deopt_id) {}
1885 1842
1886 virtual bool AllowsCSE() const { return true; } 1843 virtual bool AllowsCSE() const { return true; }
1887 virtual EffectSet Dependencies() const { return EffectSet::None(); }
1888
1889 virtual bool HasUnknownSideEffects() const { return false; } 1844 virtual bool HasUnknownSideEffects() const { return false; }
1890 }; 1845 };
1891 1846
1892 template <intptr_t N, 1847 template <intptr_t N,
1893 typename ThrowsTrait, 1848 typename ThrowsTrait,
1894 template <typename Impure, typename Pure> class CSETrait = NoCSE> 1849 template <typename Impure, typename Pure> class CSETrait = NoCSE>
1895 class TemplateDefinition : public CSETrait<Definition, PureDefinition>::Base { 1850 class TemplateDefinition : public CSETrait<Definition, PureDefinition>::Base {
1896 public: 1851 public:
1897 explicit TemplateDefinition(intptr_t deopt_id = Thread::kNoDeoptId) 1852 explicit TemplateDefinition(intptr_t deopt_id = Thread::kNoDeoptId)
1898 : CSETrait<Definition, PureDefinition>::Base(deopt_id), inputs_() {} 1853 : CSETrait<Definition, PureDefinition>::Base(deopt_id), inputs_() {}
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 1985
2031 intptr_t InputCount() const { return 0; } 1986 intptr_t InputCount() const { return 0; }
2032 Value* InputAt(intptr_t i) const { 1987 Value* InputAt(intptr_t i) const {
2033 UNREACHABLE(); 1988 UNREACHABLE();
2034 return NULL; 1989 return NULL;
2035 } 1990 }
2036 1991
2037 virtual bool ComputeCanDeoptimize() const { return false; } 1992 virtual bool ComputeCanDeoptimize() const { return false; }
2038 1993
2039 virtual bool HasUnknownSideEffects() const { return false; } 1994 virtual bool HasUnknownSideEffects() const { return false; }
2040 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2041 1995
2042 virtual intptr_t Hashcode() const { 1996 virtual intptr_t Hashcode() const {
2043 UNREACHABLE(); 1997 UNREACHABLE();
2044 return 0; 1998 return 0;
2045 } 1999 }
2046 2000
2047 virtual CompileType ComputeType() const; 2001 virtual CompileType ComputeType() const;
2048 2002
2049 virtual bool MayThrow() const { return false; } 2003 virtual bool MayThrow() const { return false; }
2050 2004
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2175 const char* message() const { return message_; } 2129 const char* message() const { return message_; }
2176 2130
2177 DECLARE_INSTRUCTION(Stop); 2131 DECLARE_INSTRUCTION(Stop);
2178 2132
2179 virtual intptr_t ArgumentCount() const { return 0; } 2133 virtual intptr_t ArgumentCount() const { return 0; }
2180 2134
2181 virtual bool ComputeCanDeoptimize() const { return false; } 2135 virtual bool ComputeCanDeoptimize() const { return false; }
2182 2136
2183 virtual bool HasUnknownSideEffects() const { return false; } 2137 virtual bool HasUnknownSideEffects() const { return false; }
2184 2138
2185 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2186
2187 private: 2139 private:
2188 const char* message_; 2140 const char* message_;
2189 2141
2190 DISALLOW_COPY_AND_ASSIGN(StopInstr); 2142 DISALLOW_COPY_AND_ASSIGN(StopInstr);
2191 }; 2143 };
2192 2144
2193 class GotoInstr : public TemplateInstruction<0, NoThrow> { 2145 class GotoInstr : public TemplateInstruction<0, NoThrow> {
2194 public: 2146 public:
2195 explicit GotoInstr(JoinEntryInstr* entry, intptr_t deopt_id) 2147 explicit GotoInstr(JoinEntryInstr* entry, intptr_t deopt_id)
2196 : TemplateInstruction(deopt_id), 2148 : TemplateInstruction(deopt_id),
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2379 const TokenPosition token_pos_; 2331 const TokenPosition token_pos_;
2380 Token::Kind kind_; 2332 Token::Kind kind_;
2381 intptr_t operation_cid_; // Set by optimizer. 2333 intptr_t operation_cid_; // Set by optimizer.
2382 2334
2383 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr); 2335 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr);
2384 }; 2336 };
2385 2337
2386 class PureComparison : public ComparisonInstr { 2338 class PureComparison : public ComparisonInstr {
2387 public: 2339 public:
2388 virtual bool AllowsCSE() const { return true; } 2340 virtual bool AllowsCSE() const { return true; }
2389 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2390
2391 virtual bool HasUnknownSideEffects() const { return false; } 2341 virtual bool HasUnknownSideEffects() const { return false; }
2392 2342
2393 protected: 2343 protected:
2394 PureComparison(TokenPosition token_pos, Token::Kind kind, intptr_t deopt_id) 2344 PureComparison(TokenPosition token_pos, Token::Kind kind, intptr_t deopt_id)
2395 : ComparisonInstr(token_pos, kind, deopt_id) {} 2345 : ComparisonInstr(token_pos, kind, deopt_id) {}
2396 }; 2346 };
2397 2347
2398 template <intptr_t N, 2348 template <intptr_t N,
2399 typename ThrowsTrait, 2349 typename ThrowsTrait,
2400 template <typename Impure, typename Pure> class CSETrait = NoCSE> 2350 template <typename Impure, typename Pure> class CSETrait = NoCSE>
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2531 2481
2532 virtual CompileType ComputeType() const; 2482 virtual CompileType ComputeType() const;
2533 virtual bool RecomputeType(); 2483 virtual bool RecomputeType();
2534 2484
2535 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2485 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2536 2486
2537 void set_constrained_type(CompileType* type) { constrained_type_ = type; } 2487 void set_constrained_type(CompileType* type) { constrained_type_ = type; }
2538 CompileType* constrained_type() const { return constrained_type_; } 2488 CompileType* constrained_type() const { return constrained_type_; }
2539 2489
2540 virtual bool ComputeCanDeoptimize() const { return false; } 2490 virtual bool ComputeCanDeoptimize() const { return false; }
2541 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2542 virtual bool HasUnknownSideEffects() const { return false; } 2491 virtual bool HasUnknownSideEffects() const { return false; }
2543 2492
2544 private: 2493 private:
2545 CompileType* constrained_type_; 2494 CompileType* constrained_type_;
2546 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr); 2495 DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr);
2547 }; 2496 };
2548 2497
2549 class ConstraintInstr : public TemplateDefinition<1, NoThrow> { 2498 class ConstraintInstr : public TemplateDefinition<1, NoThrow> {
2550 public: 2499 public:
2551 ConstraintInstr(Value* value, Range* constraint) 2500 ConstraintInstr(Value* value, Range* constraint)
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
2730 enum SpecialParameterKind { kContext, kTypeArgs }; 2679 enum SpecialParameterKind { kContext, kTypeArgs };
2731 SpecialParameterInstr(SpecialParameterKind kind, intptr_t deopt_id) 2680 SpecialParameterInstr(SpecialParameterKind kind, intptr_t deopt_id)
2732 : TemplateDefinition(deopt_id), kind_(kind) {} 2681 : TemplateDefinition(deopt_id), kind_(kind) {}
2733 2682
2734 DECLARE_INSTRUCTION(SpecialParameter) 2683 DECLARE_INSTRUCTION(SpecialParameter)
2735 virtual CompileType ComputeType() const; 2684 virtual CompileType ComputeType() const;
2736 2685
2737 virtual bool ComputeCanDeoptimize() const { return false; } 2686 virtual bool ComputeCanDeoptimize() const { return false; }
2738 2687
2739 virtual bool HasUnknownSideEffects() const { return false; } 2688 virtual bool HasUnknownSideEffects() const { return false; }
2740 virtual EffectSet Dependencies() const { return EffectSet::None(); } 2689
2741 virtual bool AttributesEqual(Instruction* other) const { 2690 virtual bool AttributesEqual(Instruction* other) const {
2742 return kind() == other->AsSpecialParameter()->kind(); 2691 return kind() == other->AsSpecialParameter()->kind();
2743 } 2692 }
2744 SpecialParameterKind kind() const { return kind_; } 2693 SpecialParameterKind kind() const { return kind_; }
2745 2694
2746 private: 2695 private:
2747 const SpecialParameterKind kind_; 2696 const SpecialParameterKind kind_;
2748 DISALLOW_COPY_AND_ASSIGN(SpecialParameterInstr); 2697 DISALLOW_COPY_AND_ASSIGN(SpecialParameterInstr);
2749 }; 2698 };
2750 2699
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
3254 virtual void InferRange(RangeAnalysis* analysis, Range* range); 3203 virtual void InferRange(RangeAnalysis* analysis, Range* range);
3255 3204
3256 ComparisonInstr* comparison() const { return comparison_; } 3205 ComparisonInstr* comparison() const { return comparison_; }
3257 intptr_t if_true() const { return if_true_; } 3206 intptr_t if_true() const { return if_true_; }
3258 intptr_t if_false() const { return if_false_; } 3207 intptr_t if_false() const { return if_false_; }
3259 3208
3260 virtual bool AllowsCSE() const { return comparison()->AllowsCSE(); } 3209 virtual bool AllowsCSE() const { return comparison()->AllowsCSE(); }
3261 virtual bool HasUnknownSideEffects() const { 3210 virtual bool HasUnknownSideEffects() const {
3262 return comparison()->HasUnknownSideEffects(); 3211 return comparison()->HasUnknownSideEffects();
3263 } 3212 }
3264 virtual EffectSet Dependencies() const { 3213
3265 return comparison()->Dependencies();
3266 }
3267 virtual bool AttributesEqual(Instruction* other) const { 3214 virtual bool AttributesEqual(Instruction* other) const {
3268 IfThenElseInstr* other_if_then_else = other->AsIfThenElse(); 3215 IfThenElseInstr* other_if_then_else = other->AsIfThenElse();
3269 return (comparison()->tag() == other_if_then_else->comparison()->tag()) && 3216 return (comparison()->tag() == other_if_then_else->comparison()->tag()) &&
3270 comparison()->AttributesEqual(other_if_then_else->comparison()) && 3217 comparison()->AttributesEqual(other_if_then_else->comparison()) &&
3271 (if_true_ == other_if_then_else->if_true_) && 3218 (if_true_ == other_if_then_else->if_true_) &&
3272 (if_false_ == other_if_then_else->if_false_); 3219 (if_false_ == other_if_then_else->if_false_);
3273 } 3220 }
3274 3221
3275 virtual bool MayThrow() const { return comparison()->MayThrow(); } 3222 virtual bool MayThrow() const { return comparison()->MayThrow(); }
3276 3223
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
3774 const Field& StaticField() const; 3721 const Field& StaticField() const;
3775 3722
3776 Value* field_value() const { return inputs_[0]; } 3723 Value* field_value() const { return inputs_[0]; }
3777 3724
3778 virtual bool ComputeCanDeoptimize() const { return false; } 3725 virtual bool ComputeCanDeoptimize() const { return false; }
3779 3726
3780 virtual bool AllowsCSE() const { 3727 virtual bool AllowsCSE() const {
3781 return StaticField().is_final() && !FLAG_fields_may_be_reset; 3728 return StaticField().is_final() && !FLAG_fields_may_be_reset;
3782 } 3729 }
3783 virtual bool HasUnknownSideEffects() const { return false; } 3730 virtual bool HasUnknownSideEffects() const { return false; }
3784 virtual EffectSet Dependencies() const; 3731
3785 virtual bool AttributesEqual(Instruction* other) const; 3732 virtual bool AttributesEqual(Instruction* other) const;
3786 3733
3787 virtual TokenPosition token_pos() const { return token_pos_; } 3734 virtual TokenPosition token_pos() const { return token_pos_; }
3788 3735
3789 PRINT_OPERANDS_TO_SUPPORT 3736 PRINT_OPERANDS_TO_SUPPORT
3790 3737
3791 private: 3738 private:
3792 const TokenPosition token_pos_; 3739 const TokenPosition token_pos_;
3793 3740
3794 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr); 3741 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr);
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
4509 bool Evaluate(const Object& instance_value, Object* result); 4456 bool Evaluate(const Object& instance_value, Object* result);
4510 4457
4511 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4458 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4512 4459
4513 static MethodRecognizer::Kind RecognizedKindFromArrayCid(intptr_t cid); 4460 static MethodRecognizer::Kind RecognizedKindFromArrayCid(intptr_t cid);
4514 4461
4515 static bool IsFixedLengthArrayCid(intptr_t cid); 4462 static bool IsFixedLengthArrayCid(intptr_t cid);
4516 4463
4517 virtual bool AllowsCSE() const { return immutable_; } 4464 virtual bool AllowsCSE() const { return immutable_; }
4518 virtual bool HasUnknownSideEffects() const { return false; } 4465 virtual bool HasUnknownSideEffects() const { return false; }
4519 virtual EffectSet Dependencies() const; 4466
4520 virtual bool AttributesEqual(Instruction* other) const; 4467 virtual bool AttributesEqual(Instruction* other) const;
4521 4468
4522 PRINT_OPERANDS_TO_SUPPORT 4469 PRINT_OPERANDS_TO_SUPPORT
4523 4470
4524 private: 4471 private:
4525 const intptr_t offset_in_bytes_; 4472 const intptr_t offset_in_bytes_;
4526 const AbstractType& type_; 4473 const AbstractType& type_;
4527 intptr_t result_cid_; 4474 intptr_t result_cid_;
4528 bool immutable_; 4475 bool immutable_;
4529 4476
(...skipping 3083 matching lines...) Expand 10 before | Expand all | Expand 10 after
7613 bool IsNullCheck() const { return IsDeoptIfNull() || IsDeoptIfNotNull(); } 7560 bool IsNullCheck() const { return IsDeoptIfNull() || IsDeoptIfNotNull(); }
7614 7561
7615 bool IsDeoptIfNull() const; 7562 bool IsDeoptIfNull() const;
7616 bool IsDeoptIfNotNull() const; 7563 bool IsDeoptIfNotNull() const;
7617 7564
7618 bool IsBitTest() const; 7565 bool IsBitTest() const;
7619 static bool IsCompactCidRange(const Cids& cids); 7566 static bool IsCompactCidRange(const Cids& cids);
7620 intptr_t ComputeCidMask() const; 7567 intptr_t ComputeCidMask() const;
7621 7568
7622 virtual bool AllowsCSE() const { return true; } 7569 virtual bool AllowsCSE() const { return true; }
7623 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7624 virtual bool HasUnknownSideEffects() const { return false; } 7570 virtual bool HasUnknownSideEffects() const { return false; }
7571
7625 virtual bool AttributesEqual(Instruction* other) const; 7572 virtual bool AttributesEqual(Instruction* other) const;
7626 7573
7627 bool licm_hoisted() const { return licm_hoisted_; } 7574 bool licm_hoisted() const { return licm_hoisted_; }
7628 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 7575 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
7629 7576
7630 PRINT_OPERANDS_TO_SUPPORT 7577 PRINT_OPERANDS_TO_SUPPORT
7631 7578
7632 private: 7579 private:
7633 const Cids& cids_; 7580 const Cids& cids_;
7634 bool licm_hoisted_; 7581 bool licm_hoisted_;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
7693 Value* value() const { return inputs_[0]; } 7640 Value* value() const { return inputs_[0]; }
7694 const CidRange& cids() const { return cids_; } 7641 const CidRange& cids() const { return cids_; }
7695 7642
7696 DECLARE_INSTRUCTION(CheckClassId) 7643 DECLARE_INSTRUCTION(CheckClassId)
7697 7644
7698 virtual bool ComputeCanDeoptimize() const { return true; } 7645 virtual bool ComputeCanDeoptimize() const { return true; }
7699 7646
7700 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7647 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7701 7648
7702 virtual bool AllowsCSE() const { return true; } 7649 virtual bool AllowsCSE() const { return true; }
7703 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7704 virtual bool HasUnknownSideEffects() const { return false; } 7650 virtual bool HasUnknownSideEffects() const { return false; }
7651
7705 virtual bool AttributesEqual(Instruction* other) const { return true; } 7652 virtual bool AttributesEqual(Instruction* other) const { return true; }
7706 7653
7707 PRINT_OPERANDS_TO_SUPPORT 7654 PRINT_OPERANDS_TO_SUPPORT
7708 7655
7709 private: 7656 private:
7710 bool Contains(intptr_t cid) const; 7657 bool Contains(intptr_t cid) const;
7711 7658
7712 CidRange cids_; 7659 CidRange cids_;
7713 7660
7714 DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr); 7661 DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
7761 GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id) 7708 GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id)
7762 : TemplateInstruction(deopt_id) { 7709 : TemplateInstruction(deopt_id) {
7763 SetInputAt(kLengthPos, length); 7710 SetInputAt(kLengthPos, length);
7764 SetInputAt(kIndexPos, index); 7711 SetInputAt(kIndexPos, index);
7765 } 7712 }
7766 7713
7767 Value* length() const { return inputs_[kLengthPos]; } 7714 Value* length() const { return inputs_[kLengthPos]; }
7768 Value* index() const { return inputs_[kIndexPos]; } 7715 Value* index() const { return inputs_[kIndexPos]; }
7769 7716
7770 virtual bool HasUnknownSideEffects() const { return false; } 7717 virtual bool HasUnknownSideEffects() const { return false; }
7771 virtual EffectSet Dependencies() const { return EffectSet::None(); }
7772 7718
7773 DECLARE_INSTRUCTION(GenericCheckBound) 7719 DECLARE_INSTRUCTION(GenericCheckBound)
7774 7720
7775 virtual bool ComputeCanDeoptimize() const { return true; } 7721 virtual bool ComputeCanDeoptimize() const { return true; }
7776 7722
7777 // Give a name to the location/input indices. 7723 // Give a name to the location/input indices.
7778 enum { kLengthPos = 0, kIndexPos = 1 }; 7724 enum { kLengthPos = 0, kIndexPos = 1 };
7779 7725
7780 private: 7726 private:
7781 DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr); 7727 DISALLOW_COPY_AND_ASSIGN(GenericCheckBoundInstr);
(...skipping 30 matching lines...) Expand all
7812 virtual bool ComputeCanDeoptimize() const; 7758 virtual bool ComputeCanDeoptimize() const;
7813 7759
7814 virtual Representation representation() const { return to(); } 7760 virtual Representation representation() const { return to(); }
7815 7761
7816 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 7762 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
7817 ASSERT(idx == 0); 7763 ASSERT(idx == 0);
7818 return from(); 7764 return from();
7819 } 7765 }
7820 7766
7821 virtual bool HasUnknownSideEffects() const { return false; } 7767 virtual bool HasUnknownSideEffects() const { return false; }
7822 virtual EffectSet Dependencies() const { return EffectSet::None(); } 7768
7823 virtual bool AttributesEqual(Instruction* other) const { 7769 virtual bool AttributesEqual(Instruction* other) const {
7824 ASSERT(other->IsUnboxedIntConverter()); 7770 ASSERT(other->IsUnboxedIntConverter());
7825 UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter(); 7771 UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter();
7826 return (converter->from() == from()) && (converter->to() == to()) && 7772 return (converter->from() == from()) && (converter->to() == to()) &&
7827 (converter->is_truncating() == is_truncating()); 7773 (converter->is_truncating() == is_truncating());
7828 } 7774 }
7829 7775
7830 virtual void InferRange(RangeAnalysis* analysis, Range* range); 7776 virtual void InferRange(RangeAnalysis* analysis, Range* range);
7831 7777
7832 virtual CompileType ComputeType() const { 7778 virtual CompileType ComputeType() const {
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
8103 #define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name) \ 8049 #define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name) \
8104 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ 8050 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \
8105 UNIMPLEMENTED(); \ 8051 UNIMPLEMENTED(); \
8106 return NULL; \ 8052 return NULL; \
8107 } \ 8053 } \
8108 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } 8054 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
8109 8055
8110 } // namespace dart 8056 } // namespace dart
8111 8057
8112 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 8058 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_range_analysis.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698