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

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 10910224: Using type feedback, eliminate store barriers for indexed stores. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 months 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.cc ('k') | runtime/vm/intermediate_language.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_optimizer.cc
===================================================================
--- runtime/vm/flow_graph_optimizer.cc (revision 12265)
+++ runtime/vm/flow_graph_optimizer.cc (working copy)
@@ -327,6 +327,19 @@
}
+static bool ArgIsAlwaysSmi(const ICData& ic_data, intptr_t arg_n) {
+ ASSERT(ic_data.num_args_tested() > arg_n);
+ if (ic_data.NumberOfChecks() == 0) return false;
+ GrowableArray<intptr_t> class_ids;
+ Function& target = Function::Handle();
+ for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
+ ic_data.GetCheckAt(i, &class_ids, &target);
+ if (class_ids[arg_n] != kSmiCid) return false;
+ }
+ return true;
+}
+
+
bool FlowGraphOptimizer::TryReplaceWithArrayOp(InstanceCallInstr* call,
Token::Kind op_kind) {
// TODO(fschneider): Optimize []= operator in checked mode as well.
@@ -372,8 +385,18 @@
if (op_kind == Token::kINDEX) {
array_op = new LoadIndexedInstr(array, index);
} else {
+ bool needs_store_barrier = true;
+ if (ArgIsAlwaysSmi(*call->ic_data(), 2)) {
+ InsertBefore(call,
+ new CheckSmiInstr(call->ArgumentAt(2)->value()->Copy(),
+ call->deopt_id()),
+ call->env(),
+ Definition::kEffect);
+ needs_store_barrier = false;
+ }
Value* value = call->ArgumentAt(2)->value();
- array_op = new StoreIndexedInstr(array, index, value);
+ array_op =
+ new StoreIndexedInstr(array, index, value, needs_store_barrier);
}
call->ReplaceWith(array_op, current_iterator());
RemovePushArguments(call);
@@ -810,19 +833,6 @@
}
-static bool ArgIsAlwaysSmi(const ICData& ic_data, intptr_t arg_n) {
- ASSERT(ic_data.num_args_tested() > arg_n);
- if (ic_data.NumberOfChecks() == 0) return false;
- GrowableArray<intptr_t> class_ids;
- Function& target = Function::Handle();
- for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- ic_data.GetCheckAt(i, &class_ids, &target);
- if (class_ids[arg_n] != kSmiCid) return false;
- }
- return true;
-}
-
-
bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr) {
if (FLAG_enable_type_checks) {
// TODO(srdjan): Add assignable check node if --enable_type_checks.
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/intermediate_language.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698