| Index: runtime/vm/intermediate_language.h
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.h (revision 11602)
|
| +++ runtime/vm/intermediate_language.h (working copy)
|
| @@ -129,11 +129,8 @@
|
|
|
| class Computation : public ZoneAllocated {
|
| public:
|
| - Computation() : deopt_id_(Isolate::kNoDeoptId), ic_data_(NULL), locs_(NULL) {
|
| - Isolate* isolate = Isolate::Current();
|
| - deopt_id_ = isolate->GetNextDeoptId();
|
| - ic_data_ = isolate->GetICDataForDeoptId(deopt_id_);
|
| - }
|
| + Computation()
|
| + : deopt_id_(Isolate::Current()->GetNextDeoptId()), locs_(NULL) { }
|
|
|
| // Unique id used for deoptimization.
|
| intptr_t deopt_id() const {
|
| @@ -141,12 +138,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 +248,6 @@
|
| friend class BranchInstr;
|
|
|
| intptr_t deopt_id_;
|
| - const ICData* ic_data_;
|
| LocationSummary* locs_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Computation);
|
| @@ -603,7 +593,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 +613,11 @@
|
|
|
| DECLARE_CALL_COMPUTATION(InstanceCall)
|
|
|
| + const ICData* ic_data() const { return ic_data_; }
|
| + 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 +634,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 +648,10 @@
|
|
|
| class PolymorphicInstanceCallComp : public TemplateComputation<0> {
|
| public:
|
| - explicit PolymorphicInstanceCallComp(InstanceCallComp* comp, bool with_checks)
|
| - : instance_call_(comp), with_checks_(with_checks) {
|
| + PolymorphicInstanceCallComp(InstanceCallComp* comp,
|
| + const ICData& ic_data,
|
| + bool with_checks)
|
| + : instance_call_(comp), ic_data_(ic_data), with_checks_(with_checks) {
|
| ASSERT(instance_call_ != NULL);
|
| }
|
|
|
| @@ -667,11 +666,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 +733,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 +741,11 @@
|
|
|
| DECLARE_COMPUTATION(EqualityCompare)
|
|
|
| + const ICData* ic_data() const { return ic_data_; }
|
| + 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 +761,7 @@
|
| BranchInstr* branch);
|
|
|
| private:
|
| + const ICData* ic_data_;
|
| const intptr_t token_pos_;
|
| intptr_t receiver_class_id_; // Set by optimizer.
|
|
|
| @@ -767,6 +776,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 +784,11 @@
|
|
|
| DECLARE_COMPUTATION(RelationalOp)
|
|
|
| + const ICData* ic_data() const { return ic_data_; }
|
| + 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 +808,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 +1722,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 +1761,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 +1787,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 +1851,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 +1931,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 +1951,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 +1969,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 +1988,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 +2002,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 +2024,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);
|
| };
|
| @@ -2579,7 +2609,7 @@
|
| catch_try_index_(CatchClauseNode::kInvalidTryIndex) { }
|
|
|
| // Used for exception catch entries.
|
| - explicit TargetEntryInstr(intptr_t try_index, intptr_t catch_try_index)
|
| + TargetEntryInstr(intptr_t try_index, intptr_t catch_try_index)
|
| : BlockEntryInstr(try_index),
|
| predecessor_(NULL),
|
| catch_try_index_(catch_try_index) { }
|
|
|