| Index: runtime/vm/intermediate_language.h
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.h (revision 11450)
|
| +++ runtime/vm/intermediate_language.h (working copy)
|
| @@ -226,6 +226,11 @@
|
| // TODO(fschneider): Make EmitNativeCode and locs const.
|
| virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0;
|
|
|
| + virtual void EmitBranchCode(FlowGraphCompiler* compiler,
|
| + BranchInstr* branch) {
|
| + UNREACHABLE();
|
| + }
|
| +
|
| static LocationSummary* MakeCallSummary();
|
|
|
| // Declare an enum value used to define kind-test predicates.
|
| @@ -252,6 +257,8 @@
|
| #undef DECLARE_PREDICATE
|
|
|
| private:
|
| + friend class BranchInstr;
|
| +
|
| intptr_t deopt_id_;
|
| const ICData* ic_data_;
|
| LocationSummary* locs_;
|
| @@ -811,6 +818,9 @@
|
|
|
| virtual intptr_t ResultCid() const { return kBoolCid; }
|
|
|
| + virtual void EmitBranchCode(FlowGraphCompiler* compiler,
|
| + BranchInstr* branch);
|
| +
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(StrictCompareComp);
|
| };
|
| @@ -844,6 +854,9 @@
|
| virtual bool CanDeoptimize() const { return true; }
|
| virtual intptr_t ResultCid() const;
|
|
|
| + virtual void EmitBranchCode(FlowGraphCompiler* compiler,
|
| + BranchInstr* branch);
|
| +
|
| private:
|
| const intptr_t token_pos_;
|
| const intptr_t try_index_;
|
| @@ -885,6 +898,9 @@
|
| virtual bool CanDeoptimize() const { return true; }
|
| virtual intptr_t ResultCid() const;
|
|
|
| + virtual void EmitBranchCode(FlowGraphCompiler* compiler,
|
| + BranchInstr* branch);
|
| +
|
| private:
|
| const intptr_t token_pos_;
|
| const intptr_t try_index_;
|
| @@ -2202,7 +2218,6 @@
|
| M(ReThrow) \
|
| M(Goto) \
|
| M(Branch) \
|
| - M(StrictCompareAndBranch)
|
|
|
|
|
| // Forward declarations for Instruction classes.
|
| @@ -3212,129 +3227,49 @@
|
| };
|
|
|
|
|
| -template<intptr_t N>
|
| -class TemplateControlInstruction: public ControlInstruction {
|
| +class BranchInstr : public ControlInstruction {
|
| public:
|
| - TemplateControlInstruction<N>() : locs_(NULL) { }
|
| + explicit BranchInstr(ComparisonComp* computation)
|
| + : computation_(computation), locs_(NULL) { }
|
|
|
| - virtual intptr_t InputCount() const { return N; }
|
| - virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
|
| - virtual void SetInputAt(intptr_t i, Value* value) {
|
| - ASSERT(value != NULL);
|
| - inputs_[i] = value;
|
| - }
|
| + DECLARE_INSTRUCTION(Branch)
|
|
|
| - virtual LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| + virtual intptr_t ArgumentCount() const {
|
| + return computation()->ArgumentCount();
|
| }
|
| + intptr_t InputCount() const { return computation()->InputCount(); }
|
|
|
| - virtual LocationSummary* MakeLocationSummary() const = 0;
|
| + Value* InputAt(intptr_t i) const { return computation()->InputAt(i); }
|
|
|
| - protected:
|
| - EmbeddedArray<Value*, N> inputs_;
|
| -
|
| - private:
|
| - LocationSummary* locs_;
|
| -};
|
| -
|
| -
|
| -class BranchInstr : public TemplateControlInstruction<2> {
|
| - public:
|
| - BranchInstr(intptr_t token_pos,
|
| - intptr_t try_index,
|
| - Value* left,
|
| - Value* right,
|
| - Token::Kind kind)
|
| - : deopt_id_(Isolate::kNoDeoptId),
|
| - ic_data_(NULL),
|
| - token_pos_(token_pos),
|
| - try_index_(try_index),
|
| - kind_(kind) {
|
| - ASSERT(left != NULL);
|
| - ASSERT(right != NULL);
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - ASSERT(!Token::IsStrictEqualityOperator(kind));
|
| - ASSERT(Token::IsEqualityOperator(kind) ||
|
| - Token::IsRelationalOperator(kind) ||
|
| - Token::IsTypeTestOperator(kind));
|
| - Isolate* isolate = Isolate::Current();
|
| - deopt_id_ = isolate->GetNextDeoptId();
|
| - ic_data_ = isolate->GetICDataForDeoptId(deopt_id_);
|
| + void SetInputAt(intptr_t i, Value* value) {
|
| + computation()->SetInputAt(i, value);
|
| }
|
|
|
| - DECLARE_INSTRUCTION(Branch)
|
| + virtual bool CanDeoptimize() const { return computation()->CanDeoptimize(); }
|
|
|
| - Value* left() const { return inputs_[0]; }
|
| - Value* right() const { return inputs_[1]; }
|
| + ComparisonComp* computation() const { return computation_; }
|
| + void set_computation(ComparisonComp* value) { computation_ = value; }
|
|
|
| - virtual intptr_t ArgumentCount() const { return 0; }
|
| + virtual void EmitNativeCode(FlowGraphCompiler* compiler);
|
|
|
| - Token::Kind kind() const { return kind_; }
|
| -
|
| - intptr_t deopt_id() const { return deopt_id_; }
|
| -
|
| - const ICData* ic_data() const { return ic_data_; }
|
| - bool HasICData() const {
|
| - return (ic_data() != NULL) && !ic_data()->IsNull();
|
| + virtual LocationSummary* locs() {
|
| + if (computation_->locs_ == NULL) {
|
| + LocationSummary* summary = computation_->MakeLocationSummary();
|
| + // Branches don't produce a result.
|
| + summary->set_out(Location::NoLocation());
|
| + computation_->locs_ = summary;
|
| + }
|
| + return computation_->locs_;
|
| }
|
|
|
| - intptr_t token_pos() const { return token_pos_;}
|
| - intptr_t try_index() const { return try_index_; }
|
| -
|
| - virtual LocationSummary* MakeLocationSummary() const;
|
| -
|
| - virtual void EmitNativeCode(FlowGraphCompiler* compiler);
|
| -
|
| - virtual bool CanDeoptimize() const { return true; }
|
| -
|
| private:
|
| - intptr_t deopt_id_;
|
| - const ICData* ic_data_;
|
| - const intptr_t token_pos_;
|
| - const intptr_t try_index_;
|
| - const Token::Kind kind_;
|
| + ComparisonComp* computation_;
|
| + LocationSummary* locs_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(BranchInstr);
|
| };
|
|
|
|
|
| -class StrictCompareAndBranchInstr : public TemplateControlInstruction<2> {
|
| - public:
|
| - StrictCompareAndBranchInstr(Value* left, Value* right, Token::Kind kind)
|
| - : kind_(kind) {
|
| - ASSERT(left != NULL);
|
| - ASSERT(right != NULL);
|
| - inputs_[0] = left;
|
| - inputs_[1] = right;
|
| - ASSERT(Token::IsStrictEqualityOperator(kind));
|
| - }
|
| -
|
| - DECLARE_INSTRUCTION(StrictCompareAndBranch)
|
| -
|
| - Value* left() const { return inputs_[0]; }
|
| - Value* right() const { return inputs_[1]; }
|
| -
|
| - virtual intptr_t ArgumentCount() const { return 0; }
|
| -
|
| - Token::Kind kind() const { return kind_; }
|
| -
|
| - virtual LocationSummary* MakeLocationSummary() const;
|
| -
|
| - virtual void EmitNativeCode(FlowGraphCompiler* compiler);
|
| -
|
| - virtual bool CanDeoptimize() const { return false; }
|
| -
|
| - private:
|
| - const Token::Kind kind_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(StrictCompareAndBranchInstr);
|
| -};
|
| -
|
| -
|
| #undef DECLARE_INSTRUCTION
|
|
|
|
|
|
|