Index: runtime/vm/intermediate_language.h |
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
index dc33a3fe836bd2128b8eed52bae58c77f2c4faf9..bdd20cefb6483d96ca2ad0f863f66bdd9fdfb4f0 100644 |
--- a/runtime/vm/intermediate_language.h |
+++ b/runtime/vm/intermediate_language.h |
@@ -497,6 +497,7 @@ class EmbeddedArray<T, 0> { |
M(TargetEntry) \ |
M(CatchBlockEntry) \ |
M(Phi) \ |
+ M(Redefinition) \ |
M(Parameter) \ |
M(ParallelMove) \ |
M(PushArgument) \ |
@@ -534,6 +535,7 @@ class EmbeddedArray<T, 0> { |
M(LoadField) \ |
M(StoreVMField) \ |
M(LoadUntagged) \ |
+ M(LoadClassId) \ |
M(InstantiateTypeArguments) \ |
M(ExtractConstructorTypeArguments) \ |
M(ExtractConstructorInstantiator) \ |
@@ -876,6 +878,10 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK) |
friend class TargetEntryInstr; |
friend class JoinEntryInstr; |
friend class InstanceOfInstr; |
+ friend class PolymorphicInstanceCallInstr; |
+ friend class SmiToDoubleInstr; |
+ friend class DoubleToIntegerInstr; |
+ friend class BranchSimplifier; |
virtual void RawSetInputAt(intptr_t i, Value* value) = 0; |
@@ -1044,13 +1050,13 @@ class BlockEntryInstr : public Instruction { |
intptr_t end_pos() const { return end_pos_; } |
BlockEntryInstr* dominator() const { return dominator_; } |
- void set_dominator(BlockEntryInstr* instr) { dominator_ = instr; } |
const GrowableArray<BlockEntryInstr*>& dominated_blocks() { |
return dominated_blocks_; |
} |
void AddDominatedBlock(BlockEntryInstr* block) { |
+ block->set_dominator(this); |
dominated_blocks_.Add(block); |
} |
void ClearDominatedBlocks() { dominated_blocks_.Clear(); } |
@@ -1151,6 +1157,8 @@ class BlockEntryInstr : public Instruction { |
virtual void ClearPredecessors() = 0; |
virtual void AddPredecessor(BlockEntryInstr* predecessor) = 0; |
+ void set_dominator(BlockEntryInstr* instr) { dominator_ = instr; } |
+ |
intptr_t block_id_; |
const intptr_t try_index_; |
intptr_t preorder_number_; |
@@ -1309,6 +1317,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; |
@@ -2000,7 +2009,7 @@ class StoreContextInstr : public TemplateInstruction<1> { |
SetInputAt(0, value); |
} |
- DECLARE_INSTRUCTION(StoreContext); |
+ DECLARE_INSTRUCTION(StoreContext) |
virtual intptr_t ArgumentCount() const { return 0; } |
@@ -2046,6 +2055,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 }; |
@@ -2546,6 +2577,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_; } |
@@ -3152,7 +3184,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_; } |
@@ -3181,7 +3213,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_; } |
@@ -3574,7 +3606,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); |
} |
@@ -3604,6 +3636,34 @@ 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 bool AllowsCSE() const { return true; } |
+ virtual EffectSet Effects() const { return EffectSet::None(); } |
+ virtual EffectSet Dependencies() const { |
+ return EffectSet::Externalization(); |
+ } |
+ virtual bool AttributesEqual(Instruction* other) const { return true; } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr); |
+}; |
+ |
+ |
class LoadFieldInstr : public TemplateDefinition<1> { |
public: |
LoadFieldInstr(Value* instance, |
@@ -3824,7 +3884,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_; } |
@@ -4137,8 +4197,6 @@ class UnboxUint32x4Instr : public TemplateDefinition<1> { |
return (value()->Type()->ToCid() != kUint32x4Cid); |
} |
- virtual bool HasSideEffect() const { return false; } |
- |
virtual Representation representation() const { |
return kUnboxedUint32x4; |
} |
@@ -5233,6 +5291,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]; } |