| Index: runtime/vm/intermediate_language.h
|
| ===================================================================
|
| --- runtime/vm/intermediate_language.h (revision 31159)
|
| +++ runtime/vm/intermediate_language.h (working copy)
|
| @@ -711,7 +711,7 @@
|
| virtual void Accept(FlowGraphVisitor* visitor); \
|
| virtual type##Instr* As##type() { return this; } \
|
| virtual const char* DebugName() const { return #type; } \
|
| - virtual LocationSummary* MakeLocationSummary() const; \
|
| + virtual LocationSummary* MakeLocationSummary(bool optimizing) const; \
|
| virtual void EmitNativeCode(FlowGraphCompiler* compiler); \
|
|
|
|
|
| @@ -729,6 +729,7 @@
|
| previous_(NULL),
|
| next_(NULL),
|
| env_(NULL),
|
| + locs_(NULL),
|
| place_id_(kNoPlaceId) { }
|
|
|
| virtual Tag tag() const = 0;
|
| @@ -830,14 +831,17 @@
|
| // Returns structure describing location constraints required
|
| // to emit native code for this instruction.
|
| virtual LocationSummary* locs() {
|
| - // TODO(vegorov): This should be pure virtual method.
|
| - // However we are temporary using NULL for instructions that
|
| - // were not converted to the location based code generation yet.
|
| - return NULL;
|
| + ASSERT(locs_ != NULL);
|
| + return locs_;
|
| }
|
|
|
| - virtual LocationSummary* MakeLocationSummary() const = 0;
|
| + virtual LocationSummary* MakeLocationSummary(bool is_optimizing) const = 0;
|
|
|
| + void InitializeLocationSummary(bool optimizing) {
|
| + ASSERT(locs_ == NULL);
|
| + locs_ = MakeLocationSummary(optimizing);
|
| + }
|
| +
|
| static LocationSummary* MakeCallSummary();
|
|
|
| virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
|
| @@ -953,6 +957,7 @@
|
| }
|
|
|
| private:
|
| + friend class FlowGraphPrinter;
|
| friend class Definition; // Needed for InsertBefore, InsertAfter.
|
|
|
| // Classes that set or read deopt_id_.
|
| @@ -1027,6 +1032,7 @@
|
| Instruction* previous_;
|
| Instruction* next_;
|
| Environment* env_;
|
| + LocationSummary* locs_;
|
| intptr_t place_id_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Instruction);
|
| @@ -1036,18 +1042,11 @@
|
| template<intptr_t N>
|
| class TemplateInstruction: public Instruction {
|
| public:
|
| - TemplateInstruction<N>() : locs_(NULL) { }
|
| + TemplateInstruction<N>() : inputs_() { }
|
|
|
| virtual intptr_t InputCount() const { return N; }
|
| virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
|
|
|
| - virtual LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| - }
|
| -
|
| protected:
|
| EmbeddedArray<Value*, N> inputs_;
|
|
|
| @@ -1055,8 +1054,6 @@
|
| virtual void RawSetInputAt(intptr_t i, Value* value) {
|
| inputs_[i] = value;
|
| }
|
| -
|
| - LocationSummary* locs_;
|
| };
|
|
|
|
|
| @@ -1929,7 +1926,7 @@
|
|
|
| class PushArgumentInstr : public Definition {
|
| public:
|
| - explicit PushArgumentInstr(Value* value) : locs_(NULL) {
|
| + explicit PushArgumentInstr(Value* value) {
|
| SetInputAt(0, value);
|
| set_use_kind(kEffect); // Override the default.
|
| }
|
| @@ -1948,13 +1945,6 @@
|
|
|
| Value* value() const { return value_; }
|
|
|
| - virtual LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| - }
|
| -
|
| virtual intptr_t Hashcode() const {
|
| UNREACHABLE();
|
| return 0;
|
| @@ -1975,7 +1965,6 @@
|
| }
|
|
|
| Value* value_;
|
| - LocationSummary* locs_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr);
|
| };
|
| @@ -2133,20 +2122,11 @@
|
| template<intptr_t N>
|
| class TemplateDefinition : public Definition {
|
| public:
|
| - TemplateDefinition<N>() : locs_(NULL) { }
|
| + TemplateDefinition<N>() : inputs_() { }
|
|
|
| virtual intptr_t InputCount() const { return N; }
|
| virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
|
|
|
| - // Returns a structure describing the location constraints required
|
| - // to emit native code for this definition.
|
| - LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| - }
|
| -
|
| protected:
|
| EmbeddedArray<Value*, N> inputs_;
|
|
|
| @@ -2157,8 +2137,6 @@
|
| virtual void RawSetInputAt(intptr_t i, Value* value) {
|
| inputs_[i] = value;
|
| }
|
| -
|
| - LocationSummary* locs_;
|
| };
|
|
|
|
|
| @@ -2260,18 +2238,6 @@
|
|
|
| bool is_checked() const { return is_checked_; }
|
|
|
| - virtual LocationSummary* locs() {
|
| - if (comparison()->locs_ == NULL) {
|
| - LocationSummary* summary = comparison()->MakeLocationSummary();
|
| - // Branches don't produce a result.
|
| - summary->set_out(Location::NoLocation());
|
| - // The back-end expects the location summary to be stored in the
|
| - // comparison.
|
| - comparison()->locs_ = summary;
|
| - }
|
| - return comparison()->locs_;
|
| - }
|
| -
|
| virtual intptr_t DeoptimizationTarget() const {
|
| return comparison()->DeoptimizationTarget();
|
| }
|
| @@ -3153,16 +3119,6 @@
|
| return comparison()->CanBecomeDeoptimizationTarget();
|
| }
|
|
|
| - virtual LocationSummary* locs() {
|
| - if (comparison()->locs_ == NULL) {
|
| - LocationSummary* summary = MakeLocationSummary();
|
| - // The back-end expects the location summary to be stored in the
|
| - // comparison.
|
| - comparison()->locs_ = summary;
|
| - }
|
| - return comparison()->locs_;
|
| - }
|
| -
|
| virtual intptr_t DeoptimizationTarget() const {
|
| return comparison()->DeoptimizationTarget();
|
| }
|
| @@ -3469,9 +3425,11 @@
|
| StoreInstanceFieldInstr(const Field& field,
|
| Value* instance,
|
| Value* value,
|
| - StoreBarrierType emit_store_barrier)
|
| + StoreBarrierType emit_store_barrier,
|
| + bool is_initialization = false)
|
| : field_(field),
|
| - emit_store_barrier_(emit_store_barrier) {
|
| + emit_store_barrier_(emit_store_barrier),
|
| + is_initialization_(is_initialization) {
|
| SetInputAt(kInstancePos, instance);
|
| SetInputAt(kValuePos, value);
|
| }
|
| @@ -3499,6 +3457,11 @@
|
|
|
| virtual bool CanDeoptimize() const { return false; }
|
|
|
| + // May require a deoptimization target for input conversions.
|
| + virtual intptr_t DeoptimizationTarget() const {
|
| + return GetDeoptId();
|
| + }
|
| +
|
| // Currently CSE/LICM don't operate on any instructions that can be affected
|
| // by stores/loads. LoadOptimizer handles loads separately. Hence stores
|
| // are marked as having no side-effects.
|
| @@ -3506,7 +3469,19 @@
|
|
|
| virtual bool MayThrow() const { return false; }
|
|
|
| + bool IsUnboxedStore() const;
|
| +
|
| + bool IsPotentialUnboxedStore() const;
|
| +
|
| + virtual Representation RequiredInputRepresentation(intptr_t index) const {
|
| + ASSERT((index == 0) || (index == 1));
|
| + if ((index == 1) && IsUnboxedStore()) return kUnboxedDouble;
|
| + return kTagged;
|
| + }
|
| +
|
| private:
|
| + friend class FlowGraphOptimizer; // For ASSERT(initialization_).
|
| +
|
| bool CanValueBeSmi() const {
|
| const intptr_t cid = value()->Type()->ToNullableCid();
|
| // Write barrier is skipped for nullable and non-nullable smis.
|
| @@ -3516,6 +3491,7 @@
|
|
|
| const Field& field_;
|
| const StoreBarrierType emit_store_barrier_;
|
| + const bool is_initialization_; // Marks stores in the constructor.
|
|
|
| DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr);
|
| };
|
| @@ -3996,11 +3972,6 @@
|
| virtual bool CanDeoptimize() const { return false; }
|
| virtual EffectSet Effects() const { return EffectSet::None(); }
|
|
|
| - LocationSummary* locs() {
|
| - UNREACHABLE();
|
| - return NULL;
|
| - }
|
| -
|
| Location* locations() { return locations_; }
|
| void set_locations(Location* locations) { locations_ = locations; }
|
|
|
| @@ -4216,6 +4187,14 @@
|
| const Field* field() const { return field_; }
|
| void set_field(const Field* field) { field_ = field; }
|
|
|
| + virtual Representation representation() const {
|
| + return IsUnboxedLoad() ? kUnboxedDouble : kTagged;
|
| + }
|
| +
|
| + bool IsUnboxedLoad() const;
|
| +
|
| + bool IsPotentialUnboxedLoad() const;
|
| +
|
| void set_recognized_kind(MethodRecognizer::Kind kind) {
|
| recognized_kind_ = kind;
|
| }
|
| @@ -6617,15 +6596,6 @@
|
| return (*inputs_)[i];
|
| }
|
|
|
| - // Returns a structure describing the location constraints required
|
| - // to emit native code for this definition.
|
| - LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| - }
|
| -
|
| virtual bool AllowsCSE() const { return true; }
|
| virtual EffectSet Effects() const { return EffectSet::None(); }
|
| virtual EffectSet Dependencies() const { return EffectSet::None(); }
|
| @@ -6643,8 +6613,6 @@
|
|
|
| ZoneGrowableArray<Value*>* inputs_;
|
|
|
| - LocationSummary* locs_;
|
| -
|
| const MethodRecognizer::Kind recognized_kind_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InvokeMathCFunctionInstr);
|
| @@ -6727,15 +6695,6 @@
|
|
|
| DECLARE_INSTRUCTION(MergedMath)
|
|
|
| - // Returns a structure describing the location constraints required
|
| - // to emit native code for this definition.
|
| - LocationSummary* locs() {
|
| - if (locs_ == NULL) {
|
| - locs_ = MakeLocationSummary();
|
| - }
|
| - return locs_;
|
| - }
|
| -
|
| virtual bool AllowsCSE() const { return true; }
|
| virtual EffectSet Effects() const { return EffectSet::None(); }
|
| virtual EffectSet Dependencies() const { return EffectSet::None(); }
|
| @@ -6759,7 +6718,6 @@
|
| }
|
|
|
| ZoneGrowableArray<Value*>* inputs_;
|
| - LocationSummary* locs_;
|
| MergedMathInstr::Kind kind_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MergedMathInstr);
|
|
|