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

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

Issue 1644793002: Replace intptr_t with TokenDescriptor (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
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 VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define 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"
11 #include "vm/handles_impl.h" 11 #include "vm/handles_impl.h"
12 #include "vm/locations.h" 12 #include "vm/locations.h"
13 #include "vm/method_recognizer.h" 13 #include "vm/method_recognizer.h"
14 #include "vm/object.h" 14 #include "vm/object.h"
15 #include "vm/parser.h" 15 #include "vm/parser.h"
16 #include "vm/token_descriptor.h"
16 17
17 namespace dart { 18 namespace dart {
18 19
19 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); 20 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
20 21
21 class BitVector; 22 class BitVector;
22 class BlockEntryInstr; 23 class BlockEntryInstr;
23 class BoxIntegerInstr; 24 class BoxIntegerInstr;
24 class BufferFormatter; 25 class BufferFormatter;
25 class CatchBlockEntryInstr; 26 class CatchBlockEntryInstr;
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 virtual Tag tag() const = 0; 621 virtual Tag tag() const = 0;
621 622
622 intptr_t deopt_id() const { 623 intptr_t deopt_id() const {
623 ASSERT(CanDeoptimize() || CanBecomeDeoptimizationTarget()); 624 ASSERT(CanDeoptimize() || CanBecomeDeoptimizationTarget());
624 return GetDeoptId(); 625 return GetDeoptId();
625 } 626 }
626 627
627 const ICData* GetICData( 628 const ICData* GetICData(
628 const ZoneGrowableArray<const ICData*>& ic_data_array) const; 629 const ZoneGrowableArray<const ICData*>& ic_data_array) const;
629 630
630 virtual intptr_t token_pos() const { return Token::kNoSourcePos; } 631 virtual TokenDescriptor token_pos() const {
632 return TokenDescriptor::kNoSource;
633 }
631 634
632 virtual intptr_t InputCount() const = 0; 635 virtual intptr_t InputCount() const = 0;
633 virtual Value* InputAt(intptr_t i) const = 0; 636 virtual Value* InputAt(intptr_t i) const = 0;
634 void SetInputAt(intptr_t i, Value* value) { 637 void SetInputAt(intptr_t i, Value* value) {
635 ASSERT(value != NULL); 638 ASSERT(value != NULL);
636 value->set_instruction(this); 639 value->set_instruction(this);
637 value->set_use_index(i); 640 value->set_use_index(i);
638 RawSetInputAt(i, value); 641 RawSetInputAt(i, value);
639 } 642 }
640 643
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 } 1049 }
1047 1050
1048 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; } 1051 MoveOperands* MoveOperandsAt(intptr_t index) const { return moves_[index]; }
1049 1052
1050 intptr_t NumMoves() const { return moves_.length(); } 1053 intptr_t NumMoves() const { return moves_.length(); }
1051 1054
1052 bool IsRedundant() const; 1055 bool IsRedundant() const;
1053 1056
1054 virtual void PrintTo(BufferFormatter* f) const; 1057 virtual void PrintTo(BufferFormatter* f) const;
1055 1058
1056 virtual intptr_t token_pos() const { 1059 virtual TokenDescriptor token_pos() const {
1057 return ClassifyingTokenPositions::kParallelMove; 1060 return TokenDescriptor::kParallelMove;
1058 } 1061 }
1059 1062
1060 private: 1063 private:
1061 GrowableArray<MoveOperands*> moves_; // Elements cannot be null. 1064 GrowableArray<MoveOperands*> moves_; // Elements cannot be null.
1062 1065
1063 DISALLOW_COPY_AND_ASSIGN(ParallelMoveInstr); 1066 DISALLOW_COPY_AND_ASSIGN(ParallelMoveInstr);
1064 }; 1067 };
1065 1068
1066 1069
1067 // Basic block entries are administrative nodes. There is a distinguished 1070 // Basic block entries are administrative nodes. There is a distinguished
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 1185
1183 BitVector* loop_info() const { return loop_info_; } 1186 BitVector* loop_info() const { return loop_info_; }
1184 void set_loop_info(BitVector* loop_info) { 1187 void set_loop_info(BitVector* loop_info) {
1185 loop_info_ = loop_info; 1188 loop_info_ = loop_info;
1186 } 1189 }
1187 1190
1188 virtual BlockEntryInstr* GetBlock() { 1191 virtual BlockEntryInstr* GetBlock() {
1189 return this; 1192 return this;
1190 } 1193 }
1191 1194
1192 virtual intptr_t token_pos() const { 1195 virtual TokenDescriptor token_pos() const {
1193 return ClassifyingTokenPositions::kControlFlow; 1196 return TokenDescriptor::kControlFlow;
1194 } 1197 }
1195 1198
1196 // Helper to mutate the graph during inlining. This block should be 1199 // Helper to mutate the graph during inlining. This block should be
1197 // replaced with new_block as a predecessor of all of this block's 1200 // replaced with new_block as a predecessor of all of this block's
1198 // successors. 1201 // successors.
1199 void ReplaceAsPredecessorWith(BlockEntryInstr* new_block); 1202 void ReplaceAsPredecessorWith(BlockEntryInstr* new_block);
1200 1203
1201 void set_block_id(intptr_t block_id) { block_id_ = block_id; } 1204 void set_block_id(intptr_t block_id) { block_id_ = block_id; }
1202 1205
1203 intptr_t offset() const { return offset_; } 1206 intptr_t offset() const { return offset_; }
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 virtual CompileType ComputeType() const; 2038 virtual CompileType ComputeType() const;
2036 2039
2037 Value* value() const { return InputAt(0); } 2040 Value* value() const { return InputAt(0); }
2038 2041
2039 virtual bool CanDeoptimize() const { return false; } 2042 virtual bool CanDeoptimize() const { return false; }
2040 2043
2041 virtual EffectSet Effects() const { return EffectSet::None(); } 2044 virtual EffectSet Effects() const { return EffectSet::None(); }
2042 2045
2043 virtual void PrintOperandsTo(BufferFormatter* f) const; 2046 virtual void PrintOperandsTo(BufferFormatter* f) const;
2044 2047
2045 virtual intptr_t token_pos() const { 2048 virtual TokenDescriptor token_pos() const {
2046 return ClassifyingTokenPositions::kPushArgument; 2049 return TokenDescriptor::kPushArgument;
2047 } 2050 }
2048 2051
2049 private: 2052 private:
2050 DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr); 2053 DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr);
2051 }; 2054 };
2052 2055
2053 2056
2054 inline Definition* Instruction::ArgumentAt(intptr_t index) const { 2057 inline Definition* Instruction::ArgumentAt(intptr_t index) const {
2055 return PushArgumentAt(index)->value()->definition(); 2058 return PushArgumentAt(index)->value()->definition();
2056 } 2059 }
2057 2060
2058 2061
2059 class ReturnInstr : public TemplateInstruction<1, NoThrow> { 2062 class ReturnInstr : public TemplateInstruction<1, NoThrow> {
2060 public: 2063 public:
2061 ReturnInstr(intptr_t token_pos, Value* value) 2064 ReturnInstr(TokenDescriptor token_pos, Value* value)
2062 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 2065 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
2063 token_pos_(token_pos) { 2066 token_pos_(token_pos) {
2064 SetInputAt(0, value); 2067 SetInputAt(0, value);
2065 } 2068 }
2066 2069
2067 DECLARE_INSTRUCTION(Return) 2070 DECLARE_INSTRUCTION(Return)
2068 2071
2069 virtual intptr_t token_pos() const { return token_pos_; } 2072 virtual TokenDescriptor token_pos() const { return token_pos_; }
2070 Value* value() const { return inputs_[0]; } 2073 Value* value() const { return inputs_[0]; }
2071 2074
2072 virtual bool CanBecomeDeoptimizationTarget() const { 2075 virtual bool CanBecomeDeoptimizationTarget() const {
2073 // Return instruction might turn into a Goto instruction after inlining. 2076 // Return instruction might turn into a Goto instruction after inlining.
2074 // Every Goto must have an environment. 2077 // Every Goto must have an environment.
2075 return true; 2078 return true;
2076 } 2079 }
2077 2080
2078 virtual bool CanDeoptimize() const { return false; } 2081 virtual bool CanDeoptimize() const { return false; }
2079 2082
2080 virtual EffectSet Effects() const { return EffectSet::None(); } 2083 virtual EffectSet Effects() const { return EffectSet::None(); }
2081 2084
2082 private: 2085 private:
2083 const intptr_t token_pos_; 2086 const TokenDescriptor token_pos_;
2084 2087
2085 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); 2088 DISALLOW_COPY_AND_ASSIGN(ReturnInstr);
2086 }; 2089 };
2087 2090
2088 2091
2089 class ThrowInstr : public TemplateInstruction<0, Throws> { 2092 class ThrowInstr : public TemplateInstruction<0, Throws> {
2090 public: 2093 public:
2091 explicit ThrowInstr(intptr_t token_pos) 2094 explicit ThrowInstr(TokenDescriptor token_pos)
2092 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 2095 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
2093 token_pos_(token_pos) { 2096 token_pos_(token_pos) {
2094 } 2097 }
2095 2098
2096 DECLARE_INSTRUCTION(Throw) 2099 DECLARE_INSTRUCTION(Throw)
2097 2100
2098 virtual intptr_t ArgumentCount() const { return 1; } 2101 virtual intptr_t ArgumentCount() const { return 1; }
2099 2102
2100 virtual intptr_t token_pos() const { return token_pos_; } 2103 virtual TokenDescriptor token_pos() const { return token_pos_; }
2101 2104
2102 virtual bool CanDeoptimize() const { return true; } 2105 virtual bool CanDeoptimize() const { return true; }
2103 2106
2104 virtual EffectSet Effects() const { return EffectSet::None(); } 2107 virtual EffectSet Effects() const { return EffectSet::None(); }
2105 2108
2106 private: 2109 private:
2107 const intptr_t token_pos_; 2110 const TokenDescriptor token_pos_;
2108 2111
2109 DISALLOW_COPY_AND_ASSIGN(ThrowInstr); 2112 DISALLOW_COPY_AND_ASSIGN(ThrowInstr);
2110 }; 2113 };
2111 2114
2112 2115
2113 class ReThrowInstr : public TemplateInstruction<0, Throws> { 2116 class ReThrowInstr : public TemplateInstruction<0, Throws> {
2114 public: 2117 public:
2115 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the 2118 // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the
2116 // rethrow has been artifically generated by the parser. 2119 // rethrow has been artifically generated by the parser.
2117 ReThrowInstr(intptr_t token_pos, intptr_t catch_try_index) 2120 ReThrowInstr(TokenDescriptor token_pos, intptr_t catch_try_index)
2118 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 2121 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
2119 token_pos_(token_pos), 2122 token_pos_(token_pos),
2120 catch_try_index_(catch_try_index) { 2123 catch_try_index_(catch_try_index) {
2121 } 2124 }
2122 2125
2123 DECLARE_INSTRUCTION(ReThrow) 2126 DECLARE_INSTRUCTION(ReThrow)
2124 2127
2125 virtual intptr_t ArgumentCount() const { return 2; } 2128 virtual intptr_t ArgumentCount() const { return 2; }
2126 2129
2127 virtual intptr_t token_pos() const { return token_pos_; } 2130 virtual TokenDescriptor token_pos() const { return token_pos_; }
2128 intptr_t catch_try_index() const { return catch_try_index_; } 2131 intptr_t catch_try_index() const { return catch_try_index_; }
2129 2132
2130 virtual bool CanDeoptimize() const { return true; } 2133 virtual bool CanDeoptimize() const { return true; }
2131 2134
2132 virtual EffectSet Effects() const { return EffectSet::None(); } 2135 virtual EffectSet Effects() const { return EffectSet::None(); }
2133 2136
2134 private: 2137 private:
2135 const intptr_t token_pos_; 2138 const TokenDescriptor token_pos_;
2136 const intptr_t catch_try_index_; 2139 const intptr_t catch_try_index_;
2137 2140
2138 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr); 2141 DISALLOW_COPY_AND_ASSIGN(ReThrowInstr);
2139 }; 2142 };
2140 2143
2141 2144
2142 class StopInstr : public TemplateInstruction<0, NoThrow> { 2145 class StopInstr : public TemplateInstruction<0, NoThrow> {
2143 public: 2146 public:
2144 explicit StopInstr(const char* message) 2147 explicit StopInstr(const char* message)
2145 : message_(message) { 2148 : message_(message) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 2216
2214 ParallelMoveInstr* GetParallelMove() { 2217 ParallelMoveInstr* GetParallelMove() {
2215 if (parallel_move_ == NULL) { 2218 if (parallel_move_ == NULL) {
2216 parallel_move_ = new ParallelMoveInstr(); 2219 parallel_move_ = new ParallelMoveInstr();
2217 } 2220 }
2218 return parallel_move_; 2221 return parallel_move_;
2219 } 2222 }
2220 2223
2221 virtual void PrintTo(BufferFormatter* f) const; 2224 virtual void PrintTo(BufferFormatter* f) const;
2222 2225
2223 virtual intptr_t token_pos() const { 2226 virtual TokenDescriptor token_pos() const {
2224 return ClassifyingTokenPositions::kControlFlow; 2227 return TokenDescriptor::kControlFlow;
2225 } 2228 }
2226 2229
2227 private: 2230 private:
2228 BlockEntryInstr* block_; 2231 BlockEntryInstr* block_;
2229 JoinEntryInstr* successor_; 2232 JoinEntryInstr* successor_;
2230 double edge_weight_; 2233 double edge_weight_;
2231 2234
2232 // Parallel move that will be used by linear scan register allocator to 2235 // Parallel move that will be used by linear scan register allocator to
2233 // connect live ranges at the end of the block and resolve phis. 2236 // connect live ranges at the end of the block and resolve phis.
2234 ParallelMoveInstr* parallel_move_; 2237 ParallelMoveInstr* parallel_move_;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2290 GrowableArray<TargetEntryInstr*> successors_; 2293 GrowableArray<TargetEntryInstr*> successors_;
2291 TypedData& offsets_; 2294 TypedData& offsets_;
2292 }; 2295 };
2293 2296
2294 2297
2295 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> { 2298 class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> {
2296 public: 2299 public:
2297 Value* left() const { return inputs_[0]; } 2300 Value* left() const { return inputs_[0]; }
2298 Value* right() const { return inputs_[1]; } 2301 Value* right() const { return inputs_[1]; }
2299 2302
2300 virtual intptr_t token_pos() const { return token_pos_; } 2303 virtual TokenDescriptor token_pos() const { return token_pos_; }
2301 Token::Kind kind() const { return kind_; } 2304 Token::Kind kind() const { return kind_; }
2302 2305
2303 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0; 2306 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0;
2304 2307
2305 virtual void EmitBranchCode(FlowGraphCompiler* compiler, 2308 virtual void EmitBranchCode(FlowGraphCompiler* compiler,
2306 BranchInstr* branch) = 0; 2309 BranchInstr* branch) = 0;
2307 2310
2308 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler, 2311 virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
2309 BranchLabels labels) = 0; 2312 BranchLabels labels) = 0;
2310 2313
(...skipping 14 matching lines...) Expand all
2325 2328
2326 virtual bool AttributesEqual(Instruction* other) const { 2329 virtual bool AttributesEqual(Instruction* other) const {
2327 ComparisonInstr* other_comparison = other->AsComparison(); 2330 ComparisonInstr* other_comparison = other->AsComparison();
2328 return kind() == other_comparison->kind() && 2331 return kind() == other_comparison->kind() &&
2329 (operation_cid() == other_comparison->operation_cid()); 2332 (operation_cid() == other_comparison->operation_cid());
2330 } 2333 }
2331 2334
2332 DEFINE_INSTRUCTION_TYPE_CHECK(Comparison) 2335 DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
2333 2336
2334 protected: 2337 protected:
2335 ComparisonInstr(intptr_t token_pos, 2338 ComparisonInstr(TokenDescriptor token_pos,
2336 Token::Kind kind, 2339 Token::Kind kind,
2337 Value* left, 2340 Value* left,
2338 Value* right, 2341 Value* right,
2339 intptr_t deopt_id = Thread::kNoDeoptId) 2342 intptr_t deopt_id = Thread::kNoDeoptId)
2340 : TemplateDefinition(deopt_id), 2343 : TemplateDefinition(deopt_id),
2341 token_pos_(token_pos), 2344 token_pos_(token_pos),
2342 kind_(kind), 2345 kind_(kind),
2343 operation_cid_(kIllegalCid) { 2346 operation_cid_(kIllegalCid) {
2344 SetInputAt(0, left); 2347 SetInputAt(0, left);
2345 if (right != NULL) { 2348 if (right != NULL) {
2346 SetInputAt(1, right); 2349 SetInputAt(1, right);
2347 } 2350 }
2348 } 2351 }
2349 2352
2350 private: 2353 private:
2351 const intptr_t token_pos_; 2354 const TokenDescriptor token_pos_;
2352 Token::Kind kind_; 2355 Token::Kind kind_;
2353 intptr_t operation_cid_; // Set by optimizer. 2356 intptr_t operation_cid_; // Set by optimizer.
2354 2357
2355 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr); 2358 DISALLOW_COPY_AND_ASSIGN(ComparisonInstr);
2356 }; 2359 };
2357 2360
2358 2361
2359 class BranchInstr : public Instruction { 2362 class BranchInstr : public Instruction {
2360 public: 2363 public:
2361 explicit BranchInstr(ComparisonInstr* comparison) 2364 explicit BranchInstr(ComparisonInstr* comparison)
(...skipping 11 matching lines...) Expand all
2373 DECLARE_INSTRUCTION(Branch) 2376 DECLARE_INSTRUCTION(Branch)
2374 2377
2375 virtual intptr_t ArgumentCount() const { 2378 virtual intptr_t ArgumentCount() const {
2376 return comparison()->ArgumentCount(); 2379 return comparison()->ArgumentCount();
2377 } 2380 }
2378 2381
2379 intptr_t InputCount() const { return comparison()->InputCount(); } 2382 intptr_t InputCount() const { return comparison()->InputCount(); }
2380 2383
2381 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); } 2384 Value* InputAt(intptr_t i) const { return comparison()->InputAt(i); }
2382 2385
2383 virtual intptr_t token_pos() const { return comparison_->token_pos(); } 2386 virtual TokenDescriptor token_pos() const { return comparison_->token_pos(); }
2384 2387
2385 virtual bool CanDeoptimize() const { 2388 virtual bool CanDeoptimize() const {
2386 // Branches need a deoptimization info in checked mode if they 2389 // Branches need a deoptimization info in checked mode if they
2387 // can throw a type check error. 2390 // can throw a type check error.
2388 return comparison()->CanDeoptimize() || is_checked(); 2391 return comparison()->CanDeoptimize() || is_checked();
2389 } 2392 }
2390 2393
2391 virtual bool CanBecomeDeoptimizationTarget() const { 2394 virtual bool CanBecomeDeoptimizationTarget() const {
2392 return comparison()->CanBecomeDeoptimizationTarget(); 2395 return comparison()->CanBecomeDeoptimizationTarget();
2393 } 2396 }
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
2551 Range* constraint_; 2554 Range* constraint_;
2552 TargetEntryInstr* target_; 2555 TargetEntryInstr* target_;
2553 2556
2554 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr); 2557 DISALLOW_COPY_AND_ASSIGN(ConstraintInstr);
2555 }; 2558 };
2556 2559
2557 2560
2558 class ConstantInstr : public TemplateDefinition<0, NoThrow, Pure> { 2561 class ConstantInstr : public TemplateDefinition<0, NoThrow, Pure> {
2559 public: 2562 public:
2560 ConstantInstr(const Object& value, 2563 ConstantInstr(const Object& value,
2561 intptr_t token_pos = ClassifyingTokenPositions::kConstant); 2564 TokenDescriptor token_pos = TokenDescriptor::kConstant);
2562 2565
2563 DECLARE_INSTRUCTION(Constant) 2566 DECLARE_INSTRUCTION(Constant)
2564 virtual CompileType ComputeType() const; 2567 virtual CompileType ComputeType() const;
2565 2568
2566 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2569 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2567 2570
2568 const Object& value() const { return value_; } 2571 const Object& value() const { return value_; }
2569 2572
2570 virtual void PrintOperandsTo(BufferFormatter* f) const; 2573 virtual void PrintOperandsTo(BufferFormatter* f) const;
2571 2574
2572 virtual bool CanDeoptimize() const { return false; } 2575 virtual bool CanDeoptimize() const { return false; }
2573 2576
2574 virtual void InferRange(RangeAnalysis* analysis, Range* range); 2577 virtual void InferRange(RangeAnalysis* analysis, Range* range);
2575 2578
2576 virtual bool AttributesEqual(Instruction* other) const; 2579 virtual bool AttributesEqual(Instruction* other) const;
2577 2580
2578 virtual intptr_t token_pos() const { return token_pos_; } 2581 virtual TokenDescriptor token_pos() const { return token_pos_; }
2579 2582
2580 private: 2583 private:
2581 const Object& value_; 2584 const Object& value_;
2582 const intptr_t token_pos_; 2585 const TokenDescriptor token_pos_;
2583 2586
2584 DISALLOW_COPY_AND_ASSIGN(ConstantInstr); 2587 DISALLOW_COPY_AND_ASSIGN(ConstantInstr);
2585 }; 2588 };
2586 2589
2587 2590
2588 // Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr. 2591 // Merged ConstantInstr -> UnboxedXXX into UnboxedConstantInstr.
2589 // TODO(srdjan): Implemented currently for doubles only, should implement 2592 // TODO(srdjan): Implemented currently for doubles only, should implement
2590 // for other unboxing instructions. 2593 // for other unboxing instructions.
2591 class UnboxedConstantInstr : public ConstantInstr { 2594 class UnboxedConstantInstr : public ConstantInstr {
2592 public: 2595 public:
(...skipping 12 matching lines...) Expand all
2605 private: 2608 private:
2606 const Representation representation_; 2609 const Representation representation_;
2607 uword constant_address_; // Either NULL or points to the untagged constant. 2610 uword constant_address_; // Either NULL or points to the untagged constant.
2608 2611
2609 DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr); 2612 DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr);
2610 }; 2613 };
2611 2614
2612 2615
2613 class AssertAssignableInstr : public TemplateDefinition<2, Throws, Pure> { 2616 class AssertAssignableInstr : public TemplateDefinition<2, Throws, Pure> {
2614 public: 2617 public:
2615 AssertAssignableInstr(intptr_t token_pos, 2618 AssertAssignableInstr(TokenDescriptor token_pos,
2616 Value* value, 2619 Value* value,
2617 Value* instantiator_type_arguments, 2620 Value* instantiator_type_arguments,
2618 const AbstractType& dst_type, 2621 const AbstractType& dst_type,
2619 const String& dst_name, 2622 const String& dst_name,
2620 intptr_t deopt_id) 2623 intptr_t deopt_id)
2621 : TemplateDefinition(deopt_id), 2624 : TemplateDefinition(deopt_id),
2622 token_pos_(token_pos), 2625 token_pos_(token_pos),
2623 dst_type_(AbstractType::ZoneHandle(dst_type.raw())), 2626 dst_type_(AbstractType::ZoneHandle(dst_type.raw())),
2624 dst_name_(dst_name) { 2627 dst_name_(dst_name) {
2625 ASSERT(!dst_type.IsNull()); 2628 ASSERT(!dst_type.IsNull());
2626 ASSERT(!dst_name.IsNull()); 2629 ASSERT(!dst_name.IsNull());
2627 SetInputAt(0, value); 2630 SetInputAt(0, value);
2628 SetInputAt(1, instantiator_type_arguments); 2631 SetInputAt(1, instantiator_type_arguments);
2629 } 2632 }
2630 2633
2631 DECLARE_INSTRUCTION(AssertAssignable) 2634 DECLARE_INSTRUCTION(AssertAssignable)
2632 virtual CompileType ComputeType() const; 2635 virtual CompileType ComputeType() const;
2633 virtual bool RecomputeType(); 2636 virtual bool RecomputeType();
2634 2637
2635 Value* value() const { return inputs_[0]; } 2638 Value* value() const { return inputs_[0]; }
2636 Value* instantiator_type_arguments() const { return inputs_[1]; } 2639 Value* instantiator_type_arguments() const { return inputs_[1]; }
2637 2640
2638 virtual intptr_t token_pos() const { return token_pos_; } 2641 virtual TokenDescriptor token_pos() const { return token_pos_; }
2639 const AbstractType& dst_type() const { return dst_type_; } 2642 const AbstractType& dst_type() const { return dst_type_; }
2640 void set_dst_type(const AbstractType& dst_type) { 2643 void set_dst_type(const AbstractType& dst_type) {
2641 dst_type_ = dst_type.raw(); 2644 dst_type_ = dst_type.raw();
2642 } 2645 }
2643 const String& dst_name() const { return dst_name_; } 2646 const String& dst_name() const { return dst_name_; }
2644 2647
2645 virtual void PrintOperandsTo(BufferFormatter* f) const; 2648 virtual void PrintOperandsTo(BufferFormatter* f) const;
2646 2649
2647 virtual bool CanDeoptimize() const { return true; } 2650 virtual bool CanDeoptimize() const { return true; }
2648 2651
2649 virtual bool CanBecomeDeoptimizationTarget() const { 2652 virtual bool CanBecomeDeoptimizationTarget() const {
2650 // AssertAssignable instructions that are specialized by the optimizer 2653 // AssertAssignable instructions that are specialized by the optimizer
2651 // (e.g. replaced with CheckClass) need a deoptimization descriptor before. 2654 // (e.g. replaced with CheckClass) need a deoptimization descriptor before.
2652 return true; 2655 return true;
2653 } 2656 }
2654 2657
2655 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2658 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2656 2659
2657 virtual bool AttributesEqual(Instruction* other) const; 2660 virtual bool AttributesEqual(Instruction* other) const;
2658 2661
2659 private: 2662 private:
2660 const intptr_t token_pos_; 2663 const TokenDescriptor token_pos_;
2661 AbstractType& dst_type_; 2664 AbstractType& dst_type_;
2662 const String& dst_name_; 2665 const String& dst_name_;
2663 2666
2664 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr); 2667 DISALLOW_COPY_AND_ASSIGN(AssertAssignableInstr);
2665 }; 2668 };
2666 2669
2667 2670
2668 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> { 2671 class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> {
2669 public: 2672 public:
2670 AssertBooleanInstr(intptr_t token_pos, Value* value) 2673 AssertBooleanInstr(TokenDescriptor token_pos, Value* value)
2671 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2674 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
2672 token_pos_(token_pos) { 2675 token_pos_(token_pos) {
2673 SetInputAt(0, value); 2676 SetInputAt(0, value);
2674 } 2677 }
2675 2678
2676 DECLARE_INSTRUCTION(AssertBoolean) 2679 DECLARE_INSTRUCTION(AssertBoolean)
2677 virtual CompileType ComputeType() const; 2680 virtual CompileType ComputeType() const;
2678 2681
2679 virtual intptr_t token_pos() const { return token_pos_; } 2682 virtual TokenDescriptor token_pos() const { return token_pos_; }
2680 Value* value() const { return inputs_[0]; } 2683 Value* value() const { return inputs_[0]; }
2681 2684
2682 virtual void PrintOperandsTo(BufferFormatter* f) const; 2685 virtual void PrintOperandsTo(BufferFormatter* f) const;
2683 2686
2684 virtual bool CanDeoptimize() const { return true; } 2687 virtual bool CanDeoptimize() const { return true; }
2685 2688
2686 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2689 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2687 2690
2688 virtual bool AttributesEqual(Instruction* other) const { return true; } 2691 virtual bool AttributesEqual(Instruction* other) const { return true; }
2689 2692
2690 private: 2693 private:
2691 const intptr_t token_pos_; 2694 const TokenDescriptor token_pos_;
2692 2695
2693 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr); 2696 DISALLOW_COPY_AND_ASSIGN(AssertBooleanInstr);
2694 }; 2697 };
2695 2698
2696 2699
2697 // Denotes the current context, normally held in a register. This is 2700 // Denotes the current context, normally held in a register. This is
2698 // a computation, not a value, because it's mutable. 2701 // a computation, not a value, because it's mutable.
2699 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> { 2702 class CurrentContextInstr : public TemplateDefinition<0, NoThrow> {
2700 public: 2703 public:
2701 CurrentContextInstr() 2704 CurrentContextInstr()
(...skipping 21 matching lines...) Expand all
2723 ZoneGrowableArray<PushArgumentInstr*>* arguments) 2726 ZoneGrowableArray<PushArgumentInstr*>* arguments)
2724 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2727 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
2725 ast_node_(*node), 2728 ast_node_(*node),
2726 arguments_(arguments) { 2729 arguments_(arguments) {
2727 SetInputAt(0, function); 2730 SetInputAt(0, function);
2728 } 2731 }
2729 2732
2730 DECLARE_INSTRUCTION(ClosureCall) 2733 DECLARE_INSTRUCTION(ClosureCall)
2731 2734
2732 const Array& argument_names() const { return ast_node_.arguments()->names(); } 2735 const Array& argument_names() const { return ast_node_.arguments()->names(); }
2733 virtual intptr_t token_pos() const { return ast_node_.token_pos(); } 2736 virtual TokenDescriptor token_pos() const {
2737 return TokenDescriptor(ast_node_.token_pos());
2738 }
2734 2739
2735 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 2740 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2736 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 2741 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2737 return (*arguments_)[index]; 2742 return (*arguments_)[index];
2738 } 2743 }
2739 2744
2740 // TODO(kmillikin): implement exact call counts for closure calls. 2745 // TODO(kmillikin): implement exact call counts for closure calls.
2741 virtual intptr_t CallCount() const { return 1; } 2746 virtual intptr_t CallCount() const { return 1; }
2742 2747
2743 virtual void PrintOperandsTo(BufferFormatter* f) const; 2748 virtual void PrintOperandsTo(BufferFormatter* f) const;
2744 2749
2745 virtual bool CanDeoptimize() const { return true; } 2750 virtual bool CanDeoptimize() const { return true; }
2746 2751
2747 virtual EffectSet Effects() const { return EffectSet::All(); } 2752 virtual EffectSet Effects() const { return EffectSet::All(); }
2748 2753
2749 private: 2754 private:
2750 const ClosureCallNode& ast_node_; 2755 const ClosureCallNode& ast_node_;
2751 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 2756 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
2752 2757
2753 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); 2758 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr);
2754 }; 2759 };
2755 2760
2756 2761
2757 class InstanceCallInstr : public TemplateDefinition<0, Throws> { 2762 class InstanceCallInstr : public TemplateDefinition<0, Throws> {
2758 public: 2763 public:
2759 InstanceCallInstr(intptr_t token_pos, 2764 InstanceCallInstr(TokenDescriptor token_pos,
2760 const String& function_name, 2765 const String& function_name,
2761 Token::Kind token_kind, 2766 Token::Kind token_kind,
2762 ZoneGrowableArray<PushArgumentInstr*>* arguments, 2767 ZoneGrowableArray<PushArgumentInstr*>* arguments,
2763 const Array& argument_names, 2768 const Array& argument_names,
2764 intptr_t checked_argument_count, 2769 intptr_t checked_argument_count,
2765 const ZoneGrowableArray<const ICData*>& ic_data_array) 2770 const ZoneGrowableArray<const ICData*>& ic_data_array)
2766 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2771 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
2767 ic_data_(NULL), 2772 ic_data_(NULL),
2768 token_pos_(token_pos), 2773 token_pos_(token_pos),
2769 function_name_(function_name), 2774 function_name_(function_name),
(...skipping 20 matching lines...) Expand all
2790 DECLARE_INSTRUCTION(InstanceCall) 2795 DECLARE_INSTRUCTION(InstanceCall)
2791 2796
2792 const ICData* ic_data() const { return ic_data_; } 2797 const ICData* ic_data() const { return ic_data_; }
2793 bool HasICData() const { 2798 bool HasICData() const {
2794 return (ic_data() != NULL) && !ic_data()->IsNull(); 2799 return (ic_data() != NULL) && !ic_data()->IsNull();
2795 } 2800 }
2796 2801
2797 // ICData can be replaced by optimizer. 2802 // ICData can be replaced by optimizer.
2798 void set_ic_data(const ICData* value) { ic_data_ = value; } 2803 void set_ic_data(const ICData* value) { ic_data_ = value; }
2799 2804
2800 virtual intptr_t token_pos() const { return token_pos_; } 2805 virtual TokenDescriptor token_pos() const { return token_pos_; }
2801 const String& function_name() const { return function_name_; } 2806 const String& function_name() const { return function_name_; }
2802 Token::Kind token_kind() const { return token_kind_; } 2807 Token::Kind token_kind() const { return token_kind_; }
2803 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 2808 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2804 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 2809 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2805 return (*arguments_)[index]; 2810 return (*arguments_)[index];
2806 } 2811 }
2807 const Array& argument_names() const { return argument_names_; } 2812 const Array& argument_names() const { return argument_names_; }
2808 intptr_t checked_argument_count() const { return checked_argument_count_; } 2813 intptr_t checked_argument_count() const { return checked_argument_count_; }
2809 2814
2810 virtual void PrintOperandsTo(BufferFormatter* f) const; 2815 virtual void PrintOperandsTo(BufferFormatter* f) const;
2811 2816
2812 virtual bool CanDeoptimize() const { return true; } 2817 virtual bool CanDeoptimize() const { return true; }
2813 2818
2814 virtual bool CanBecomeDeoptimizationTarget() const { 2819 virtual bool CanBecomeDeoptimizationTarget() const {
2815 // Instance calls that are specialized by the optimizer need a 2820 // Instance calls that are specialized by the optimizer need a
2816 // deoptimization descriptor before the call. 2821 // deoptimization descriptor before the call.
2817 return true; 2822 return true;
2818 } 2823 }
2819 2824
2820 virtual EffectSet Effects() const { return EffectSet::All(); } 2825 virtual EffectSet Effects() const { return EffectSet::All(); }
2821 2826
2822 protected: 2827 protected:
2823 friend class FlowGraphOptimizer; 2828 friend class FlowGraphOptimizer;
2824 void set_ic_data(ICData* value) { ic_data_ = value; } 2829 void set_ic_data(ICData* value) { ic_data_ = value; }
2825 2830
2826 private: 2831 private:
2827 const ICData* ic_data_; 2832 const ICData* ic_data_;
2828 const intptr_t token_pos_; 2833 const TokenDescriptor token_pos_;
2829 const String& function_name_; 2834 const String& function_name_;
2830 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. 2835 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL.
2831 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; 2836 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
2832 const Array& argument_names_; 2837 const Array& argument_names_;
2833 const intptr_t checked_argument_count_; 2838 const intptr_t checked_argument_count_;
2834 2839
2835 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr); 2840 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr);
2836 }; 2841 };
2837 2842
2838 2843
2839 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> { 2844 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
2840 public: 2845 public:
2841 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call, 2846 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call,
2842 const ICData& ic_data, 2847 const ICData& ic_data,
2843 bool with_checks) 2848 bool with_checks)
2844 : TemplateDefinition(instance_call->deopt_id()), 2849 : TemplateDefinition(instance_call->deopt_id()),
2845 instance_call_(instance_call), 2850 instance_call_(instance_call),
2846 ic_data_(ic_data), 2851 ic_data_(ic_data),
2847 with_checks_(with_checks) { 2852 with_checks_(with_checks) {
2848 ASSERT(instance_call_ != NULL); 2853 ASSERT(instance_call_ != NULL);
2849 ASSERT(ic_data.NumberOfChecks() > 0); 2854 ASSERT(ic_data.NumberOfChecks() > 0);
2850 } 2855 }
2851 2856
2852 InstanceCallInstr* instance_call() const { return instance_call_; } 2857 InstanceCallInstr* instance_call() const { return instance_call_; }
2853 bool with_checks() const { return with_checks_; } 2858 bool with_checks() const { return with_checks_; }
2854 virtual intptr_t token_pos() const { return instance_call_->token_pos(); } 2859 virtual TokenDescriptor token_pos() const {
2860 return instance_call_->token_pos();
2861 }
2855 2862
2856 virtual intptr_t ArgumentCount() const { 2863 virtual intptr_t ArgumentCount() const {
2857 return instance_call()->ArgumentCount(); 2864 return instance_call()->ArgumentCount();
2858 } 2865 }
2859 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 2866 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2860 return instance_call()->PushArgumentAt(index); 2867 return instance_call()->PushArgumentAt(index);
2861 } 2868 }
2862 2869
2863 bool HasSingleRecognizedTarget() const; 2870 bool HasSingleRecognizedTarget() const;
2864 2871
(...skipping 15 matching lines...) Expand all
2880 InstanceCallInstr* instance_call_; 2887 InstanceCallInstr* instance_call_;
2881 const ICData& ic_data_; 2888 const ICData& ic_data_;
2882 const bool with_checks_; 2889 const bool with_checks_;
2883 2890
2884 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr); 2891 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr);
2885 }; 2892 };
2886 2893
2887 2894
2888 class StrictCompareInstr : public ComparisonInstr { 2895 class StrictCompareInstr : public ComparisonInstr {
2889 public: 2896 public:
2890 StrictCompareInstr(intptr_t token_pos, 2897 StrictCompareInstr(TokenDescriptor token_pos,
2891 Token::Kind kind, 2898 Token::Kind kind,
2892 Value* left, 2899 Value* left,
2893 Value* right, 2900 Value* right,
2894 bool needs_number_check); 2901 bool needs_number_check);
2895 2902
2896 DECLARE_INSTRUCTION(StrictCompare) 2903 DECLARE_INSTRUCTION(StrictCompare)
2897 2904
2898 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 2905 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
2899 2906
2900 virtual CompileType ComputeType() const; 2907 virtual CompileType ComputeType() const;
(...skipping 21 matching lines...) Expand all
2922 bool needs_number_check_; 2929 bool needs_number_check_;
2923 2930
2924 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); 2931 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr);
2925 }; 2932 };
2926 2933
2927 2934
2928 // Comparison instruction that is equivalent to the (left & right) == 0 2935 // Comparison instruction that is equivalent to the (left & right) == 0
2929 // comparison pattern. 2936 // comparison pattern.
2930 class TestSmiInstr : public ComparisonInstr { 2937 class TestSmiInstr : public ComparisonInstr {
2931 public: 2938 public:
2932 TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right) 2939 TestSmiInstr(TokenDescriptor token_pos,
2940 Token::Kind kind,
2941 Value* left,
2942 Value* right)
2933 : ComparisonInstr(token_pos, kind, left, right) { 2943 : ComparisonInstr(token_pos, kind, left, right) {
2934 ASSERT(kind == Token::kEQ || kind == Token::kNE); 2944 ASSERT(kind == Token::kEQ || kind == Token::kNE);
2935 } 2945 }
2936 2946
2937 DECLARE_INSTRUCTION(TestSmi); 2947 DECLARE_INSTRUCTION(TestSmi);
2938 2948
2939 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right); 2949 virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
2940 2950
2941 virtual CompileType ComputeType() const; 2951 virtual CompileType ComputeType() const;
2942 2952
(...skipping 13 matching lines...) Expand all
2956 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); 2966 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr);
2957 }; 2967 };
2958 2968
2959 2969
2960 // Checks the input value cid against cids stored in a table and returns either 2970 // Checks the input value cid against cids stored in a table and returns either
2961 // a result or deoptimizes. 2971 // a result or deoptimizes.
2962 // TODO(srdjan): Modify ComparisonInstr to allow 1 or 2 arguments, since 2972 // TODO(srdjan): Modify ComparisonInstr to allow 1 or 2 arguments, since
2963 // TestCidInstr needs only one argument 2973 // TestCidInstr needs only one argument
2964 class TestCidsInstr : public ComparisonInstr { 2974 class TestCidsInstr : public ComparisonInstr {
2965 public: 2975 public:
2966 TestCidsInstr(intptr_t token_pos, 2976 TestCidsInstr(TokenDescriptor token_pos,
2967 Token::Kind kind, 2977 Token::Kind kind,
2968 Value* value, 2978 Value* value,
2969 const ZoneGrowableArray<intptr_t>& cid_results, 2979 const ZoneGrowableArray<intptr_t>& cid_results,
2970 intptr_t deopt_id) 2980 intptr_t deopt_id)
2971 : ComparisonInstr(token_pos, kind, value, NULL, deopt_id), 2981 : ComparisonInstr(token_pos, kind, value, NULL, deopt_id),
2972 cid_results_(cid_results) { 2982 cid_results_(cid_results) {
2973 ASSERT((kind == Token::kIS) || (kind == Token::kISNOT)); 2983 ASSERT((kind == Token::kIS) || (kind == Token::kISNOT));
2974 set_operation_cid(kObjectCid); 2984 set_operation_cid(kObjectCid);
2975 } 2985 }
2976 2986
(...skipping 28 matching lines...) Expand all
3005 virtual void PrintOperandsTo(BufferFormatter* f) const; 3015 virtual void PrintOperandsTo(BufferFormatter* f) const;
3006 3016
3007 private: 3017 private:
3008 const ZoneGrowableArray<intptr_t>& cid_results_; 3018 const ZoneGrowableArray<intptr_t>& cid_results_;
3009 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr); 3019 DISALLOW_COPY_AND_ASSIGN(TestCidsInstr);
3010 }; 3020 };
3011 3021
3012 3022
3013 class EqualityCompareInstr : public ComparisonInstr { 3023 class EqualityCompareInstr : public ComparisonInstr {
3014 public: 3024 public:
3015 EqualityCompareInstr(intptr_t token_pos, 3025 EqualityCompareInstr(TokenDescriptor token_pos,
3016 Token::Kind kind, 3026 Token::Kind kind,
3017 Value* left, 3027 Value* left,
3018 Value* right, 3028 Value* right,
3019 intptr_t cid, 3029 intptr_t cid,
3020 intptr_t deopt_id) 3030 intptr_t deopt_id)
3021 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { 3031 : ComparisonInstr(token_pos, kind, left, right, deopt_id) {
3022 ASSERT(Token::IsEqualityOperator(kind)); 3032 ASSERT(Token::IsEqualityOperator(kind));
3023 set_operation_cid(cid); 3033 set_operation_cid(cid);
3024 } 3034 }
3025 3035
(...skipping 20 matching lines...) Expand all
3046 return kTagged; 3056 return kTagged;
3047 } 3057 }
3048 3058
3049 private: 3059 private:
3050 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); 3060 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr);
3051 }; 3061 };
3052 3062
3053 3063
3054 class RelationalOpInstr : public ComparisonInstr { 3064 class RelationalOpInstr : public ComparisonInstr {
3055 public: 3065 public:
3056 RelationalOpInstr(intptr_t token_pos, 3066 RelationalOpInstr(TokenDescriptor token_pos,
3057 Token::Kind kind, 3067 Token::Kind kind,
3058 Value* left, 3068 Value* left,
3059 Value* right, 3069 Value* right,
3060 intptr_t cid, 3070 intptr_t cid,
3061 intptr_t deopt_id) 3071 intptr_t deopt_id)
3062 : ComparisonInstr(token_pos, kind, left, right, deopt_id) { 3072 : ComparisonInstr(token_pos, kind, left, right, deopt_id) {
3063 ASSERT(Token::IsRelationalOperator(kind)); 3073 ASSERT(Token::IsRelationalOperator(kind));
3064 set_operation_cid(cid); 3074 set_operation_cid(cid);
3065 } 3075 }
3066 3076
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 ComparisonInstr* comparison_; 3179 ComparisonInstr* comparison_;
3170 const intptr_t if_true_; 3180 const intptr_t if_true_;
3171 const intptr_t if_false_; 3181 const intptr_t if_false_;
3172 3182
3173 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr); 3183 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr);
3174 }; 3184 };
3175 3185
3176 3186
3177 class StaticCallInstr : public TemplateDefinition<0, Throws> { 3187 class StaticCallInstr : public TemplateDefinition<0, Throws> {
3178 public: 3188 public:
3179 StaticCallInstr(intptr_t token_pos, 3189 StaticCallInstr(TokenDescriptor token_pos,
3180 const Function& function, 3190 const Function& function,
3181 const Array& argument_names, 3191 const Array& argument_names,
3182 ZoneGrowableArray<PushArgumentInstr*>* arguments, 3192 ZoneGrowableArray<PushArgumentInstr*>* arguments,
3183 const ZoneGrowableArray<const ICData*>& ic_data_array) 3193 const ZoneGrowableArray<const ICData*>& ic_data_array)
3184 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 3194 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
3185 ic_data_(NULL), 3195 ic_data_(NULL),
3186 token_pos_(token_pos), 3196 token_pos_(token_pos),
3187 function_(function), 3197 function_(function),
3188 argument_names_(argument_names), 3198 argument_names_(argument_names),
3189 arguments_(arguments), 3199 arguments_(arguments),
(...skipping 11 matching lines...) Expand all
3201 bool HasICData() const { 3211 bool HasICData() const {
3202 return (ic_data() != NULL) && !ic_data()->IsNull(); 3212 return (ic_data() != NULL) && !ic_data()->IsNull();
3203 } 3213 }
3204 3214
3205 DECLARE_INSTRUCTION(StaticCall) 3215 DECLARE_INSTRUCTION(StaticCall)
3206 virtual CompileType ComputeType() const; 3216 virtual CompileType ComputeType() const;
3207 3217
3208 // Accessors forwarded to the AST node. 3218 // Accessors forwarded to the AST node.
3209 const Function& function() const { return function_; } 3219 const Function& function() const { return function_; }
3210 const Array& argument_names() const { return argument_names_; } 3220 const Array& argument_names() const { return argument_names_; }
3211 virtual intptr_t token_pos() const { return token_pos_; } 3221 virtual TokenDescriptor token_pos() const { return token_pos_; }
3212 3222
3213 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 3223 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
3214 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 3224 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
3215 return (*arguments_)[index]; 3225 return (*arguments_)[index];
3216 } 3226 }
3217 3227
3218 virtual intptr_t CallCount() const { 3228 virtual intptr_t CallCount() const {
3219 return ic_data() == NULL ? 0 : ic_data()->AggregateCount(); 3229 return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
3220 } 3230 }
3221 3231
(...skipping 23 matching lines...) Expand all
3245 3255
3246 bool IsRecognizedFactory() const { 3256 bool IsRecognizedFactory() const {
3247 return is_known_list_constructor() || is_native_list_factory(); 3257 return is_known_list_constructor() || is_native_list_factory();
3248 } 3258 }
3249 3259
3250 virtual AliasIdentity Identity() const { return identity_; } 3260 virtual AliasIdentity Identity() const { return identity_; }
3251 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 3261 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
3252 3262
3253 private: 3263 private:
3254 const ICData* ic_data_; 3264 const ICData* ic_data_;
3255 const intptr_t token_pos_; 3265 const TokenDescriptor token_pos_;
3256 const Function& function_; 3266 const Function& function_;
3257 const Array& argument_names_; 3267 const Array& argument_names_;
3258 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 3268 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
3259 intptr_t result_cid_; // For some library functions we know the result. 3269 intptr_t result_cid_; // For some library functions we know the result.
3260 3270
3261 // 'True' for recognized list constructors. 3271 // 'True' for recognized list constructors.
3262 bool is_known_list_constructor_; 3272 bool is_known_list_constructor_;
3263 bool is_native_list_factory_; 3273 bool is_native_list_factory_;
3264 3274
3265 AliasIdentity identity_; 3275 AliasIdentity identity_;
3266 3276
3267 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); 3277 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr);
3268 }; 3278 };
3269 3279
3270 3280
3271 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> { 3281 class LoadLocalInstr : public TemplateDefinition<0, NoThrow> {
3272 public: 3282 public:
3273 LoadLocalInstr(const LocalVariable& local, 3283 LoadLocalInstr(const LocalVariable& local,
3274 intptr_t token_pos) 3284 TokenDescriptor token_pos)
3275 : local_(local), is_last_(false), token_pos_(token_pos) { } 3285 : local_(local), is_last_(false), token_pos_(token_pos) { }
3276 3286
3277 DECLARE_INSTRUCTION(LoadLocal) 3287 DECLARE_INSTRUCTION(LoadLocal)
3278 virtual CompileType ComputeType() const; 3288 virtual CompileType ComputeType() const;
3279 3289
3280 const LocalVariable& local() const { return local_; } 3290 const LocalVariable& local() const { return local_; }
3281 3291
3282 virtual void PrintOperandsTo(BufferFormatter* f) const; 3292 virtual void PrintOperandsTo(BufferFormatter* f) const;
3283 3293
3284 virtual bool CanDeoptimize() const { return false; } 3294 virtual bool CanDeoptimize() const { return false; }
3285 3295
3286 virtual EffectSet Effects() const { 3296 virtual EffectSet Effects() const {
3287 UNREACHABLE(); // Eliminated by SSA construction. 3297 UNREACHABLE(); // Eliminated by SSA construction.
3288 return EffectSet::None(); 3298 return EffectSet::None();
3289 } 3299 }
3290 3300
3291 void mark_last() { is_last_ = true; } 3301 void mark_last() { is_last_ = true; }
3292 bool is_last() const { return is_last_; } 3302 bool is_last() const { return is_last_; }
3293 3303
3294 virtual intptr_t token_pos() const { return token_pos_; } 3304 virtual TokenDescriptor token_pos() const { return token_pos_; }
3295 3305
3296 private: 3306 private:
3297 const LocalVariable& local_; 3307 const LocalVariable& local_;
3298 bool is_last_; 3308 bool is_last_;
3299 const intptr_t token_pos_; 3309 const TokenDescriptor token_pos_;
3300 3310
3301 DISALLOW_COPY_AND_ASSIGN(LoadLocalInstr); 3311 DISALLOW_COPY_AND_ASSIGN(LoadLocalInstr);
3302 }; 3312 };
3303 3313
3304 3314
3305 class PushTempInstr : public TemplateDefinition<1, NoThrow> { 3315 class PushTempInstr : public TemplateDefinition<1, NoThrow> {
3306 public: 3316 public:
3307 explicit PushTempInstr(Value* value) { 3317 explicit PushTempInstr(Value* value) {
3308 SetInputAt(0, value); 3318 SetInputAt(0, value);
3309 } 3319 }
3310 3320
3311 DECLARE_INSTRUCTION(PushTemp) 3321 DECLARE_INSTRUCTION(PushTemp)
3312 3322
3313 Value* value() const { return inputs_[0]; } 3323 Value* value() const { return inputs_[0]; }
3314 3324
3315 virtual CompileType ComputeType() const; 3325 virtual CompileType ComputeType() const;
3316 3326
3317 virtual bool CanDeoptimize() const { return false; } 3327 virtual bool CanDeoptimize() const { return false; }
3318 3328
3319 virtual EffectSet Effects() const { 3329 virtual EffectSet Effects() const {
3320 UNREACHABLE(); // Eliminated by SSA construction. 3330 UNREACHABLE(); // Eliminated by SSA construction.
3321 return EffectSet::None(); 3331 return EffectSet::None();
3322 } 3332 }
3323 3333
3324 virtual intptr_t token_pos() const { 3334 virtual TokenDescriptor token_pos() const {
3325 return ClassifyingTokenPositions::kTempMove; 3335 return TokenDescriptor::kTempMove;
3326 } 3336 }
3327 3337
3328 private: 3338 private:
3329 DISALLOW_COPY_AND_ASSIGN(PushTempInstr); 3339 DISALLOW_COPY_AND_ASSIGN(PushTempInstr);
3330 }; 3340 };
3331 3341
3332 3342
3333 class DropTempsInstr : public Definition { 3343 class DropTempsInstr : public Definition {
3334 public: 3344 public:
3335 DropTempsInstr(intptr_t num_temps, Value* value) 3345 DropTempsInstr(intptr_t num_temps, Value* value)
(...skipping 24 matching lines...) Expand all
3360 virtual EffectSet Effects() const { 3370 virtual EffectSet Effects() const {
3361 UNREACHABLE(); // Eliminated by SSA construction. 3371 UNREACHABLE(); // Eliminated by SSA construction.
3362 return EffectSet::None(); 3372 return EffectSet::None();
3363 } 3373 }
3364 3374
3365 virtual bool MayThrow() const { 3375 virtual bool MayThrow() const {
3366 UNREACHABLE(); 3376 UNREACHABLE();
3367 return false; 3377 return false;
3368 } 3378 }
3369 3379
3370 virtual intptr_t token_pos() const { 3380 virtual TokenDescriptor token_pos() const {
3371 return ClassifyingTokenPositions::kTempMove; 3381 return TokenDescriptor::kTempMove;
3372 } 3382 }
3373 3383
3374 private: 3384 private:
3375 virtual void RawSetInputAt(intptr_t i, Value* value) { 3385 virtual void RawSetInputAt(intptr_t i, Value* value) {
3376 value_ = value; 3386 value_ = value;
3377 } 3387 }
3378 3388
3379 const intptr_t num_temps_; 3389 const intptr_t num_temps_;
3380 Value* value_; 3390 Value* value_;
3381 3391
3382 DISALLOW_COPY_AND_ASSIGN(DropTempsInstr); 3392 DISALLOW_COPY_AND_ASSIGN(DropTempsInstr);
3383 }; 3393 };
3384 3394
3385 3395
3386 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> { 3396 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> {
3387 public: 3397 public:
3388 StoreLocalInstr(const LocalVariable& local, 3398 StoreLocalInstr(const LocalVariable& local,
3389 Value* value, 3399 Value* value,
3390 intptr_t token_pos) 3400 TokenDescriptor token_pos)
3391 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) { 3401 : local_(local), is_dead_(false), is_last_(false), token_pos_(token_pos) {
3392 SetInputAt(0, value); 3402 SetInputAt(0, value);
3393 } 3403 }
3394 3404
3395 DECLARE_INSTRUCTION(StoreLocal) 3405 DECLARE_INSTRUCTION(StoreLocal)
3396 virtual CompileType ComputeType() const; 3406 virtual CompileType ComputeType() const;
3397 3407
3398 const LocalVariable& local() const { return local_; } 3408 const LocalVariable& local() const { return local_; }
3399 Value* value() const { return inputs_[0]; } 3409 Value* value() const { return inputs_[0]; }
3400 3410
3401 virtual void PrintOperandsTo(BufferFormatter* f) const; 3411 virtual void PrintOperandsTo(BufferFormatter* f) const;
3402 3412
3403 virtual bool CanDeoptimize() const { return false; } 3413 virtual bool CanDeoptimize() const { return false; }
3404 3414
3405 void mark_dead() { is_dead_ = true; } 3415 void mark_dead() { is_dead_ = true; }
3406 bool is_dead() const { return is_dead_; } 3416 bool is_dead() const { return is_dead_; }
3407 3417
3408 void mark_last() { is_last_ = true; } 3418 void mark_last() { is_last_ = true; }
3409 bool is_last() const { return is_last_; } 3419 bool is_last() const { return is_last_; }
3410 3420
3411 virtual EffectSet Effects() const { 3421 virtual EffectSet Effects() const {
3412 UNREACHABLE(); // Eliminated by SSA construction. 3422 UNREACHABLE(); // Eliminated by SSA construction.
3413 return EffectSet::None(); 3423 return EffectSet::None();
3414 } 3424 }
3415 3425
3416 virtual intptr_t token_pos() const { return token_pos_; } 3426 virtual TokenDescriptor token_pos() const { return token_pos_; }
3417 3427
3418 private: 3428 private:
3419 const LocalVariable& local_; 3429 const LocalVariable& local_;
3420 bool is_dead_; 3430 bool is_dead_;
3421 bool is_last_; 3431 bool is_last_;
3422 const intptr_t token_pos_; 3432 const TokenDescriptor token_pos_;
3423 3433
3424 DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr); 3434 DISALLOW_COPY_AND_ASSIGN(StoreLocalInstr);
3425 }; 3435 };
3426 3436
3427 3437
3428 class NativeCallInstr : public TemplateDefinition<0, Throws> { 3438 class NativeCallInstr : public TemplateDefinition<0, Throws> {
3429 public: 3439 public:
3430 explicit NativeCallInstr(NativeBodyNode* node) 3440 explicit NativeCallInstr(NativeBodyNode* node)
3431 : ast_node_(*node), 3441 : ast_node_(*node),
3432 native_c_function_(NULL), 3442 native_c_function_(NULL),
3433 is_bootstrap_native_(false) { } 3443 is_bootstrap_native_(false) { }
3434 3444
3435 DECLARE_INSTRUCTION(NativeCall) 3445 DECLARE_INSTRUCTION(NativeCall)
3436 3446
3437 virtual intptr_t token_pos() const { return ast_node_.token_pos(); } 3447 virtual TokenDescriptor token_pos() const {
3448 return TokenDescriptor(ast_node_.token_pos());
3449 }
3438 3450
3439 const Function& function() const { return ast_node_.function(); } 3451 const Function& function() const { return ast_node_.function(); }
3440 3452
3441 const String& native_name() const { 3453 const String& native_name() const {
3442 return ast_node_.native_c_function_name(); 3454 return ast_node_.native_c_function_name();
3443 } 3455 }
3444 3456
3445 NativeFunction native_c_function() const { 3457 NativeFunction native_c_function() const {
3446 return native_c_function_; 3458 return native_c_function_;
3447 } 3459 }
(...skipping 24 matching lines...) Expand all
3472 const NativeBodyNode& ast_node_; 3484 const NativeBodyNode& ast_node_;
3473 NativeFunction native_c_function_; 3485 NativeFunction native_c_function_;
3474 bool is_bootstrap_native_; 3486 bool is_bootstrap_native_;
3475 3487
3476 DISALLOW_COPY_AND_ASSIGN(NativeCallInstr); 3488 DISALLOW_COPY_AND_ASSIGN(NativeCallInstr);
3477 }; 3489 };
3478 3490
3479 3491
3480 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> { 3492 class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> {
3481 public: 3493 public:
3482 DebugStepCheckInstr(intptr_t token_pos, 3494 DebugStepCheckInstr(TokenDescriptor token_pos,
3483 RawPcDescriptors::Kind stub_kind) 3495 RawPcDescriptors::Kind stub_kind)
3484 : token_pos_(token_pos), 3496 : token_pos_(token_pos),
3485 stub_kind_(stub_kind) { 3497 stub_kind_(stub_kind) {
3486 } 3498 }
3487 3499
3488 DECLARE_INSTRUCTION(DebugStepCheck) 3500 DECLARE_INSTRUCTION(DebugStepCheck)
3489 3501
3490 virtual intptr_t token_pos() const { return token_pos_; } 3502 virtual TokenDescriptor token_pos() const { return token_pos_; }
3491 virtual bool CanDeoptimize() const { return false; } 3503 virtual bool CanDeoptimize() const { return false; }
3492 virtual EffectSet Effects() const { return EffectSet::All(); } 3504 virtual EffectSet Effects() const { return EffectSet::All(); }
3493 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 3505 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
3494 3506
3495 private: 3507 private:
3496 const intptr_t token_pos_; 3508 const TokenDescriptor token_pos_;
3497 const RawPcDescriptors::Kind stub_kind_; 3509 const RawPcDescriptors::Kind stub_kind_;
3498 3510
3499 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr); 3511 DISALLOW_COPY_AND_ASSIGN(DebugStepCheckInstr);
3500 }; 3512 };
3501 3513
3502 3514
3503 enum StoreBarrierType { 3515 enum StoreBarrierType {
3504 kNoStoreBarrier, 3516 kNoStoreBarrier,
3505 kEmitStoreBarrier 3517 kEmitStoreBarrier
3506 }; 3518 };
3507 3519
3508 3520
3509 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> { 3521 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> {
3510 public: 3522 public:
3511 StoreInstanceFieldInstr(const Field& field, 3523 StoreInstanceFieldInstr(const Field& field,
3512 Value* instance, 3524 Value* instance,
3513 Value* value, 3525 Value* value,
3514 StoreBarrierType emit_store_barrier, 3526 StoreBarrierType emit_store_barrier,
3515 intptr_t token_pos) 3527 TokenDescriptor token_pos)
3516 : field_(field), 3528 : field_(field),
3517 offset_in_bytes_(field.Offset()), 3529 offset_in_bytes_(field.Offset()),
3518 emit_store_barrier_(emit_store_barrier), 3530 emit_store_barrier_(emit_store_barrier),
3519 token_pos_(token_pos), 3531 token_pos_(token_pos),
3520 is_potential_unboxed_initialization_(false), 3532 is_potential_unboxed_initialization_(false),
3521 is_object_reference_initialization_(false) { 3533 is_object_reference_initialization_(false) {
3522 SetInputAt(kInstancePos, instance); 3534 SetInputAt(kInstancePos, instance);
3523 SetInputAt(kValuePos, value); 3535 SetInputAt(kValuePos, value);
3524 } 3536 }
3525 3537
3526 StoreInstanceFieldInstr(intptr_t offset_in_bytes, 3538 StoreInstanceFieldInstr(intptr_t offset_in_bytes,
3527 Value* instance, 3539 Value* instance,
3528 Value* value, 3540 Value* value,
3529 StoreBarrierType emit_store_barrier, 3541 StoreBarrierType emit_store_barrier,
3530 intptr_t token_pos) 3542 TokenDescriptor token_pos)
3531 : field_(Field::ZoneHandle()), 3543 : field_(Field::ZoneHandle()),
3532 offset_in_bytes_(offset_in_bytes), 3544 offset_in_bytes_(offset_in_bytes),
3533 emit_store_barrier_(emit_store_barrier), 3545 emit_store_barrier_(emit_store_barrier),
3534 token_pos_(token_pos), 3546 token_pos_(token_pos),
3535 is_potential_unboxed_initialization_(false), 3547 is_potential_unboxed_initialization_(false),
3536 is_object_reference_initialization_(false) { 3548 is_object_reference_initialization_(false) {
3537 SetInputAt(kInstancePos, instance); 3549 SetInputAt(kInstancePos, instance);
3538 SetInputAt(kValuePos, value); 3550 SetInputAt(kValuePos, value);
3539 } 3551 }
3540 3552
(...skipping 12 matching lines...) Expand all
3553 }; 3565 };
3554 3566
3555 Value* instance() const { return inputs_[kInstancePos]; } 3567 Value* instance() const { return inputs_[kInstancePos]; }
3556 Value* value() const { return inputs_[kValuePos]; } 3568 Value* value() const { return inputs_[kValuePos]; }
3557 bool is_potential_unboxed_initialization() const { 3569 bool is_potential_unboxed_initialization() const {
3558 return is_potential_unboxed_initialization_; 3570 return is_potential_unboxed_initialization_;
3559 } 3571 }
3560 bool is_object_reference_initialization() const { 3572 bool is_object_reference_initialization() const {
3561 return is_object_reference_initialization_; 3573 return is_object_reference_initialization_;
3562 } 3574 }
3563 virtual intptr_t token_pos() const { return token_pos_; } 3575 virtual TokenDescriptor token_pos() const { return token_pos_; }
3564 3576
3565 const Field& field() const { return field_; } 3577 const Field& field() const { return field_; }
3566 intptr_t offset_in_bytes() const { return offset_in_bytes_; } 3578 intptr_t offset_in_bytes() const { return offset_in_bytes_; }
3567 3579
3568 bool ShouldEmitStoreBarrier() const { 3580 bool ShouldEmitStoreBarrier() const {
3569 return value()->NeedsStoreBuffer() 3581 return value()->NeedsStoreBuffer()
3570 && (emit_store_barrier_ == kEmitStoreBarrier); 3582 && (emit_store_barrier_ == kEmitStoreBarrier);
3571 } 3583 }
3572 3584
3573 virtual void PrintOperandsTo(BufferFormatter* f) const; 3585 virtual void PrintOperandsTo(BufferFormatter* f) const;
(...skipping 22 matching lines...) Expand all
3596 bool CanValueBeSmi() const { 3608 bool CanValueBeSmi() const {
3597 const intptr_t cid = value()->Type()->ToNullableCid(); 3609 const intptr_t cid = value()->Type()->ToNullableCid();
3598 // Write barrier is skipped for nullable and non-nullable smis. 3610 // Write barrier is skipped for nullable and non-nullable smis.
3599 ASSERT(cid != kSmiCid); 3611 ASSERT(cid != kSmiCid);
3600 return (cid == kDynamicCid); 3612 return (cid == kDynamicCid);
3601 } 3613 }
3602 3614
3603 const Field& field_; 3615 const Field& field_;
3604 intptr_t offset_in_bytes_; 3616 intptr_t offset_in_bytes_;
3605 const StoreBarrierType emit_store_barrier_; 3617 const StoreBarrierType emit_store_barrier_;
3606 const intptr_t token_pos_; 3618 const TokenDescriptor token_pos_;
3607 // This may be the first store to an unboxed field. 3619 // This may be the first store to an unboxed field.
3608 bool is_potential_unboxed_initialization_; 3620 bool is_potential_unboxed_initialization_;
3609 // True if this store initializes an object reference field of an object that 3621 // True if this store initializes an object reference field of an object that
3610 // was allocated uninitialized; see AllocateUninitializedContext. 3622 // was allocated uninitialized; see AllocateUninitializedContext.
3611 bool is_object_reference_initialization_; 3623 bool is_object_reference_initialization_;
3612 3624
3613 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr); 3625 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr);
3614 }; 3626 };
3615 3627
3616 3628
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3674 3686
3675 virtual bool AttributesEqual(Instruction* other) const; 3687 virtual bool AttributesEqual(Instruction* other) const;
3676 3688
3677 private: 3689 private:
3678 DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr); 3690 DISALLOW_COPY_AND_ASSIGN(GuardFieldLengthInstr);
3679 }; 3691 };
3680 3692
3681 3693
3682 class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> { 3694 class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> {
3683 public: 3695 public:
3684 LoadStaticFieldInstr(Value* field_value, intptr_t token_pos) 3696 LoadStaticFieldInstr(Value* field_value, TokenDescriptor token_pos)
3685 : token_pos_(token_pos) { 3697 : token_pos_(token_pos) {
3686 ASSERT(field_value->BindsToConstant()); 3698 ASSERT(field_value->BindsToConstant());
3687 SetInputAt(0, field_value); 3699 SetInputAt(0, field_value);
3688 } 3700 }
3689 3701
3690 DECLARE_INSTRUCTION(LoadStaticField) 3702 DECLARE_INSTRUCTION(LoadStaticField)
3691 virtual CompileType ComputeType() const; 3703 virtual CompileType ComputeType() const;
3692 3704
3693 const Field& StaticField() const; 3705 const Field& StaticField() const;
3694 3706
3695 Value* field_value() const { return inputs_[0]; } 3707 Value* field_value() const { return inputs_[0]; }
3696 3708
3697 virtual void PrintOperandsTo(BufferFormatter* f) const; 3709 virtual void PrintOperandsTo(BufferFormatter* f) const;
3698 3710
3699 virtual bool CanDeoptimize() const { return false; } 3711 virtual bool CanDeoptimize() const { return false; }
3700 3712
3701 virtual bool AllowsCSE() const { return StaticField().is_final(); } 3713 virtual bool AllowsCSE() const { return StaticField().is_final(); }
3702 virtual EffectSet Effects() const { return EffectSet::None(); } 3714 virtual EffectSet Effects() const { return EffectSet::None(); }
3703 virtual EffectSet Dependencies() const; 3715 virtual EffectSet Dependencies() const;
3704 virtual bool AttributesEqual(Instruction* other) const; 3716 virtual bool AttributesEqual(Instruction* other) const;
3705 3717
3706 virtual intptr_t token_pos() const { return token_pos_; } 3718 virtual TokenDescriptor token_pos() const { return token_pos_; }
3707 3719
3708 private: 3720 private:
3709 const intptr_t token_pos_; 3721 const TokenDescriptor token_pos_;
3710 3722
3711 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr); 3723 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr);
3712 }; 3724 };
3713 3725
3714 3726
3715 class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> { 3727 class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> {
3716 public: 3728 public:
3717 StoreStaticFieldInstr(const Field& field, 3729 StoreStaticFieldInstr(const Field& field,
3718 Value* value, 3730 Value* value,
3719 intptr_t token_pos) 3731 TokenDescriptor token_pos)
3720 : field_(field), 3732 : field_(field),
3721 token_pos_(token_pos) { 3733 token_pos_(token_pos) {
3722 ASSERT(field.IsZoneHandle()); 3734 ASSERT(field.IsZoneHandle());
3723 SetInputAt(kValuePos, value); 3735 SetInputAt(kValuePos, value);
3724 } 3736 }
3725 3737
3726 enum { 3738 enum {
3727 kValuePos = 0 3739 kValuePos = 0
3728 }; 3740 };
3729 3741
3730 DECLARE_INSTRUCTION(StoreStaticField) 3742 DECLARE_INSTRUCTION(StoreStaticField)
3731 3743
3732 const Field& field() const { return field_; } 3744 const Field& field() const { return field_; }
3733 Value* value() const { return inputs_[kValuePos]; } 3745 Value* value() const { return inputs_[kValuePos]; }
3734 3746
3735 virtual void PrintOperandsTo(BufferFormatter* f) const; 3747 virtual void PrintOperandsTo(BufferFormatter* f) const;
3736 3748
3737 virtual bool CanDeoptimize() const { return false; } 3749 virtual bool CanDeoptimize() const { return false; }
3738 3750
3739 // Currently CSE/LICM don't operate on any instructions that can be affected 3751 // Currently CSE/LICM don't operate on any instructions that can be affected
3740 // by stores/loads. LoadOptimizer handles loads separately. Hence stores 3752 // by stores/loads. LoadOptimizer handles loads separately. Hence stores
3741 // are marked as having no side-effects. 3753 // are marked as having no side-effects.
3742 virtual EffectSet Effects() const { return EffectSet::None(); } 3754 virtual EffectSet Effects() const { return EffectSet::None(); }
3743 3755
3744 virtual intptr_t token_pos() const { return token_pos_; } 3756 virtual TokenDescriptor token_pos() const { return token_pos_; }
3745 3757
3746 private: 3758 private:
3747 bool CanValueBeSmi() const { 3759 bool CanValueBeSmi() const {
3748 const intptr_t cid = value()->Type()->ToNullableCid(); 3760 const intptr_t cid = value()->Type()->ToNullableCid();
3749 // Write barrier is skipped for nullable and non-nullable smis. 3761 // Write barrier is skipped for nullable and non-nullable smis.
3750 ASSERT(cid != kSmiCid); 3762 ASSERT(cid != kSmiCid);
3751 return (cid == kDynamicCid); 3763 return (cid == kDynamicCid);
3752 } 3764 }
3753 3765
3754 const Field& field_; 3766 const Field& field_;
3755 const intptr_t token_pos_; 3767 const TokenDescriptor token_pos_;
3756 3768
3757 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldInstr); 3769 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldInstr);
3758 }; 3770 };
3759 3771
3760 3772
3761 class LoadIndexedInstr : public TemplateDefinition<2, NoThrow> { 3773 class LoadIndexedInstr : public TemplateDefinition<2, NoThrow> {
3762 public: 3774 public:
3763 LoadIndexedInstr(Value* array, 3775 LoadIndexedInstr(Value* array,
3764 Value* index, 3776 Value* index,
3765 intptr_t index_scale, 3777 intptr_t index_scale,
3766 intptr_t class_id, 3778 intptr_t class_id,
3767 intptr_t deopt_id, 3779 intptr_t deopt_id,
3768 intptr_t token_pos) 3780 TokenDescriptor token_pos)
3769 : TemplateDefinition(deopt_id), 3781 : TemplateDefinition(deopt_id),
3770 index_scale_(index_scale), 3782 index_scale_(index_scale),
3771 class_id_(class_id), 3783 class_id_(class_id),
3772 token_pos_(token_pos) { 3784 token_pos_(token_pos) {
3773 SetInputAt(0, array); 3785 SetInputAt(0, array);
3774 SetInputAt(1, index); 3786 SetInputAt(1, index);
3775 } 3787 }
3776 3788
3777 intptr_t token_pos() const { return token_pos_; } 3789 TokenDescriptor token_pos() const { return token_pos_; }
3778 3790
3779 DECLARE_INSTRUCTION(LoadIndexed) 3791 DECLARE_INSTRUCTION(LoadIndexed)
3780 virtual CompileType ComputeType() const; 3792 virtual CompileType ComputeType() const;
3781 3793
3782 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3794 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3783 ASSERT(idx == 0 || idx == 1); 3795 ASSERT(idx == 0 || idx == 1);
3784 // The array may be tagged or untagged (for external arrays). 3796 // The array may be tagged or untagged (for external arrays).
3785 if (idx == 0) return kNoRepresentation; 3797 if (idx == 0) return kNoRepresentation;
3786 return kTagged; 3798 return kTagged;
3787 } 3799 }
(...skipping 12 matching lines...) Expand all
3800 } 3812 }
3801 3813
3802 virtual Representation representation() const; 3814 virtual Representation representation() const;
3803 virtual void InferRange(RangeAnalysis* analysis, Range* range); 3815 virtual void InferRange(RangeAnalysis* analysis, Range* range);
3804 3816
3805 virtual EffectSet Effects() const { return EffectSet::None(); } 3817 virtual EffectSet Effects() const { return EffectSet::None(); }
3806 3818
3807 private: 3819 private:
3808 const intptr_t index_scale_; 3820 const intptr_t index_scale_;
3809 const intptr_t class_id_; 3821 const intptr_t class_id_;
3810 const intptr_t token_pos_; 3822 const TokenDescriptor token_pos_;
3811 3823
3812 DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr); 3824 DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr);
3813 }; 3825 };
3814 3826
3815 3827
3816 // Loads the specified number of code units from the given string, packing 3828 // Loads the specified number of code units from the given string, packing
3817 // multiple code units into a single datatype. In essence, this is a specialized 3829 // multiple code units into a single datatype. In essence, this is a specialized
3818 // version of LoadIndexedInstr which accepts only string targets and can load 3830 // version of LoadIndexedInstr which accepts only string targets and can load
3819 // multiple elements at once. The result datatype differs depending on the 3831 // multiple elements at once. The result datatype differs depending on the
3820 // string type, element count, and architecture; if possible, the result is 3832 // string type, element count, and architecture; if possible, the result is
3821 // packed into a Smi, falling back to a Mint otherwise. 3833 // packed into a Smi, falling back to a Mint otherwise.
3822 // TODO(zerny): Add support for loading into UnboxedInt32x4. 3834 // TODO(zerny): Add support for loading into UnboxedInt32x4.
3823 class LoadCodeUnitsInstr : public TemplateDefinition<2, NoThrow> { 3835 class LoadCodeUnitsInstr : public TemplateDefinition<2, NoThrow> {
3824 public: 3836 public:
3825 LoadCodeUnitsInstr(Value* str, 3837 LoadCodeUnitsInstr(Value* str,
3826 Value* index, 3838 Value* index,
3827 intptr_t element_count, 3839 intptr_t element_count,
3828 intptr_t class_id, 3840 intptr_t class_id,
3829 intptr_t token_pos) 3841 TokenDescriptor token_pos)
3830 : class_id_(class_id), 3842 : class_id_(class_id),
3831 token_pos_(token_pos), 3843 token_pos_(token_pos),
3832 element_count_(element_count), 3844 element_count_(element_count),
3833 representation_(kTagged) { 3845 representation_(kTagged) {
3834 ASSERT(element_count == 1 || element_count == 2 || element_count == 4); 3846 ASSERT(element_count == 1 || element_count == 2 || element_count == 4);
3835 ASSERT(RawObject::IsStringClassId(class_id)); 3847 ASSERT(RawObject::IsStringClassId(class_id));
3836 SetInputAt(0, str); 3848 SetInputAt(0, str);
3837 SetInputAt(1, index); 3849 SetInputAt(1, index);
3838 } 3850 }
3839 3851
3840 intptr_t token_pos() const { return token_pos_; } 3852 TokenDescriptor token_pos() const { return token_pos_; }
3841 3853
3842 DECLARE_INSTRUCTION(LoadCodeUnits) 3854 DECLARE_INSTRUCTION(LoadCodeUnits)
3843 virtual CompileType ComputeType() const; 3855 virtual CompileType ComputeType() const;
3844 3856
3845 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 3857 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
3846 if (idx == 0) { 3858 if (idx == 0) {
3847 // The string may be tagged or untagged (for external strings). 3859 // The string may be tagged or untagged (for external strings).
3848 return kNoRepresentation; 3860 return kNoRepresentation;
3849 } 3861 }
3850 ASSERT(idx == 1); 3862 ASSERT(idx == 1);
(...skipping 17 matching lines...) Expand all
3868 virtual bool CanDeoptimize() const { return false; } 3880 virtual bool CanDeoptimize() const { return false; }
3869 3881
3870 virtual Representation representation() const { return representation_; } 3882 virtual Representation representation() const { return representation_; }
3871 void set_representation(Representation repr) { representation_ = repr; } 3883 void set_representation(Representation repr) { representation_ = repr; }
3872 virtual void InferRange(RangeAnalysis* analysis, Range* range); 3884 virtual void InferRange(RangeAnalysis* analysis, Range* range);
3873 3885
3874 virtual EffectSet Effects() const { return EffectSet::None(); } 3886 virtual EffectSet Effects() const { return EffectSet::None(); }
3875 3887
3876 private: 3888 private:
3877 const intptr_t class_id_; 3889 const intptr_t class_id_;
3878 const intptr_t token_pos_; 3890 const TokenDescriptor token_pos_;
3879 const intptr_t element_count_; 3891 const intptr_t element_count_;
3880 Representation representation_; 3892 Representation representation_;
3881 3893
3882 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr); 3894 DISALLOW_COPY_AND_ASSIGN(LoadCodeUnitsInstr);
3883 }; 3895 };
3884 3896
3885 3897
3886 class StringFromCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> { 3898 class StringFromCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> {
3887 public: 3899 public:
3888 StringFromCharCodeInstr(Value* char_code, intptr_t cid) : cid_(cid) { 3900 StringFromCharCodeInstr(Value* char_code, intptr_t cid) : cid_(cid) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3931 3943
3932 private: 3944 private:
3933 const intptr_t cid_; 3945 const intptr_t cid_;
3934 3946
3935 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr); 3947 DISALLOW_COPY_AND_ASSIGN(StringToCharCodeInstr);
3936 }; 3948 };
3937 3949
3938 3950
3939 class StringInterpolateInstr : public TemplateDefinition<1, Throws> { 3951 class StringInterpolateInstr : public TemplateDefinition<1, Throws> {
3940 public: 3952 public:
3941 StringInterpolateInstr(Value* value, intptr_t token_pos) 3953 StringInterpolateInstr(Value* value, TokenDescriptor token_pos)
3942 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 3954 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
3943 token_pos_(token_pos), 3955 token_pos_(token_pos),
3944 function_(Function::ZoneHandle()) { 3956 function_(Function::ZoneHandle()) {
3945 SetInputAt(0, value); 3957 SetInputAt(0, value);
3946 } 3958 }
3947 3959
3948 Value* value() const { return inputs_[0]; } 3960 Value* value() const { return inputs_[0]; }
3949 virtual intptr_t token_pos() const { return token_pos_; } 3961 virtual TokenDescriptor token_pos() const { return token_pos_; }
3950 3962
3951 virtual CompileType ComputeType() const; 3963 virtual CompileType ComputeType() const;
3952 // Issues a static call to Dart code which calls toString on objects. 3964 // Issues a static call to Dart code which calls toString on objects.
3953 virtual EffectSet Effects() const { return EffectSet::All(); } 3965 virtual EffectSet Effects() const { return EffectSet::All(); }
3954 virtual bool CanDeoptimize() const { return true; } 3966 virtual bool CanDeoptimize() const { return true; }
3955 3967
3956 const Function& CallFunction() const; 3968 const Function& CallFunction() const;
3957 3969
3958 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3970 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3959 3971
3960 DECLARE_INSTRUCTION(StringInterpolate) 3972 DECLARE_INSTRUCTION(StringInterpolate)
3961 3973
3962 private: 3974 private:
3963 const intptr_t token_pos_; 3975 const TokenDescriptor token_pos_;
3964 Function& function_; 3976 Function& function_;
3965 3977
3966 DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr); 3978 DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr);
3967 }; 3979 };
3968 3980
3969 3981
3970 class StoreIndexedInstr : public TemplateDefinition<3, NoThrow> { 3982 class StoreIndexedInstr : public TemplateDefinition<3, NoThrow> {
3971 public: 3983 public:
3972 StoreIndexedInstr(Value* array, 3984 StoreIndexedInstr(Value* array,
3973 Value* index, 3985 Value* index,
3974 Value* value, 3986 Value* value,
3975 StoreBarrierType emit_store_barrier, 3987 StoreBarrierType emit_store_barrier,
3976 intptr_t index_scale, 3988 intptr_t index_scale,
3977 intptr_t class_id, 3989 intptr_t class_id,
3978 intptr_t deopt_id, 3990 intptr_t deopt_id,
3979 intptr_t token_pos) 3991 TokenDescriptor token_pos)
3980 : TemplateDefinition(deopt_id), 3992 : TemplateDefinition(deopt_id),
3981 emit_store_barrier_(emit_store_barrier), 3993 emit_store_barrier_(emit_store_barrier),
3982 index_scale_(index_scale), 3994 index_scale_(index_scale),
3983 class_id_(class_id), 3995 class_id_(class_id),
3984 token_pos_(token_pos) { 3996 token_pos_(token_pos) {
3985 SetInputAt(kArrayPos, array); 3997 SetInputAt(kArrayPos, array);
3986 SetInputAt(kIndexPos, index); 3998 SetInputAt(kIndexPos, index);
3987 SetInputAt(kValuePos, value); 3999 SetInputAt(kValuePos, value);
3988 } 4000 }
3989 4001
(...skipping 30 matching lines...) Expand all
4020 // was inherited from another instruction that could deoptimize. 4032 // was inherited from another instruction that could deoptimize.
4021 return GetDeoptId(); 4033 return GetDeoptId();
4022 } 4034 }
4023 4035
4024 virtual EffectSet Effects() const { return EffectSet::None(); } 4036 virtual EffectSet Effects() const { return EffectSet::None(); }
4025 4037
4026 private: 4038 private:
4027 const StoreBarrierType emit_store_barrier_; 4039 const StoreBarrierType emit_store_barrier_;
4028 const intptr_t index_scale_; 4040 const intptr_t index_scale_;
4029 const intptr_t class_id_; 4041 const intptr_t class_id_;
4030 const intptr_t token_pos_; 4042 const TokenDescriptor token_pos_;
4031 4043
4032 DISALLOW_COPY_AND_ASSIGN(StoreIndexedInstr); 4044 DISALLOW_COPY_AND_ASSIGN(StoreIndexedInstr);
4033 }; 4045 };
4034 4046
4035 4047
4036 // Note overrideable, built-in: value ? false : true. 4048 // Note overrideable, built-in: value ? false : true.
4037 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> { 4049 class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> {
4038 public: 4050 public:
4039 explicit BooleanNegateInstr(Value* value) { 4051 explicit BooleanNegateInstr(Value* value) {
4040 SetInputAt(0, value); 4052 SetInputAt(0, value);
(...skipping 10 matching lines...) Expand all
4051 4063
4052 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4064 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4053 4065
4054 private: 4066 private:
4055 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr); 4067 DISALLOW_COPY_AND_ASSIGN(BooleanNegateInstr);
4056 }; 4068 };
4057 4069
4058 4070
4059 class InstanceOfInstr : public TemplateDefinition<2, Throws> { 4071 class InstanceOfInstr : public TemplateDefinition<2, Throws> {
4060 public: 4072 public:
4061 InstanceOfInstr(intptr_t token_pos, 4073 InstanceOfInstr(TokenDescriptor token_pos,
4062 Value* value, 4074 Value* value,
4063 Value* instantiator_type_arguments, 4075 Value* instantiator_type_arguments,
4064 const AbstractType& type, 4076 const AbstractType& type,
4065 bool negate_result, 4077 bool negate_result,
4066 intptr_t deopt_id) 4078 intptr_t deopt_id)
4067 : TemplateDefinition(deopt_id), 4079 : TemplateDefinition(deopt_id),
4068 token_pos_(token_pos), 4080 token_pos_(token_pos),
4069 type_(type), 4081 type_(type),
4070 negate_result_(negate_result) { 4082 negate_result_(negate_result) {
4071 ASSERT(!type.IsNull()); 4083 ASSERT(!type.IsNull());
4072 SetInputAt(0, value); 4084 SetInputAt(0, value);
4073 SetInputAt(1, instantiator_type_arguments); 4085 SetInputAt(1, instantiator_type_arguments);
4074 } 4086 }
4075 4087
4076 DECLARE_INSTRUCTION(InstanceOf) 4088 DECLARE_INSTRUCTION(InstanceOf)
4077 virtual CompileType ComputeType() const; 4089 virtual CompileType ComputeType() const;
4078 4090
4079 Value* value() const { return inputs_[0]; } 4091 Value* value() const { return inputs_[0]; }
4080 Value* instantiator_type_arguments() const { return inputs_[1]; } 4092 Value* instantiator_type_arguments() const { return inputs_[1]; }
4081 4093
4082 bool negate_result() const { return negate_result_; } 4094 bool negate_result() const { return negate_result_; }
4083 const AbstractType& type() const { return type_; } 4095 const AbstractType& type() const { return type_; }
4084 virtual intptr_t token_pos() const { return token_pos_; } 4096 virtual TokenDescriptor token_pos() const { return token_pos_; }
4085 4097
4086 virtual void PrintOperandsTo(BufferFormatter* f) const; 4098 virtual void PrintOperandsTo(BufferFormatter* f) const;
4087 4099
4088 virtual bool CanDeoptimize() const { return true; } 4100 virtual bool CanDeoptimize() const { return true; }
4089 4101
4090 virtual EffectSet Effects() const { return EffectSet::None(); } 4102 virtual EffectSet Effects() const { return EffectSet::None(); }
4091 4103
4092 private: 4104 private:
4093 const intptr_t token_pos_; 4105 const TokenDescriptor token_pos_;
4094 Value* value_; 4106 Value* value_;
4095 Value* type_arguments_; 4107 Value* type_arguments_;
4096 const AbstractType& type_; 4108 const AbstractType& type_;
4097 const bool negate_result_; 4109 const bool negate_result_;
4098 4110
4099 DISALLOW_COPY_AND_ASSIGN(InstanceOfInstr); 4111 DISALLOW_COPY_AND_ASSIGN(InstanceOfInstr);
4100 }; 4112 };
4101 4113
4102 4114
4103 class AllocateObjectInstr : public TemplateDefinition<0, NoThrow> { 4115 class AllocateObjectInstr : public TemplateDefinition<0, NoThrow> {
4104 public: 4116 public:
4105 AllocateObjectInstr(intptr_t token_pos, 4117 AllocateObjectInstr(TokenDescriptor token_pos,
4106 const Class& cls, 4118 const Class& cls,
4107 ZoneGrowableArray<PushArgumentInstr*>* arguments) 4119 ZoneGrowableArray<PushArgumentInstr*>* arguments)
4108 : token_pos_(token_pos), 4120 : token_pos_(token_pos),
4109 cls_(cls), 4121 cls_(cls),
4110 arguments_(arguments), 4122 arguments_(arguments),
4111 identity_(AliasIdentity::Unknown()), 4123 identity_(AliasIdentity::Unknown()),
4112 closure_function_(Function::ZoneHandle()) { 4124 closure_function_(Function::ZoneHandle()) {
4113 // Either no arguments or one type-argument and one instantiator. 4125 // Either no arguments or one type-argument and one instantiator.
4114 ASSERT(arguments->is_empty() || (arguments->length() == 1)); 4126 ASSERT(arguments->is_empty() || (arguments->length() == 1));
4115 } 4127 }
4116 4128
4117 DECLARE_INSTRUCTION(AllocateObject) 4129 DECLARE_INSTRUCTION(AllocateObject)
4118 virtual CompileType ComputeType() const; 4130 virtual CompileType ComputeType() const;
4119 4131
4120 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 4132 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
4121 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const { 4133 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
4122 return (*arguments_)[index]; 4134 return (*arguments_)[index];
4123 } 4135 }
4124 4136
4125 const Class& cls() const { return cls_; } 4137 const Class& cls() const { return cls_; }
4126 virtual intptr_t token_pos() const { return token_pos_; } 4138 virtual TokenDescriptor token_pos() const { return token_pos_; }
4127 4139
4128 const Function& closure_function() const { return closure_function_; } 4140 const Function& closure_function() const { return closure_function_; }
4129 void set_closure_function(const Function& function) { 4141 void set_closure_function(const Function& function) {
4130 closure_function_ ^= function.raw(); 4142 closure_function_ ^= function.raw();
4131 } 4143 }
4132 4144
4133 virtual void PrintOperandsTo(BufferFormatter* f) const; 4145 virtual void PrintOperandsTo(BufferFormatter* f) const;
4134 4146
4135 virtual bool CanDeoptimize() const { return false; } 4147 virtual bool CanDeoptimize() const { return false; }
4136 4148
4137 virtual EffectSet Effects() const { return EffectSet::None(); } 4149 virtual EffectSet Effects() const { return EffectSet::None(); }
4138 4150
4139 virtual AliasIdentity Identity() const { return identity_; } 4151 virtual AliasIdentity Identity() const { return identity_; }
4140 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4152 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4141 4153
4142 private: 4154 private:
4143 const intptr_t token_pos_; 4155 const TokenDescriptor token_pos_;
4144 const Class& cls_; 4156 const Class& cls_;
4145 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; 4157 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
4146 AliasIdentity identity_; 4158 AliasIdentity identity_;
4147 Function& closure_function_; 4159 Function& closure_function_;
4148 4160
4149 DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr); 4161 DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr);
4150 }; 4162 };
4151 4163
4152 4164
4153 class AllocateUninitializedContextInstr 4165 class AllocateUninitializedContextInstr
4154 : public TemplateDefinition<0, NoThrow> { 4166 : public TemplateDefinition<0, NoThrow> {
4155 public: 4167 public:
4156 AllocateUninitializedContextInstr(intptr_t token_pos, 4168 AllocateUninitializedContextInstr(TokenDescriptor token_pos,
4157 intptr_t num_context_variables) 4169 intptr_t num_context_variables)
4158 : token_pos_(token_pos), 4170 : token_pos_(token_pos),
4159 num_context_variables_(num_context_variables), 4171 num_context_variables_(num_context_variables),
4160 identity_(AliasIdentity::Unknown()) {} 4172 identity_(AliasIdentity::Unknown()) {}
4161 4173
4162 DECLARE_INSTRUCTION(AllocateUninitializedContext) 4174 DECLARE_INSTRUCTION(AllocateUninitializedContext)
4163 virtual CompileType ComputeType() const; 4175 virtual CompileType ComputeType() const;
4164 4176
4165 virtual intptr_t token_pos() const { return token_pos_; } 4177 virtual TokenDescriptor token_pos() const { return token_pos_; }
4166 intptr_t num_context_variables() const { return num_context_variables_; } 4178 intptr_t num_context_variables() const { return num_context_variables_; }
4167 4179
4168 virtual void PrintOperandsTo(BufferFormatter* f) const; 4180 virtual void PrintOperandsTo(BufferFormatter* f) const;
4169 4181
4170 virtual bool CanDeoptimize() const { return false; } 4182 virtual bool CanDeoptimize() const { return false; }
4171 4183
4172 virtual EffectSet Effects() const { return EffectSet::None(); } 4184 virtual EffectSet Effects() const { return EffectSet::None(); }
4173 4185
4174 virtual AliasIdentity Identity() const { return identity_; } 4186 virtual AliasIdentity Identity() const { return identity_; }
4175 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4187 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4176 4188
4177 private: 4189 private:
4178 const intptr_t token_pos_; 4190 const TokenDescriptor token_pos_;
4179 const intptr_t num_context_variables_; 4191 const intptr_t num_context_variables_;
4180 AliasIdentity identity_; 4192 AliasIdentity identity_;
4181 4193
4182 DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr); 4194 DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr);
4183 }; 4195 };
4184 4196
4185 4197
4186 // This instruction captures the state of the object which had its allocation 4198 // This instruction captures the state of the object which had its allocation
4187 // removed during the AllocationSinking pass. 4199 // removed during the AllocationSinking pass.
4188 // It does not produce any real code only deoptimization information. 4200 // It does not produce any real code only deoptimization information.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4292 4304
4293 bool visited_for_liveness_; 4305 bool visited_for_liveness_;
4294 bool registers_remapped_; 4306 bool registers_remapped_;
4295 4307
4296 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr); 4308 DISALLOW_COPY_AND_ASSIGN(MaterializeObjectInstr);
4297 }; 4309 };
4298 4310
4299 4311
4300 class CreateArrayInstr : public TemplateDefinition<2, Throws> { 4312 class CreateArrayInstr : public TemplateDefinition<2, Throws> {
4301 public: 4313 public:
4302 CreateArrayInstr(intptr_t token_pos, 4314 CreateArrayInstr(TokenDescriptor token_pos,
4303 Value* element_type, 4315 Value* element_type,
4304 Value* num_elements) 4316 Value* num_elements)
4305 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 4317 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
4306 token_pos_(token_pos), 4318 token_pos_(token_pos),
4307 identity_(AliasIdentity::Unknown()) { 4319 identity_(AliasIdentity::Unknown()) {
4308 SetInputAt(kElementTypePos, element_type); 4320 SetInputAt(kElementTypePos, element_type);
4309 SetInputAt(kLengthPos, num_elements); 4321 SetInputAt(kLengthPos, num_elements);
4310 } 4322 }
4311 4323
4312 enum { 4324 enum {
4313 kElementTypePos = 0, 4325 kElementTypePos = 0,
4314 kLengthPos = 1 4326 kLengthPos = 1
4315 }; 4327 };
4316 4328
4317 DECLARE_INSTRUCTION(CreateArray) 4329 DECLARE_INSTRUCTION(CreateArray)
4318 virtual CompileType ComputeType() const; 4330 virtual CompileType ComputeType() const;
4319 4331
4320 virtual intptr_t token_pos() const { return token_pos_; } 4332 virtual TokenDescriptor token_pos() const { return token_pos_; }
4321 Value* element_type() const { return inputs_[kElementTypePos]; } 4333 Value* element_type() const { return inputs_[kElementTypePos]; }
4322 Value* num_elements() const { return inputs_[kLengthPos]; } 4334 Value* num_elements() const { return inputs_[kLengthPos]; }
4323 4335
4324 // Throw needs environment, which is created only if instruction can 4336 // Throw needs environment, which is created only if instruction can
4325 // deoptimize. 4337 // deoptimize.
4326 virtual bool CanDeoptimize() const { return MayThrow(); } 4338 virtual bool CanDeoptimize() const { return MayThrow(); }
4327 4339
4328 virtual EffectSet Effects() const { return EffectSet::None(); } 4340 virtual EffectSet Effects() const { return EffectSet::None(); }
4329 4341
4330 virtual AliasIdentity Identity() const { return identity_; } 4342 virtual AliasIdentity Identity() const { return identity_; }
4331 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 4343 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
4332 4344
4333 private: 4345 private:
4334 const intptr_t token_pos_; 4346 const TokenDescriptor token_pos_;
4335 AliasIdentity identity_; 4347 AliasIdentity identity_;
4336 4348
4337 DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr); 4349 DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr);
4338 }; 4350 };
4339 4351
4340 4352
4341 // Note: this instruction must not be moved without the indexed access that 4353 // Note: this instruction must not be moved without the indexed access that
4342 // depends on it (e.g. out of loops). GC may cause collect 4354 // depends on it (e.g. out of loops). GC may cause collect
4343 // the array while the external data-array is still accessed. 4355 // the array while the external data-array is still accessed.
4344 // TODO(vegorov) enable LICMing this instruction by ensuring that array itself 4356 // TODO(vegorov) enable LICMing this instruction by ensuring that array itself
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
4402 private: 4414 private:
4403 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); 4415 DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr);
4404 }; 4416 };
4405 4417
4406 4418
4407 class LoadFieldInstr : public TemplateDefinition<1, NoThrow> { 4419 class LoadFieldInstr : public TemplateDefinition<1, NoThrow> {
4408 public: 4420 public:
4409 LoadFieldInstr(Value* instance, 4421 LoadFieldInstr(Value* instance,
4410 intptr_t offset_in_bytes, 4422 intptr_t offset_in_bytes,
4411 const AbstractType& type, 4423 const AbstractType& type,
4412 intptr_t token_pos) 4424 TokenDescriptor token_pos)
4413 : offset_in_bytes_(offset_in_bytes), 4425 : offset_in_bytes_(offset_in_bytes),
4414 type_(type), 4426 type_(type),
4415 result_cid_(kDynamicCid), 4427 result_cid_(kDynamicCid),
4416 immutable_(false), 4428 immutable_(false),
4417 recognized_kind_(MethodRecognizer::kUnknown), 4429 recognized_kind_(MethodRecognizer::kUnknown),
4418 field_(NULL), 4430 field_(NULL),
4419 token_pos_(token_pos) { 4431 token_pos_(token_pos) {
4420 ASSERT(offset_in_bytes >= 0); 4432 ASSERT(offset_in_bytes >= 0);
4421 // May be null if field is not an instance. 4433 // May be null if field is not an instance.
4422 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); 4434 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
4423 SetInputAt(0, instance); 4435 SetInputAt(0, instance);
4424 } 4436 }
4425 4437
4426 LoadFieldInstr(Value* instance, 4438 LoadFieldInstr(Value* instance,
4427 const Field* field, 4439 const Field* field,
4428 const AbstractType& type, 4440 const AbstractType& type,
4429 intptr_t token_pos) 4441 TokenDescriptor token_pos)
4430 : offset_in_bytes_(field->Offset()), 4442 : offset_in_bytes_(field->Offset()),
4431 type_(type), 4443 type_(type),
4432 result_cid_(kDynamicCid), 4444 result_cid_(kDynamicCid),
4433 immutable_(false), 4445 immutable_(false),
4434 recognized_kind_(MethodRecognizer::kUnknown), 4446 recognized_kind_(MethodRecognizer::kUnknown),
4435 field_(field), 4447 field_(field),
4436 token_pos_(token_pos) { 4448 token_pos_(token_pos) {
4437 ASSERT(field->IsZoneHandle()); 4449 ASSERT(field->IsZoneHandle());
4438 // May be null if field is not an instance. 4450 // May be null if field is not an instance.
4439 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); 4451 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
4440 SetInputAt(0, instance); 4452 SetInputAt(0, instance);
4441 } 4453 }
4442 4454
4443 void set_is_immutable(bool value) { immutable_ = value; } 4455 void set_is_immutable(bool value) { immutable_ = value; }
4444 4456
4445 Value* instance() const { return inputs_[0]; } 4457 Value* instance() const { return inputs_[0]; }
4446 intptr_t offset_in_bytes() const { return offset_in_bytes_; } 4458 intptr_t offset_in_bytes() const { return offset_in_bytes_; }
4447 const AbstractType& type() const { return type_; } 4459 const AbstractType& type() const { return type_; }
4448 void set_result_cid(intptr_t value) { result_cid_ = value; } 4460 void set_result_cid(intptr_t value) { result_cid_ = value; }
4449 intptr_t result_cid() const { return result_cid_; } 4461 intptr_t result_cid() const { return result_cid_; }
4450 virtual intptr_t token_pos() const { return token_pos_; } 4462 virtual TokenDescriptor token_pos() const { return token_pos_; }
4451 4463
4452 const Field* field() const { return field_; } 4464 const Field* field() const { return field_; }
4453 4465
4454 virtual Representation representation() const; 4466 virtual Representation representation() const;
4455 4467
4456 bool IsUnboxedLoad() const; 4468 bool IsUnboxedLoad() const;
4457 4469
4458 bool IsPotentialUnboxedLoad() const; 4470 bool IsPotentialUnboxedLoad() const;
4459 4471
4460 void set_recognized_kind(MethodRecognizer::Kind kind) { 4472 void set_recognized_kind(MethodRecognizer::Kind kind) {
(...skipping 27 matching lines...) Expand all
4488 virtual bool AttributesEqual(Instruction* other) const; 4500 virtual bool AttributesEqual(Instruction* other) const;
4489 4501
4490 private: 4502 private:
4491 const intptr_t offset_in_bytes_; 4503 const intptr_t offset_in_bytes_;
4492 const AbstractType& type_; 4504 const AbstractType& type_;
4493 intptr_t result_cid_; 4505 intptr_t result_cid_;
4494 bool immutable_; 4506 bool immutable_;
4495 4507
4496 MethodRecognizer::Kind recognized_kind_; 4508 MethodRecognizer::Kind recognized_kind_;
4497 const Field* field_; 4509 const Field* field_;
4498 const intptr_t token_pos_; 4510 const TokenDescriptor token_pos_;
4499 4511
4500 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr); 4512 DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
4501 }; 4513 };
4502 4514
4503 4515
4504 class InstantiateTypeInstr : public TemplateDefinition<1, Throws> { 4516 class InstantiateTypeInstr : public TemplateDefinition<1, Throws> {
4505 public: 4517 public:
4506 InstantiateTypeInstr(intptr_t token_pos, 4518 InstantiateTypeInstr(TokenDescriptor token_pos,
4507 const AbstractType& type, 4519 const AbstractType& type,
4508 const Class& instantiator_class, 4520 const Class& instantiator_class,
4509 Value* instantiator) 4521 Value* instantiator)
4510 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 4522 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
4511 token_pos_(token_pos), 4523 token_pos_(token_pos),
4512 type_(type), 4524 type_(type),
4513 instantiator_class_(instantiator_class) { 4525 instantiator_class_(instantiator_class) {
4514 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle()); 4526 ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
4515 SetInputAt(0, instantiator); 4527 SetInputAt(0, instantiator);
4516 } 4528 }
4517 4529
4518 DECLARE_INSTRUCTION(InstantiateType) 4530 DECLARE_INSTRUCTION(InstantiateType)
4519 4531
4520 Value* instantiator() const { return inputs_[0]; } 4532 Value* instantiator() const { return inputs_[0]; }
4521 const AbstractType& type() const { return type_; 4533 const AbstractType& type() const { return type_;
4522 } 4534 }
4523 const Class& instantiator_class() const { return instantiator_class_; } 4535 const Class& instantiator_class() const { return instantiator_class_; }
4524 virtual intptr_t token_pos() const { return token_pos_; } 4536 virtual TokenDescriptor token_pos() const { return token_pos_; }
4525 4537
4526 virtual void PrintOperandsTo(BufferFormatter* f) const; 4538 virtual void PrintOperandsTo(BufferFormatter* f) const;
4527 4539
4528 virtual bool CanDeoptimize() const { return true; } 4540 virtual bool CanDeoptimize() const { return true; }
4529 4541
4530 virtual EffectSet Effects() const { return EffectSet::None(); } 4542 virtual EffectSet Effects() const { return EffectSet::None(); }
4531 4543
4532 private: 4544 private:
4533 const intptr_t token_pos_; 4545 const TokenDescriptor token_pos_;
4534 const AbstractType& type_; 4546 const AbstractType& type_;
4535 const Class& instantiator_class_; 4547 const Class& instantiator_class_;
4536 4548
4537 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr); 4549 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeInstr);
4538 }; 4550 };
4539 4551
4540 4552
4541 class InstantiateTypeArgumentsInstr : public TemplateDefinition<1, Throws> { 4553 class InstantiateTypeArgumentsInstr : public TemplateDefinition<1, Throws> {
4542 public: 4554 public:
4543 InstantiateTypeArgumentsInstr(intptr_t token_pos, 4555 InstantiateTypeArgumentsInstr(TokenDescriptor token_pos,
4544 const TypeArguments& type_arguments, 4556 const TypeArguments& type_arguments,
4545 const Class& instantiator_class, 4557 const Class& instantiator_class,
4546 Value* instantiator) 4558 Value* instantiator)
4547 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 4559 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
4548 token_pos_(token_pos), 4560 token_pos_(token_pos),
4549 type_arguments_(type_arguments), 4561 type_arguments_(type_arguments),
4550 instantiator_class_(instantiator_class) { 4562 instantiator_class_(instantiator_class) {
4551 ASSERT(type_arguments.IsZoneHandle()); 4563 ASSERT(type_arguments.IsZoneHandle());
4552 SetInputAt(0, instantiator); 4564 SetInputAt(0, instantiator);
4553 } 4565 }
4554 4566
4555 DECLARE_INSTRUCTION(InstantiateTypeArguments) 4567 DECLARE_INSTRUCTION(InstantiateTypeArguments)
4556 4568
4557 Value* instantiator() const { return inputs_[0]; } 4569 Value* instantiator() const { return inputs_[0]; }
4558 const TypeArguments& type_arguments() const { 4570 const TypeArguments& type_arguments() const {
4559 return type_arguments_; 4571 return type_arguments_;
4560 } 4572 }
4561 const Class& instantiator_class() const { return instantiator_class_; } 4573 const Class& instantiator_class() const { return instantiator_class_; }
4562 virtual intptr_t token_pos() const { return token_pos_; } 4574 virtual TokenDescriptor token_pos() const { return token_pos_; }
4563 4575
4564 virtual void PrintOperandsTo(BufferFormatter* f) const; 4576 virtual void PrintOperandsTo(BufferFormatter* f) const;
4565 4577
4566 virtual bool CanDeoptimize() const { return true; } 4578 virtual bool CanDeoptimize() const { return true; }
4567 4579
4568 virtual EffectSet Effects() const { return EffectSet::None(); } 4580 virtual EffectSet Effects() const { return EffectSet::None(); }
4569 4581
4570 virtual Definition* Canonicalize(FlowGraph* flow_graph); 4582 virtual Definition* Canonicalize(FlowGraph* flow_graph);
4571 4583
4572 private: 4584 private:
4573 const intptr_t token_pos_; 4585 const TokenDescriptor token_pos_;
4574 const TypeArguments& type_arguments_; 4586 const TypeArguments& type_arguments_;
4575 const Class& instantiator_class_; 4587 const Class& instantiator_class_;
4576 4588
4577 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr); 4589 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr);
4578 }; 4590 };
4579 4591
4580 4592
4581 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> { 4593 class AllocateContextInstr : public TemplateDefinition<0, NoThrow> {
4582 public: 4594 public:
4583 AllocateContextInstr(intptr_t token_pos, 4595 AllocateContextInstr(TokenDescriptor token_pos,
4584 intptr_t num_context_variables) 4596 intptr_t num_context_variables)
4585 : token_pos_(token_pos), 4597 : token_pos_(token_pos),
4586 num_context_variables_(num_context_variables) { } 4598 num_context_variables_(num_context_variables) { }
4587 4599
4588 DECLARE_INSTRUCTION(AllocateContext) 4600 DECLARE_INSTRUCTION(AllocateContext)
4589 virtual CompileType ComputeType() const; 4601 virtual CompileType ComputeType() const;
4590 4602
4591 virtual intptr_t token_pos() const { return token_pos_; } 4603 virtual TokenDescriptor token_pos() const { return token_pos_; }
4592 intptr_t num_context_variables() const { return num_context_variables_; } 4604 intptr_t num_context_variables() const { return num_context_variables_; }
4593 4605
4594 virtual void PrintOperandsTo(BufferFormatter* f) const; 4606 virtual void PrintOperandsTo(BufferFormatter* f) const;
4595 4607
4596 virtual bool CanDeoptimize() const { return false; } 4608 virtual bool CanDeoptimize() const { return false; }
4597 4609
4598 virtual EffectSet Effects() const { return EffectSet::None(); } 4610 virtual EffectSet Effects() const { return EffectSet::None(); }
4599 4611
4600 private: 4612 private:
4601 const intptr_t token_pos_; 4613 const TokenDescriptor token_pos_;
4602 const intptr_t num_context_variables_; 4614 const intptr_t num_context_variables_;
4603 4615
4604 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr); 4616 DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr);
4605 }; 4617 };
4606 4618
4607 4619
4608 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> { 4620 class InitStaticFieldInstr : public TemplateInstruction<1, Throws> {
4609 public: 4621 public:
4610 InitStaticFieldInstr(Value* input, const Field& field) 4622 InitStaticFieldInstr(Value* input, const Field& field)
4611 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 4623 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
4612 field_(field) { 4624 field_(field) {
4613 SetInputAt(0, input); 4625 SetInputAt(0, input);
4614 } 4626 }
4615 4627
4616 virtual intptr_t token_pos() const { return field_.token_pos(); } 4628 virtual TokenDescriptor token_pos() const {
4629 return TokenDescriptor(field_.token_pos());
4630 }
4617 const Field& field() const { return field_; } 4631 const Field& field() const { return field_; }
4618 4632
4619 DECLARE_INSTRUCTION(InitStaticField) 4633 DECLARE_INSTRUCTION(InitStaticField)
4620 4634
4621 virtual bool CanDeoptimize() const { return true; } 4635 virtual bool CanDeoptimize() const { return true; }
4622 virtual EffectSet Effects() const { return EffectSet::All(); } 4636 virtual EffectSet Effects() const { return EffectSet::All(); }
4623 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 4637 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
4624 4638
4625 private: 4639 private:
4626 const Field& field_; 4640 const Field& field_;
4627 4641
4628 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr); 4642 DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr);
4629 }; 4643 };
4630 4644
4631 4645
4632 class CloneContextInstr : public TemplateDefinition<1, NoThrow> { 4646 class CloneContextInstr : public TemplateDefinition<1, NoThrow> {
4633 public: 4647 public:
4634 CloneContextInstr(intptr_t token_pos, Value* context_value) 4648 CloneContextInstr(TokenDescriptor token_pos, Value* context_value)
4635 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 4649 : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
4636 token_pos_(token_pos) { 4650 token_pos_(token_pos) {
4637 SetInputAt(0, context_value); 4651 SetInputAt(0, context_value);
4638 } 4652 }
4639 4653
4640 virtual intptr_t token_pos() const { return token_pos_; } 4654 virtual TokenDescriptor token_pos() const { return token_pos_; }
4641 Value* context_value() const { return inputs_[0]; } 4655 Value* context_value() const { return inputs_[0]; }
4642 4656
4643 DECLARE_INSTRUCTION(CloneContext) 4657 DECLARE_INSTRUCTION(CloneContext)
4644 virtual CompileType ComputeType() const; 4658 virtual CompileType ComputeType() const;
4645 4659
4646 virtual bool CanDeoptimize() const { return true; } 4660 virtual bool CanDeoptimize() const { return true; }
4647 4661
4648 virtual EffectSet Effects() const { return EffectSet::None(); } 4662 virtual EffectSet Effects() const { return EffectSet::None(); }
4649 4663
4650 private: 4664 private:
4651 const intptr_t token_pos_; 4665 const TokenDescriptor token_pos_;
4652 4666
4653 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr); 4667 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr);
4654 }; 4668 };
4655 4669
4656 4670
4657 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> { 4671 class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> {
4658 public: 4672 public:
4659 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id) 4673 CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id)
4660 : TemplateInstruction(deopt_id), licm_hoisted_(false) { 4674 : TemplateInstruction(deopt_id), licm_hoisted_(false) {
4661 SetInputAt(0, left); 4675 SetInputAt(0, left);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
4761 ASSERT(idx == 0); 4775 ASSERT(idx == 0);
4762 return from_representation(); 4776 return from_representation();
4763 } 4777 }
4764 4778
4765 virtual bool AttributesEqual(Instruction* other) const { 4779 virtual bool AttributesEqual(Instruction* other) const {
4766 return other->AsBox()->from_representation() == from_representation(); 4780 return other->AsBox()->from_representation() == from_representation();
4767 } 4781 }
4768 4782
4769 Definition* Canonicalize(FlowGraph* flow_graph); 4783 Definition* Canonicalize(FlowGraph* flow_graph);
4770 4784
4771 virtual intptr_t token_pos() const { 4785 virtual TokenDescriptor token_pos() const {
4772 return ClassifyingTokenPositions::kBox; 4786 return TokenDescriptor::kBox;
4773 } 4787 }
4774 4788
4775 protected: 4789 protected:
4776 BoxInstr(Representation from_representation, Value* value) 4790 BoxInstr(Representation from_representation, Value* value)
4777 : from_representation_(from_representation) { 4791 : from_representation_(from_representation) {
4778 SetInputAt(0, value); 4792 SetInputAt(0, value);
4779 } 4793 }
4780 4794
4781 private: 4795 private:
4782 intptr_t ValueOffset() const { 4796 intptr_t ValueOffset() const {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
4887 virtual bool AttributesEqual(Instruction* other) const { 4901 virtual bool AttributesEqual(Instruction* other) const {
4888 return representation() == other->AsUnbox()->representation(); 4902 return representation() == other->AsUnbox()->representation();
4889 } 4903 }
4890 4904
4891 Definition* Canonicalize(FlowGraph* flow_graph); 4905 Definition* Canonicalize(FlowGraph* flow_graph);
4892 4906
4893 virtual intptr_t DeoptimizationTarget() const { 4907 virtual intptr_t DeoptimizationTarget() const {
4894 return GetDeoptId(); 4908 return GetDeoptId();
4895 } 4909 }
4896 4910
4897 virtual intptr_t token_pos() const { 4911 virtual TokenDescriptor token_pos() const {
4898 return ClassifyingTokenPositions::kBox; 4912 return TokenDescriptor::kBox;
4899 } 4913 }
4900 4914
4901 protected: 4915 protected:
4902 UnboxInstr(Representation representation, 4916 UnboxInstr(Representation representation,
4903 Value* value, 4917 Value* value,
4904 intptr_t deopt_id) 4918 intptr_t deopt_id)
4905 : TemplateDefinition(deopt_id), 4919 : TemplateDefinition(deopt_id),
4906 representation_(representation) { 4920 representation_(representation) {
4907 SetInputAt(0, value); 4921 SetInputAt(0, value);
4908 } 4922 }
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
5207 DISALLOW_COPY_AND_ASSIGN(MathMinMaxInstr); 5221 DISALLOW_COPY_AND_ASSIGN(MathMinMaxInstr);
5208 }; 5222 };
5209 5223
5210 5224
5211 class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> { 5225 class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> {
5212 public: 5226 public:
5213 BinaryDoubleOpInstr(Token::Kind op_kind, 5227 BinaryDoubleOpInstr(Token::Kind op_kind,
5214 Value* left, 5228 Value* left,
5215 Value* right, 5229 Value* right,
5216 intptr_t deopt_id, 5230 intptr_t deopt_id,
5217 intptr_t token_pos) 5231 TokenDescriptor token_pos)
5218 : TemplateDefinition(deopt_id), 5232 : TemplateDefinition(deopt_id),
5219 op_kind_(op_kind), 5233 op_kind_(op_kind),
5220 token_pos_(token_pos) { 5234 token_pos_(token_pos) {
5221 SetInputAt(0, left); 5235 SetInputAt(0, left);
5222 SetInputAt(1, right); 5236 SetInputAt(1, right);
5223 } 5237 }
5224 5238
5225 Value* left() const { return inputs_[0]; } 5239 Value* left() const { return inputs_[0]; }
5226 Value* right() const { return inputs_[1]; } 5240 Value* right() const { return inputs_[1]; }
5227 5241
5228 Token::Kind op_kind() const { return op_kind_; } 5242 Token::Kind op_kind() const { return op_kind_; }
5229 5243
5230 virtual intptr_t token_pos() const { return token_pos_; } 5244 virtual TokenDescriptor token_pos() const { return token_pos_; }
5231 5245
5232 virtual void PrintOperandsTo(BufferFormatter* f) const; 5246 virtual void PrintOperandsTo(BufferFormatter* f) const;
5233 5247
5234 virtual bool CanDeoptimize() const { return false; } 5248 virtual bool CanDeoptimize() const { return false; }
5235 5249
5236 virtual Representation representation() const { 5250 virtual Representation representation() const {
5237 return kUnboxedDouble; 5251 return kUnboxedDouble;
5238 } 5252 }
5239 5253
5240 virtual Representation RequiredInputRepresentation(intptr_t idx) const { 5254 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
(...skipping 11 matching lines...) Expand all
5252 virtual CompileType ComputeType() const; 5266 virtual CompileType ComputeType() const;
5253 5267
5254 virtual Definition* Canonicalize(FlowGraph* flow_graph); 5268 virtual Definition* Canonicalize(FlowGraph* flow_graph);
5255 5269
5256 virtual bool AttributesEqual(Instruction* other) const { 5270 virtual bool AttributesEqual(Instruction* other) const {
5257 return op_kind() == other->AsBinaryDoubleOp()->op_kind(); 5271 return op_kind() == other->AsBinaryDoubleOp()->op_kind();
5258 } 5272 }
5259 5273
5260 private: 5274 private:
5261 const Token::Kind op_kind_; 5275 const Token::Kind op_kind_;
5262 const intptr_t token_pos_; 5276 const TokenDescriptor token_pos_;
5263 5277
5264 DISALLOW_COPY_AND_ASSIGN(BinaryDoubleOpInstr); 5278 DISALLOW_COPY_AND_ASSIGN(BinaryDoubleOpInstr);
5265 }; 5279 };
5266 5280
5267 5281
5268 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> { 5282 class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
5269 public: 5283 public:
5270 BinaryFloat32x4OpInstr(Token::Kind op_kind, 5284 BinaryFloat32x4OpInstr(Token::Kind op_kind,
5271 Value* left, 5285 Value* left,
5272 Value* right, 5286 Value* right,
(...skipping 1885 matching lines...) Expand 10 before | Expand all | Expand 10 after
7158 7172
7159 private: 7173 private:
7160 const Token::Kind op_kind_; 7174 const Token::Kind op_kind_;
7161 7175
7162 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr); 7176 DISALLOW_COPY_AND_ASSIGN(UnaryDoubleOpInstr);
7163 }; 7177 };
7164 7178
7165 7179
7166 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { 7180 class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> {
7167 public: 7181 public:
7168 CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth) 7182 CheckStackOverflowInstr(TokenDescriptor token_pos, intptr_t loop_depth)
7169 : TemplateInstruction(Thread::Current()->GetNextDeoptId()), 7183 : TemplateInstruction(Thread::Current()->GetNextDeoptId()),
7170 token_pos_(token_pos), 7184 token_pos_(token_pos),
7171 loop_depth_(loop_depth) { 7185 loop_depth_(loop_depth) {
7172 } 7186 }
7173 7187
7174 virtual intptr_t token_pos() const { return token_pos_; } 7188 virtual TokenDescriptor token_pos() const { return token_pos_; }
7175 bool in_loop() const { return loop_depth_ > 0; } 7189 bool in_loop() const { return loop_depth_ > 0; }
7176 intptr_t loop_depth() const { return loop_depth_; } 7190 intptr_t loop_depth() const { return loop_depth_; }
7177 7191
7178 DECLARE_INSTRUCTION(CheckStackOverflow) 7192 DECLARE_INSTRUCTION(CheckStackOverflow)
7179 7193
7180 virtual bool CanDeoptimize() const { return true; } 7194 virtual bool CanDeoptimize() const { return true; }
7181 7195
7182 virtual EffectSet Effects() const { return EffectSet::None(); } 7196 virtual EffectSet Effects() const { return EffectSet::None(); }
7183 7197
7184 virtual void PrintOperandsTo(BufferFormatter* f) const; 7198 virtual void PrintOperandsTo(BufferFormatter* f) const;
7185 7199
7186 private: 7200 private:
7187 const intptr_t token_pos_; 7201 const TokenDescriptor token_pos_;
7188 const intptr_t loop_depth_; 7202 const intptr_t loop_depth_;
7189 7203
7190 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr); 7204 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr);
7191 }; 7205 };
7192 7206
7193 7207
7194 // TODO(vegorov): remove this instruction in favor of Int32ToDouble. 7208 // TODO(vegorov): remove this instruction in favor of Int32ToDouble.
7195 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { 7209 class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
7196 public: 7210 public:
7197 SmiToDoubleInstr(Value* value, intptr_t token_pos) 7211 SmiToDoubleInstr(Value* value, TokenDescriptor token_pos)
7198 : token_pos_(token_pos) { 7212 : token_pos_(token_pos) {
7199 SetInputAt(0, value); 7213 SetInputAt(0, value);
7200 } 7214 }
7201 7215
7202 Value* value() const { return inputs_[0]; } 7216 Value* value() const { return inputs_[0]; }
7203 virtual intptr_t token_pos() const { return token_pos_; } 7217 virtual TokenDescriptor token_pos() const { return token_pos_; }
7204 7218
7205 DECLARE_INSTRUCTION(SmiToDouble) 7219 DECLARE_INSTRUCTION(SmiToDouble)
7206 virtual CompileType ComputeType() const; 7220 virtual CompileType ComputeType() const;
7207 7221
7208 virtual Representation representation() const { 7222 virtual Representation representation() const {
7209 return kUnboxedDouble; 7223 return kUnboxedDouble;
7210 } 7224 }
7211 7225
7212 virtual bool CanDeoptimize() const { return false; } 7226 virtual bool CanDeoptimize() const { return false; }
7213 7227
7214 virtual bool AttributesEqual(Instruction* other) const { return true; } 7228 virtual bool AttributesEqual(Instruction* other) const { return true; }
7215 7229
7216 private: 7230 private:
7217 const intptr_t token_pos_; 7231 const TokenDescriptor token_pos_;
7218 7232
7219 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr); 7233 DISALLOW_COPY_AND_ASSIGN(SmiToDoubleInstr);
7220 }; 7234 };
7221 7235
7222 7236
7223 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> { 7237 class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
7224 public: 7238 public:
7225 explicit Int32ToDoubleInstr(Value* value) { 7239 explicit Int32ToDoubleInstr(Value* value) {
7226 SetInputAt(0, value); 7240 SetInputAt(0, value);
7227 } 7241 }
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
7454 private: 7468 private:
7455 DISALLOW_COPY_AND_ASSIGN(FloatToDoubleInstr); 7469 DISALLOW_COPY_AND_ASSIGN(FloatToDoubleInstr);
7456 }; 7470 };
7457 7471
7458 7472
7459 class InvokeMathCFunctionInstr : public PureDefinition { 7473 class InvokeMathCFunctionInstr : public PureDefinition {
7460 public: 7474 public:
7461 InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs, 7475 InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs,
7462 intptr_t deopt_id, 7476 intptr_t deopt_id,
7463 MethodRecognizer::Kind recognized_kind, 7477 MethodRecognizer::Kind recognized_kind,
7464 intptr_t token_pos); 7478 TokenDescriptor token_pos);
7465 7479
7466 static intptr_t ArgumentCountFor(MethodRecognizer::Kind recognized_kind_); 7480 static intptr_t ArgumentCountFor(MethodRecognizer::Kind recognized_kind_);
7467 7481
7468 const RuntimeEntry& TargetFunction() const; 7482 const RuntimeEntry& TargetFunction() const;
7469 7483
7470 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; } 7484 MethodRecognizer::Kind recognized_kind() const { return recognized_kind_; }
7471 7485
7472 virtual intptr_t token_pos() const { return token_pos_; } 7486 virtual TokenDescriptor token_pos() const { return token_pos_; }
7473 7487
7474 DECLARE_INSTRUCTION(InvokeMathCFunction) 7488 DECLARE_INSTRUCTION(InvokeMathCFunction)
7475 virtual CompileType ComputeType() const; 7489 virtual CompileType ComputeType() const;
7476 virtual void PrintOperandsTo(BufferFormatter* f) const; 7490 virtual void PrintOperandsTo(BufferFormatter* f) const;
7477 7491
7478 virtual bool CanDeoptimize() const { return false; } 7492 virtual bool CanDeoptimize() const { return false; }
7479 7493
7480 virtual Representation representation() const { 7494 virtual Representation representation() const {
7481 return kUnboxedDouble; 7495 return kUnboxedDouble;
7482 } 7496 }
(...skipping 24 matching lines...) Expand all
7507 static const intptr_t kObjectTempIndex = 1; 7521 static const intptr_t kObjectTempIndex = 1;
7508 static const intptr_t kDoubleTempIndex = 2; 7522 static const intptr_t kDoubleTempIndex = 2;
7509 7523
7510 private: 7524 private:
7511 virtual void RawSetInputAt(intptr_t i, Value* value) { 7525 virtual void RawSetInputAt(intptr_t i, Value* value) {
7512 (*inputs_)[i] = value; 7526 (*inputs_)[i] = value;
7513 } 7527 }
7514 7528
7515 ZoneGrowableArray<Value*>* inputs_; 7529 ZoneGrowableArray<Value*>* inputs_;
7516 const MethodRecognizer::Kind recognized_kind_; 7530 const MethodRecognizer::Kind recognized_kind_;
7517 const intptr_t token_pos_; 7531 const TokenDescriptor token_pos_;
7518 7532
7519 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr); 7533 DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr);
7520 }; 7534 };
7521 7535
7522 7536
7523 class ExtractNthOutputInstr : public TemplateDefinition<1, NoThrow, Pure> { 7537 class ExtractNthOutputInstr : public TemplateDefinition<1, NoThrow, Pure> {
7524 public: 7538 public:
7525 // Extract the Nth output register from value. 7539 // Extract the Nth output register from value.
7526 ExtractNthOutputInstr(Value* value, 7540 ExtractNthOutputInstr(Value* value,
7527 intptr_t n, 7541 intptr_t n,
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
7668 MergedMathInstr::Kind kind_; 7682 MergedMathInstr::Kind kind_;
7669 DISALLOW_COPY_AND_ASSIGN(MergedMathInstr); 7683 DISALLOW_COPY_AND_ASSIGN(MergedMathInstr);
7670 }; 7684 };
7671 7685
7672 7686
7673 class CheckClassInstr : public TemplateInstruction<1, NoThrow> { 7687 class CheckClassInstr : public TemplateInstruction<1, NoThrow> {
7674 public: 7688 public:
7675 CheckClassInstr(Value* value, 7689 CheckClassInstr(Value* value,
7676 intptr_t deopt_id, 7690 intptr_t deopt_id,
7677 const ICData& unary_checks, 7691 const ICData& unary_checks,
7678 intptr_t token_pos); 7692 TokenDescriptor token_pos);
7679 7693
7680 DECLARE_INSTRUCTION(CheckClass) 7694 DECLARE_INSTRUCTION(CheckClass)
7681 7695
7682 virtual bool CanDeoptimize() const { return true; } 7696 virtual bool CanDeoptimize() const { return true; }
7683 7697
7684 virtual intptr_t token_pos() const { return token_pos_; } 7698 virtual TokenDescriptor token_pos() const { return token_pos_; }
7685 7699
7686 Value* value() const { return inputs_[0]; } 7700 Value* value() const { return inputs_[0]; }
7687 7701
7688 const ICData& unary_checks() const { return unary_checks_; } 7702 const ICData& unary_checks() const { return unary_checks_; }
7689 7703
7690 const GrowableArray<intptr_t>& cids() const { return cids_; } 7704 const GrowableArray<intptr_t>& cids() const { return cids_; }
7691 7705
7692 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7706 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7693 7707
7694 virtual void PrintOperandsTo(BufferFormatter* f) const; 7708 virtual void PrintOperandsTo(BufferFormatter* f) const;
(...skipping 15 matching lines...) Expand all
7710 virtual bool AttributesEqual(Instruction* other) const; 7724 virtual bool AttributesEqual(Instruction* other) const;
7711 7725
7712 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 7726 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
7713 7727
7714 static bool IsImmutableClassId(intptr_t cid); 7728 static bool IsImmutableClassId(intptr_t cid);
7715 7729
7716 private: 7730 private:
7717 const ICData& unary_checks_; 7731 const ICData& unary_checks_;
7718 GrowableArray<intptr_t> cids_; // Sorted, lowest first. 7732 GrowableArray<intptr_t> cids_; // Sorted, lowest first.
7719 bool licm_hoisted_; 7733 bool licm_hoisted_;
7720 const intptr_t token_pos_; 7734 const TokenDescriptor token_pos_;
7721 7735
7722 DISALLOW_COPY_AND_ASSIGN(CheckClassInstr); 7736 DISALLOW_COPY_AND_ASSIGN(CheckClassInstr);
7723 }; 7737 };
7724 7738
7725 7739
7726 class CheckSmiInstr : public TemplateInstruction<1, NoThrow, Pure> { 7740 class CheckSmiInstr : public TemplateInstruction<1, NoThrow, Pure> {
7727 public: 7741 public:
7728 CheckSmiInstr(Value* value, intptr_t deopt_id, intptr_t token_pos) 7742 CheckSmiInstr(Value* value, intptr_t deopt_id, TokenDescriptor token_pos)
7729 : TemplateInstruction(deopt_id), 7743 : TemplateInstruction(deopt_id),
7730 token_pos_(token_pos), 7744 token_pos_(token_pos),
7731 licm_hoisted_(false) { 7745 licm_hoisted_(false) {
7732 SetInputAt(0, value); 7746 SetInputAt(0, value);
7733 } 7747 }
7734 7748
7735 Value* value() const { return inputs_[0]; } 7749 Value* value() const { return inputs_[0]; }
7736 virtual intptr_t token_pos() const { return token_pos_; } 7750 virtual TokenDescriptor token_pos() const { return token_pos_; }
7737 7751
7738 DECLARE_INSTRUCTION(CheckSmi) 7752 DECLARE_INSTRUCTION(CheckSmi)
7739 7753
7740 virtual bool CanDeoptimize() const { return true; } 7754 virtual bool CanDeoptimize() const { return true; }
7741 7755
7742 virtual Instruction* Canonicalize(FlowGraph* flow_graph); 7756 virtual Instruction* Canonicalize(FlowGraph* flow_graph);
7743 7757
7744 virtual bool AttributesEqual(Instruction* other) const { return true; } 7758 virtual bool AttributesEqual(Instruction* other) const { return true; }
7745 7759
7746 void set_licm_hoisted(bool value) { licm_hoisted_ = value; } 7760 void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
7747 7761
7748 private: 7762 private:
7749 const intptr_t token_pos_; 7763 const TokenDescriptor token_pos_;
7750 bool licm_hoisted_; 7764 bool licm_hoisted_;
7751 7765
7752 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr); 7766 DISALLOW_COPY_AND_ASSIGN(CheckSmiInstr);
7753 }; 7767 };
7754 7768
7755 7769
7756 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> { 7770 class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> {
7757 public: 7771 public:
7758 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) 7772 CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id)
7759 : TemplateInstruction(deopt_id), cid_(cid) { 7773 : TemplateInstruction(deopt_id), cid_(cid) {
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
8175 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ 8189 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \
8176 UNIMPLEMENTED(); \ 8190 UNIMPLEMENTED(); \
8177 return NULL; \ 8191 return NULL; \
8178 } \ 8192 } \
8179 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } 8193 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
8180 8194
8181 8195
8182 } // namespace dart 8196 } // namespace dart
8183 8197
8184 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 8198 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698