| Index: runtime/vm/intermediate_language.h
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.h (revision 11146)
|
| +++ runtime/vm/intermediate_language.h (working copy)
|
| @@ -103,6 +103,7 @@
|
| M(DoubleToDouble, DoubleToDoubleComp) \
|
| M(SmiToDouble, SmiToDoubleComp) \
|
| M(CheckClass, CheckClassComp) \
|
| + M(CheckSmi, CheckSmiComp) \
|
| M(Materialize, MaterializeComp)
|
|
|
|
|
| @@ -152,9 +153,10 @@
|
| // Returns true, if this computation can deoptimize.
|
| virtual bool CanDeoptimize() const = 0;
|
|
|
| - // Optimize this computation. Returns a replacement for the instruction
|
| - // that wraps this computation or NULL if nothing to replace.
|
| - virtual Definition* TryReplace(BindInstr* instr) { return NULL; }
|
| + // Returns a replacement for the instruction that wraps this computation.
|
| + // Returns NULL if instr can be eliminated.
|
| + // By default returns instr (input parameter) which means no change.
|
| + virtual Definition* TryReplace(BindInstr* instr) const;
|
|
|
| // Compares two computations. Returns true, if:
|
| // 1. They are of the same kind.
|
| @@ -772,7 +774,8 @@
|
|
|
| virtual bool CanDeoptimize() const { return false; }
|
|
|
| - virtual Definition* TryReplace(BindInstr* instr);
|
| + virtual Definition* TryReplace(BindInstr* instr) const;
|
| +
|
| virtual intptr_t ResultCid() const { return kBoolCid; }
|
|
|
| private:
|
| @@ -1675,7 +1678,8 @@
|
|
|
| DECLARE_COMPUTATION(BinarySmiOp)
|
|
|
| - virtual bool CanDeoptimize() const { return true; }
|
| + virtual bool CanDeoptimize() const;
|
| +
|
| virtual intptr_t ResultCid() const;
|
|
|
| private:
|
| @@ -1890,6 +1894,8 @@
|
| intptr_t deopt_id() const { return original_->deopt_id(); }
|
| intptr_t try_index() const { return original_->try_index(); }
|
|
|
| + virtual void PrintOperandsTo(BufferFormatter* f) const;
|
| +
|
| private:
|
| InstanceCallComp* original_;
|
|
|
| @@ -1897,6 +1903,36 @@
|
| };
|
|
|
|
|
| +class CheckSmiComp : public TemplateComputation<1> {
|
| + public:
|
| + CheckSmiComp(Value* value, InstanceCallComp* original)
|
| + : original_(original) {
|
| + ASSERT(value != NULL);
|
| + inputs_[0] = value;
|
| + }
|
| +
|
| + DECLARE_COMPUTATION(CheckSmi)
|
| +
|
| + virtual bool CanDeoptimize() const { return true; }
|
| +
|
| + virtual bool AttributesEqual(Computation* other) const { return true; }
|
| +
|
| + virtual bool HasSideEffect() const { return false; }
|
| +
|
| + virtual Definition* TryReplace(BindInstr* instr) const;
|
| +
|
| + Value* value() const { return inputs_[0]; }
|
| +
|
| + intptr_t deopt_id() const { return original_->deopt_id(); }
|
| + intptr_t try_index() const { return original_->try_index(); }
|
| +
|
| + private:
|
| + InstanceCallComp* original_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CheckSmiComp);
|
| +};
|
| +
|
| +
|
| #undef DECLARE_COMPUTATION
|
|
|
|
|
| @@ -3063,9 +3099,16 @@
|
| return fixed_parameter_count_;
|
| }
|
|
|
| + Environment* Copy() const;
|
| +
|
| void PrintTo(BufferFormatter* f) const;
|
|
|
| private:
|
| + Environment(intptr_t length, intptr_t fixed_parameter_count)
|
| + : values_(length),
|
| + locations_(NULL),
|
| + fixed_parameter_count_(fixed_parameter_count) { }
|
| +
|
| GrowableArray<Value*> values_;
|
| Location* locations_;
|
| const intptr_t fixed_parameter_count_;
|
|
|