Chromium Code Reviews| Index: runtime/vm/intermediate_language.h |
| =================================================================== |
| --- runtime/vm/intermediate_language.h (revision 11599) |
| +++ runtime/vm/intermediate_language.h (working copy) |
| @@ -129,10 +129,9 @@ |
| class Computation : public ZoneAllocated { |
| public: |
| - Computation() : deopt_id_(Isolate::kNoDeoptId), ic_data_(NULL), locs_(NULL) { |
| + Computation() : deopt_id_(Isolate::kNoDeoptId), locs_(NULL) { |
| Isolate* isolate = Isolate::Current(); |
| deopt_id_ = isolate->GetNextDeoptId(); |
|
srdjan
2012/08/30 18:53:21
No need for variable isolate.
Florian Schneider
2012/09/03 10:33:29
Done.
|
| - ic_data_ = isolate->GetICDataForDeoptId(deopt_id_); |
| } |
| // Unique id used for deoptimization. |
| @@ -141,12 +140,6 @@ |
| return deopt_id_; |
| } |
| - const ICData* ic_data() const { return ic_data_; } |
| - void set_ic_data(const ICData* value) { ic_data_ = value; } |
| - bool HasICData() const { |
| - return (ic_data() != NULL) && !ic_data()->IsNull(); |
| - } |
| - |
| // Visiting support. |
| virtual void Accept(FlowGraphVisitor* visitor, BindInstr* instr) = 0; |
| @@ -257,7 +250,6 @@ |
| friend class BranchInstr; |
| intptr_t deopt_id_; |
| - const ICData* ic_data_; |
| LocationSummary* locs_; |
| DISALLOW_COPY_AND_ASSIGN(Computation); |
| @@ -603,7 +595,8 @@ |
| ZoneGrowableArray<PushArgumentInstr*>* arguments, |
| const Array& argument_names, |
| intptr_t checked_argument_count) |
| - : token_pos_(token_pos), |
| + : ic_data_(Isolate::Current()->GetICDataForDeoptId(deopt_id())), |
| + token_pos_(token_pos), |
| function_name_(function_name), |
| token_kind_(token_kind), |
| arguments_(arguments), |
| @@ -622,6 +615,12 @@ |
| DECLARE_CALL_COMPUTATION(InstanceCall) |
| + const ICData* ic_data() const { return ic_data_; } |
| + void set_ic_data(const ICData* value) { ic_data_ = value; } |
|
srdjan
2012/08/30 18:53:21
Is set_ic_data needed at all? (here and in places
Florian Schneider
2012/09/03 10:33:29
Done.
|
| + bool HasICData() const { |
| + return (ic_data() != NULL) && !ic_data()->IsNull(); |
| + } |
| + |
| intptr_t token_pos() const { return token_pos_; } |
| const String& function_name() const { return function_name_; } |
| Token::Kind token_kind() const { return token_kind_; } |
| @@ -638,6 +637,7 @@ |
| virtual intptr_t ResultCid() const { return kDynamicCid; } |
| private: |
| + const ICData* ic_data_; |
| const intptr_t token_pos_; |
| const String& function_name_; |
| const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. |
| @@ -651,8 +651,10 @@ |
| class PolymorphicInstanceCallComp : public TemplateComputation<0> { |
| public: |
| - explicit PolymorphicInstanceCallComp(InstanceCallComp* comp, bool with_checks) |
| - : instance_call_(comp), with_checks_(with_checks) { |
| + explicit PolymorphicInstanceCallComp(InstanceCallComp* comp, |
|
srdjan
2012/08/30 18:53:21
Remove explicit
Florian Schneider
2012/09/03 10:33:29
Done.
|
| + const ICData& ic_data, |
| + bool with_checks) |
| + : instance_call_(comp), ic_data_(ic_data), with_checks_(with_checks) { |
| ASSERT(instance_call_ != NULL); |
| } |
| @@ -667,11 +669,14 @@ |
| DECLARE_CALL_COMPUTATION(PolymorphicInstanceCall) |
| + const ICData& ic_data() const { return ic_data_; } |
| + |
| virtual bool CanDeoptimize() const { return true; } |
| virtual intptr_t ResultCid() const { return kDynamicCid; } |
| private: |
| InstanceCallComp* instance_call_; |
| + const ICData& ic_data_; |
| const bool with_checks_; |
| DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallComp); |
| @@ -731,6 +736,7 @@ |
| Value* left, |
| Value* right) |
| : ComparisonComp(kind, left, right), |
| + ic_data_(Isolate::Current()->GetICDataForDeoptId(deopt_id())), |
| token_pos_(token_pos), |
| receiver_class_id_(kIllegalCid) { |
| ASSERT((kind == Token::kEQ) || (kind == Token::kNE)); |
| @@ -738,6 +744,12 @@ |
| DECLARE_COMPUTATION(EqualityCompare) |
| + const ICData* ic_data() const { return ic_data_; } |
| + void set_ic_data(const ICData* value) { ic_data_ = value; } |
| + bool HasICData() const { |
| + return (ic_data() != NULL) && !ic_data()->IsNull(); |
| + } |
| + |
| intptr_t token_pos() const { return token_pos_; } |
| // Receiver class id is computed from collected ICData. |
| @@ -753,6 +765,7 @@ |
| BranchInstr* branch); |
| private: |
| + const ICData* ic_data_; |
| const intptr_t token_pos_; |
| intptr_t receiver_class_id_; // Set by optimizer. |
| @@ -767,6 +780,7 @@ |
| Value* left, |
| Value* right) |
| : ComparisonComp(kind, left, right), |
| + ic_data_(Isolate::Current()->GetICDataForDeoptId(deopt_id())), |
| token_pos_(token_pos), |
| operands_class_id_(kIllegalCid) { |
| ASSERT(Token::IsRelationalOperator(kind)); |
| @@ -774,6 +788,12 @@ |
| DECLARE_COMPUTATION(RelationalOp) |
| + const ICData* ic_data() const { return ic_data_; } |
| + void set_ic_data(const ICData* value) { ic_data_ = value; } |
| + bool HasICData() const { |
| + return (ic_data() != NULL) && !ic_data()->IsNull(); |
| + } |
| + |
| intptr_t token_pos() const { return token_pos_; } |
| // TODO(srdjan): instead of class-id pass an enum that can differentiate |
| @@ -793,6 +813,7 @@ |
| BranchInstr* branch); |
| private: |
| + const ICData* ic_data_; |
| const intptr_t token_pos_; |
| intptr_t operands_class_id_; // class id of both operands. |
| @@ -1706,6 +1727,8 @@ |
| InstanceCallComp* instance_call() const { return instance_call_; } |
| + const ICData* ic_data() const { return instance_call()->ic_data(); } |
| + |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| DECLARE_COMPUTATION(BinarySmiOp) |
| @@ -1743,6 +1766,8 @@ |
| InstanceCallComp* instance_call() const { return instance_call_; } |
| + const ICData* ic_data() const { return instance_call()->ic_data(); } |
| + |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| DECLARE_COMPUTATION(BinaryMintOp) |
| @@ -1767,6 +1792,8 @@ |
| InstanceCallComp* instance_call() const { return instance_call_; } |
| + const ICData* ic_data() const { return instance_call()->ic_data(); } |
| + |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| DECLARE_CALL_COMPUTATION(BinaryDoubleOp) |
| @@ -1829,6 +1856,8 @@ |
| InstanceCallComp* instance_call() const { return instance_call_; } |
| + const ICData* ic_data() const { return instance_call()->ic_data(); } |
| + |
| DECLARE_COMPUTATION(NumberNegate) |
| virtual bool CanDeoptimize() const { return true; } |
| @@ -1907,8 +1936,11 @@ |
| class CheckClassComp : public TemplateComputation<1> { |
| public: |
| - CheckClassComp(Value* value, InstanceCallComp* original) |
| - : original_(original) { |
| + CheckClassComp(Value* value, |
| + InstanceCallComp* instance_call, |
| + const ICData& unary_checks) |
| + : instance_call_(instance_call), |
| + unary_checks_(unary_checks) { |
| ASSERT(value != NULL); |
| inputs_[0] = value; |
| } |
| @@ -1924,14 +1956,17 @@ |
| Value* value() const { return inputs_[0]; } |
| - intptr_t deopt_id() const { return original_->deopt_id(); } |
| + const ICData& unary_checks() const { return unary_checks_; } |
| + intptr_t deopt_id() const { return instance_call_->deopt_id(); } |
| + |
| virtual Definition* TryReplace(BindInstr* instr) const; |
| virtual void PrintOperandsTo(BufferFormatter* f) const; |
| private: |
| - InstanceCallComp* original_; |
| + InstanceCallComp* instance_call_; |
| + const ICData& unary_checks_; |
| DISALLOW_COPY_AND_ASSIGN(CheckClassComp); |
| }; |
| @@ -1939,8 +1974,8 @@ |
| class CheckSmiComp : public TemplateComputation<1> { |
| public: |
| - CheckSmiComp(Value* value, InstanceCallComp* original) |
| - : original_(original) { |
| + CheckSmiComp(Value* value, InstanceCallComp* instance_call) |
| + : instance_call_(instance_call) { |
| ASSERT(value != NULL); |
| inputs_[0] = value; |
| } |
| @@ -1958,10 +1993,10 @@ |
| Value* value() const { return inputs_[0]; } |
| - intptr_t deopt_id() const { return original_->deopt_id(); } |
| + intptr_t deopt_id() const { return instance_call_->deopt_id(); } |
| private: |
| - InstanceCallComp* original_; |
| + InstanceCallComp* instance_call_; |
| DISALLOW_COPY_AND_ASSIGN(CheckSmiComp); |
| }; |
| @@ -1972,8 +2007,8 @@ |
| CheckArrayBoundComp(Value* array, |
| Value* index, |
| intptr_t array_type, |
| - InstanceCallComp* original) |
| - : array_type_(array_type), original_(original) { |
| + InstanceCallComp* instance_call) |
| + : array_type_(array_type), instance_call_(instance_call) { |
| ASSERT(array != NULL); |
| ASSERT(index != NULL); |
| inputs_[0] = array; |
| @@ -1994,11 +2029,11 @@ |
| intptr_t array_type() const { return array_type_; } |
| - intptr_t deopt_id() const { return original_->deopt_id(); } |
| + intptr_t deopt_id() const { return instance_call_->deopt_id(); } |
| private: |
| intptr_t array_type_; |
| - InstanceCallComp* original_; |
| + InstanceCallComp* instance_call_; |
| DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundComp); |
| }; |