Index: runtime/vm/flow_graph_optimizer.cc |
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc |
index cf0713209c5d4b6470c2fe36045c277ed1c821e7..044554e7131e1e3df94d08529b09e83229b9d2aa 100644 |
--- a/runtime/vm/flow_graph_optimizer.cc |
+++ b/runtime/vm/flow_graph_optimizer.cc |
@@ -51,6 +51,7 @@ DEFINE_FLAG(bool, trace_smi_widening, false, "Trace Smi->Int32 widening pass."); |
DECLARE_FLAG(bool, polymorphic_with_deopt); |
DECLARE_FLAG(bool, source_lines); |
+DECLARE_FLAG(bool, trace_cha); |
DECLARE_FLAG(bool, trace_field_guards); |
DECLARE_FLAG(bool, trace_type_check_elimination); |
DECLARE_FLAG(bool, warn_on_javascript_compatibility); |
@@ -2335,6 +2336,11 @@ bool FlowGraphOptimizer::InstanceCallNeedsClassCheck( |
: call->function_name(); |
const Class& cls = Class::Handle(Z, function.Owner()); |
if (!thread()->cha()->HasOverride(cls, name)) { |
+ if (FLAG_trace_cha) { |
+ ISL_Print(" **(CHA) Instance call needs no check, " |
+ "no overrides of '%s' '%s'\n", |
+ name.ToCString(), cls.ToCString()); |
+ } |
thread()->cha()->AddToLeafClasses(cls); |
return false; |
} |
@@ -4029,6 +4035,11 @@ bool FlowGraphOptimizer::TypeCheckAsClassEquality(const AbstractType& type) { |
// Private classes cannot be subclassed by later loaded libs. |
if (!type_class.IsPrivate()) { |
if (FLAG_use_cha_deopt) { |
+ if (FLAG_trace_cha) { |
+ ISL_Print(" **(CHA) Typecheck as class equality since no " |
+ "subclasses: %s\n", |
+ type_class.ToCString()); |
+ } |
thread()->cha()->AddToLeafClasses(type_class); |
} else { |
return false; |