Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index a4d70faf9b5a513af6b9a315108e3234a4cefd57..afc5391dee3a08ef196808d8a90885897c4ba859 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -31,6 +31,9 @@ DEFINE_FLAG(bool, propagate_ic_data, true, |
"Propagate IC data from unoptimized to optimized IC calls."); |
DEFINE_FLAG(bool, two_args_smi_icd, true, |
"Generate special IC stubs for two args Smi operations"); |
+DEFINE_FLAG(bool, ic_range_profiling, true, |
+ "Generate special IC stubs collecting range information " |
+ "for binary and unary arithmetic operations"); |
DEFINE_FLAG(bool, unbox_numeric_fields, true, |
"Support unboxed double and float32x4 fields."); |
DECLARE_FLAG(bool, enable_type_checks); |
@@ -2886,12 +2889,25 @@ void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
ExternalLabel target_label(label_address); |
compiler->EmitInstanceCall(&target_label, *call_ic_data, ArgumentCount(), |
deopt_id(), token_pos(), locs()); |
+ } else if (FLAG_ic_range_profiling && |
+ (Token::IsBinaryArithmeticOperator(token_kind()) || |
+ Token::IsUnaryArithmeticOperator(token_kind()))) { |
+ ASSERT(Token::IsUnaryArithmeticOperator(token_kind()) == |
+ (ArgumentCount() == 1)); |
+ ASSERT(Token::IsBinaryArithmeticOperator(token_kind()) == |
+ (ArgumentCount() == 2)); |
+ StubCode* stub_code = isolate->stub_code(); |
+ ExternalLabel target_label((ArgumentCount() == 1) ? |
+ stub_code->UnaryRangeCollectingInlineCacheEntryPoint() : |
+ stub_code->BinaryRangeCollectingInlineCacheEntryPoint()); |
+ compiler->EmitInstanceCall(&target_label, *call_ic_data, ArgumentCount(), |
+ deopt_id(), token_pos(), locs()); |
} else { |
- compiler->GenerateInstanceCall(deopt_id(), |
- token_pos(), |
- ArgumentCount(), |
- locs(), |
- *call_ic_data); |
+ compiler->GenerateInstanceCall(deopt_id(), |
zra
2014/12/15 16:01:40
indentation
Vyacheslav Egorov (Google)
2014/12/15 17:20:05
Done.
|
+ token_pos(), |
+ ArgumentCount(), |
+ locs(), |
+ *call_ic_data); |
} |
} |
} |