Index: runtime/vm/flow_graph_optimizer.cc |
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc |
index 9240358c6b9ebb9bc7224bc442041e349605fe5d..b3ec3f0aea14fa09af86956c3a375a70a3e6c2ef 100644 |
--- a/runtime/vm/flow_graph_optimizer.cc |
+++ b/runtime/vm/flow_graph_optimizer.cc |
@@ -4202,6 +4202,13 @@ void FlowGraphOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) { |
} |
+bool FlowGraphOptimizer::IsBlackListed(intptr_t deopt_id) { |
srdjan
2015/11/17 17:35:23
s/deopt_id/call_deopt_id/ makes it clearer IMO.
srdjan
2015/11/17 17:35:23
s/IsBlackListed/ IsBlackListedForInlining/
Florian Schneider
2015/11/17 19:38:56
Done.
Florian Schneider
2015/11/17 19:38:56
Done.
|
+ for (intptr_t i = 0; i < inlining_black_list_->length(); ++i) { |
+ if ((*inlining_black_list_)[i] == deopt_id) return true; |
+ } |
+ return false; |
+} |
+ |
// Special optimizations when running in --noopt mode. |
void FlowGraphOptimizer::InstanceCallNoopt(InstanceCallInstr* instr) { |
// TODO(srdjan): Investigate other attempts, as they are not allowed to |
@@ -4230,6 +4237,34 @@ void FlowGraphOptimizer::InstanceCallNoopt(InstanceCallInstr* instr) { |
return; |
} |
+ if (use_speculative_inlining_ && |
+ !IsBlackListed(instr->deopt_id()) && |
+ unary_checks.NumberOfChecks() > 0) { |
srdjan
2015/11/17 17:35:23
Add parentheses
Florian Schneider
2015/11/17 19:38:56
Done.
|
+ if ((op_kind == Token::kINDEX) && TryReplaceWithIndexedOp(instr)) { |
+ return; |
+ } |
+ if ((op_kind == Token::kASSIGN_INDEX) && TryReplaceWithIndexedOp(instr)) { |
+ return; |
+ } |
+ if (op_kind == Token::kEQ && TryReplaceWithEqualityOp(instr, op_kind)) { |
srdjan
2015/11/17 17:35:23
Add parentheses
Florian Schneider
2015/11/17 19:38:56
Done.
|
+ return; |
+ } |
+ |
+ if (Token::IsRelationalOperator(op_kind) && |
+ TryReplaceWithRelationalOp(instr, op_kind)) { |
+ return; |
+ } |
+ |
+ if (Token::IsBinaryOperator(op_kind) && |
+ TryReplaceWithBinaryOp(instr, op_kind)) { |
+ return; |
+ } |
+ if (Token::IsUnaryOperator(op_kind) && |
+ TryReplaceWithUnaryOp(instr, op_kind)) { |
+ return; |
+ } |
+ } |
+ |
bool has_one_target = |
(unary_checks.NumberOfChecks() > 0) && unary_checks.HasOneTarget(); |
if (has_one_target) { |
@@ -5176,7 +5211,8 @@ static bool IsLoopInvariantLoad(ZoneGrowableArray<BitVector*>* sets, |
void LICM::OptimisticallySpecializeSmiPhis() { |
- if (!flow_graph()->function().allows_hoisting_check_class()) { |
+ if (!flow_graph()->function().allows_hoisting_check_class() || |
+ Compiler::always_optimize()) { |
srdjan
2015/11/17 17:35:23
Add comment why not do it for precompilation.
Florian Schneider
2015/11/17 19:38:56
Done.
|
// Do not hoist any. |
return; |
} |