Chromium Code Reviews| Index: runtime/vm/intermediate_language.h |
| diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
| index 6b560f62dc342595ebcd236f83530304097cde1e..0088b694fd971717b70bc0d6fdcfee6230b9f425 100644 |
| --- a/runtime/vm/intermediate_language.h |
| +++ b/runtime/vm/intermediate_language.h |
| @@ -488,6 +488,7 @@ class EmbeddedArray<T, 0> { |
| M(TargetEntry) \ |
| M(CatchBlockEntry) \ |
| M(Phi) \ |
| + M(Redefinition) \ |
| M(Parameter) \ |
| M(ParallelMove) \ |
| M(PushArgument) \ |
| @@ -525,6 +526,7 @@ class EmbeddedArray<T, 0> { |
| M(LoadField) \ |
| M(StoreVMField) \ |
| M(LoadUntagged) \ |
| + M(LoadClassId) \ |
| M(InstantiateTypeArguments) \ |
| M(ExtractConstructorTypeArguments) \ |
| M(ExtractConstructorInstantiator) \ |
| @@ -859,6 +861,9 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK) |
| friend class TargetEntryInstr; |
| friend class JoinEntryInstr; |
| friend class InstanceOfInstr; |
| + friend class PolymorphicInstanceCallInstr; |
| + friend class SmiToDoubleInstr; |
| + friend class DoubleToIntegerInstr; |
| virtual void RawSetInputAt(intptr_t i, Value* value) = 0; |
| @@ -1292,6 +1297,7 @@ class JoinEntryInstr : public BlockEntryInstr { |
| // Classes that have access to predecessors_ when inlining. |
| friend class BlockEntryInstr; |
| friend class InlineExitCollector; |
| + friend class PolymorphicInliner; |
| // Direct access to phis_ in order to resize it due to phi elimination. |
| friend class ConstantPropagator; |
| @@ -1983,7 +1989,7 @@ class StoreContextInstr : public TemplateInstruction<1> { |
| SetInputAt(0, value); |
| } |
| - DECLARE_INSTRUCTION(StoreContext); |
| + DECLARE_INSTRUCTION(StoreContext) |
| virtual intptr_t ArgumentCount() const { return 0; } |
| @@ -2029,6 +2035,28 @@ class TemplateDefinition : public Definition { |
| }; |
| +class RedefinitionInstr : public TemplateDefinition<1> { |
| + public: |
| + explicit RedefinitionInstr(Value* value) { |
| + SetInputAt(0, value); |
| + } |
| + |
| + DECLARE_INSTRUCTION(Redefinition) |
| + |
| + Value* value() const { return inputs_[0]; } |
| + |
| + virtual CompileType ComputeType() const; |
| + virtual bool RecomputeType(); |
| + |
| + virtual bool CanDeoptimize() const { return false; } |
| + virtual EffectSet Dependencies() const { return EffectSet::None(); } |
| + virtual EffectSet Effects() const { return EffectSet::None(); } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr); |
| +}; |
| + |
| + |
| class RangeBoundary : public ValueObject { |
| public: |
| enum Kind { kUnknown, kSymbol, kConstant }; |
| @@ -2529,6 +2557,7 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0> { |
| ic_data_(ic_data), |
| with_checks_(with_checks) { |
| ASSERT(instance_call_ != NULL); |
| + deopt_id_ = instance_call->deopt_id(); |
| } |
| InstanceCallInstr* instance_call() const { return instance_call_; } |
| @@ -3135,7 +3164,7 @@ class LoadStaticFieldInstr : public TemplateDefinition<0> { |
| public: |
| explicit LoadStaticFieldInstr(const Field& field) : field_(field) {} |
| - DECLARE_INSTRUCTION(LoadStaticField); |
| + DECLARE_INSTRUCTION(LoadStaticField) |
| virtual CompileType ComputeType() const; |
| const Field& field() const { return field_; } |
| @@ -3164,7 +3193,7 @@ class StoreStaticFieldInstr : public TemplateDefinition<1> { |
| SetInputAt(0, value); |
| } |
| - DECLARE_INSTRUCTION(StoreStaticField); |
| + DECLARE_INSTRUCTION(StoreStaticField) |
| virtual CompileType* ComputeInitialType() const; |
| const Field& field() const { return field_; } |
| @@ -3543,7 +3572,7 @@ class CreateClosureInstr : public TemplateDefinition<0> { |
| class LoadUntaggedInstr : public TemplateDefinition<1> { |
| public: |
| - explicit LoadUntaggedInstr(Value* object, intptr_t offset) : offset_(offset) { |
| + LoadUntaggedInstr(Value* object, intptr_t offset) : offset_(offset) { |
| SetInputAt(0, object); |
| } |
| @@ -3573,6 +3602,30 @@ class LoadUntaggedInstr : public TemplateDefinition<1> { |
| }; |
| +class LoadClassIdInstr : public TemplateDefinition<1> { |
| + public: |
| + explicit LoadClassIdInstr(Value* object) { |
| + SetInputAt(0, object); |
| + } |
| + |
| + virtual Representation representation() const { |
| + return kTagged; |
| + } |
| + DECLARE_INSTRUCTION(LoadClassId) |
| + virtual CompileType ComputeType() const; |
| + |
| + Value* object() const { return inputs_[0]; } |
| + |
| + virtual bool CanDeoptimize() const { return false; } |
| + virtual EffectSet Effects() const { return EffectSet::None(); } |
| + virtual EffectSet Dependencies() const { return EffectSet::None(); } |
| + virtual bool AttributesEqual(Instruction* other) const { return true; } |
|
Florian Schneider
2013/05/03 10:41:36
This instructions could have AllowsCSE true, and D
Kevin Millikin (Google)
2013/05/03 11:47:38
Ouch, good catch. That was the intent, but CSE in
|
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); |
| +}; |
| + |
| + |
| class LoadFieldInstr : public TemplateDefinition<1> { |
| public: |
| LoadFieldInstr(Value* value, |
| @@ -3793,7 +3846,7 @@ class AllocateContextInstr : public TemplateDefinition<0> { |
| : token_pos_(token_pos), |
| num_context_variables_(num_context_variables) {} |
| - DECLARE_INSTRUCTION(AllocateContext); |
| + DECLARE_INSTRUCTION(AllocateContext) |
| virtual CompileType ComputeType() const; |
| intptr_t token_pos() const { return token_pos_; } |
| @@ -4102,8 +4155,6 @@ class UnboxUint32x4Instr : public TemplateDefinition<1> { |
| return (value()->Type()->ToCid() != kUint32x4Cid); |
| } |
| - virtual bool HasSideEffect() const { return false; } |
| - |
| virtual Representation representation() const { |
| return kUnboxedUint32x4; |
| } |
| @@ -5009,6 +5060,7 @@ class DoubleToIntegerInstr : public TemplateDefinition<1> { |
| DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call) |
| : instance_call_(instance_call) { |
| SetInputAt(0, value); |
| + deopt_id_ = instance_call->deopt_id(); |
| } |
| Value* value() const { return inputs_[0]; } |