Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 1513883002: Polymorphic calls in precompilation invoke megamorphic calls when tests fail (instead of deoptimizi… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: g Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_optimizer.cc
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 15642fc572354989384a57e0bbdda11ce3c1d502..99db09d03cc9bb36384c2ec937be9e3cfbf365fc 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -28,7 +28,7 @@ namespace dart {
DEFINE_FLAG(int, getter_setter_ratio, 13,
"Ratio of getter/setter usage used for double field unboxing heuristics");
-DEFINE_FLAG(bool, guess_other_cid, true,
+DEFINE_FLAG(bool, guess_icdata_cid, true,
"Artificially create type feedback for arithmetic etc. operations"
" by guessing the other unknown argument cid");
DEFINE_FLAG(bool, load_cse, true, "Use redundant load elimination.");
@@ -196,7 +196,7 @@ bool FlowGraphOptimizer::TryCreateICData(InstanceCallInstr* call) {
Token::IsBinaryOperator(op_kind)) {
// Guess cid: if one of the inputs is a number assume that the other
// is a number of same type.
- if (FLAG_guess_other_cid) {
+ if (FLAG_guess_icdata_cid) {
const intptr_t cid_0 = class_ids[0];
const intptr_t cid_1 = class_ids[1];
if ((cid_0 == kDynamicCid) && (IsNumberCid(cid_1))) {
@@ -254,9 +254,31 @@ bool FlowGraphOptimizer::TryCreateICData(InstanceCallInstr* call) {
return true;
}
+ if (Compiler::always_optimize() &&
+ (isolate()->object_store()->unique_dynamic_targets() != Array::null())) {
+ // Check if the target is unique.
+ Function& target_function = Function::Handle(Z);
+ Precompiler::GetUniqueDynamicTarget(
+ isolate(), call->function_name(), &target_function);
+ // Calls with named arguments must be resolved/checked at runtime.
+ String& error_message = String::Handle(Z);
+ if (!target_function.IsNull() &&
+ !target_function.HasOptionalNamedParameters() &&
+ target_function.AreValidArgumentCounts(call->ArgumentCount(), 0,
+ &error_message)) {
+ const intptr_t cid = Class::Handle(Z, target_function.Owner()).id();
+ const ICData& ic_data = ICData::ZoneHandle(Z,
+ ICData::NewFrom(*call->ic_data(), 1));
+ ic_data.AddReceiverCheck(cid, target_function);
+ call->set_ic_data(&ic_data);
+ return true;
+ }
+ }
+
// Check if getter or setter in function's class and class is currently leaf.
- if ((call->token_kind() == Token::kGET) ||
- (call->token_kind() == Token::kSET)) {
+ if (FLAG_guess_icdata_cid &&
+ ((call->token_kind() == Token::kGET) ||
+ (call->token_kind() == Token::kSET))) {
const Class& owner_class = Class::Handle(Z, function().Owner());
if (!owner_class.is_abstract() &&
!CHA::HasSubclasses(owner_class) &&
@@ -279,27 +301,6 @@ bool FlowGraphOptimizer::TryCreateICData(InstanceCallInstr* call) {
}
}
- if (FLAG_precompilation &&
- (isolate()->object_store()->unique_dynamic_targets() != Array::null())) {
- // Check if the target is unique.
- Function& target_function = Function::Handle(Z);
- Precompiler::GetUniqueDynamicTarget(
- isolate(), call->function_name(), &target_function);
- // Calls with named arguments must be resolved/checked at runtime.
- String& error_message = String::Handle(Z);
- if (!target_function.IsNull() &&
- !target_function.HasOptionalNamedParameters() &&
- target_function.AreValidArgumentCounts(call->ArgumentCount(), 0,
- &error_message)) {
- const intptr_t cid = Class::Handle(Z, target_function.Owner()).id();
- const ICData& ic_data = ICData::ZoneHandle(Z,
- ICData::NewFrom(*call->ic_data(), 1));
- ic_data.AddReceiverCheck(cid, target_function);
- call->set_ic_data(&ic_data);
- return true;
- }
- }
-
return false;
}
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698