| Index: runtime/vm/intermediate_language.h
|
| diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
|
| index 823f4774b718309cd26bfb9df3363c42e2245f6f..9a492a3367c289637509d8917ade482102fb2292 100644
|
| --- a/runtime/vm/intermediate_language.h
|
| +++ b/runtime/vm/intermediate_language.h
|
| @@ -2812,6 +2812,10 @@ class InstanceCallInstr : public TemplateDefinition<0, Throws> {
|
| bool has_unique_selector() const { return has_unique_selector_; }
|
| void set_has_unique_selector(bool b) { has_unique_selector_ = b; }
|
|
|
| + virtual intptr_t CallCount() const {
|
| + return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
|
| + }
|
| +
|
| virtual bool ComputeCanDeoptimize() const { return true; }
|
|
|
| virtual Definition* Canonicalize(FlowGraph* flow_graph);
|
| @@ -2850,12 +2854,10 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
|
| public:
|
| PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call,
|
| const CallTargets& targets,
|
| - bool with_checks,
|
| bool complete)
|
| : TemplateDefinition(instance_call->deopt_id()),
|
| instance_call_(instance_call),
|
| targets_(targets),
|
| - with_checks_(with_checks),
|
| complete_(complete) {
|
| ASSERT(instance_call_ != NULL);
|
| ASSERT(targets.length() != 0);
|
| @@ -2863,8 +2865,6 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
|
| }
|
|
|
| InstanceCallInstr* instance_call() const { return instance_call_; }
|
| - bool with_checks() const { return with_checks_; }
|
| - void set_with_checks(bool b) { with_checks_ = b; }
|
| bool complete() const { return complete_; }
|
| virtual TokenPosition token_pos() const {
|
| return instance_call_->token_pos();
|
| @@ -2878,6 +2878,9 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
|
| virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
|
| return instance_call()->PushArgumentAt(index);
|
| }
|
| + const Array& argument_names() const {
|
| + return instance_call()->argument_names();
|
| + }
|
|
|
| bool HasOnlyDispatcherOrImplicitAccessorTargets() const;
|
|
|
| @@ -2914,7 +2917,6 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
|
| private:
|
| InstanceCallInstr* instance_call_;
|
| const CallTargets& targets_;
|
| - bool with_checks_;
|
| const bool complete_;
|
| intptr_t total_call_count_;
|
|
|
| @@ -3227,6 +3229,7 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
|
| const ZoneGrowableArray<const ICData*>& ic_data_array)
|
| : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
|
| ic_data_(NULL),
|
| + call_count_(0),
|
| token_pos_(token_pos),
|
| function_(function),
|
| argument_names_(argument_names),
|
| @@ -3244,9 +3247,11 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
|
| const Function& function,
|
| const Array& argument_names,
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments,
|
| - intptr_t deopt_id)
|
| + intptr_t deopt_id,
|
| + intptr_t call_count)
|
| : TemplateDefinition(deopt_id),
|
| ic_data_(NULL),
|
| + call_count_(call_count),
|
| token_pos_(token_pos),
|
| function_(function),
|
| argument_names_(argument_names),
|
| @@ -3259,6 +3264,22 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
|
| ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
|
| }
|
|
|
| + // Generate a replacement call instruction for an instance call which
|
| + // has been found to have only one target.
|
| + template <class C>
|
| + static StaticCallInstr* FromCall(Zone* zone,
|
| + const C* call,
|
| + const Function& target) {
|
| + ZoneGrowableArray<PushArgumentInstr*>* args =
|
| + new (zone) ZoneGrowableArray<PushArgumentInstr*>(call->ArgumentCount());
|
| + for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
|
| + args->Add(call->PushArgumentAt(i));
|
| + }
|
| + return new (zone)
|
| + StaticCallInstr(call->token_pos(), target, call->argument_names(), args,
|
| + call->deopt_id(), call->CallCount());
|
| + }
|
| +
|
| // ICData for static calls carries call count.
|
| const ICData* ic_data() const { return ic_data_; }
|
| bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); }
|
| @@ -3280,7 +3301,7 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
|
| }
|
|
|
| virtual intptr_t CallCount() const {
|
| - return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
|
| + return ic_data() == NULL ? call_count_ : ic_data()->AggregateCount();
|
| }
|
|
|
| virtual bool ComputeCanDeoptimize() const { return true; }
|
| @@ -3309,6 +3330,7 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
|
|
|
| private:
|
| const ICData* ic_data_;
|
| + const intptr_t call_count_;
|
| const TokenPosition token_pos_;
|
| const Function& function_;
|
| const Array& argument_names_;
|
|
|