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

Unified Diff: runtime/vm/flow_graph_optimizer.cc

Issue 10702195: Equality compare should record two arguments in IC data. INline double equality comparison. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 5 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_x64.h ('k') | runtime/vm/il_printer.cc » ('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 9640)
+++ runtime/vm/flow_graph_optimizer.cc (working copy)
@@ -238,39 +238,6 @@
}
-// Returns ICData with num_args_checked == 1. If necessary creates a new ICData
-// object that contains unique receiver class-ids
-static RawICData* ToUnaryClassChecks(const ICData& ic_data) {
- ASSERT(!ic_data.IsNull());
- ASSERT(ic_data.num_args_tested() != 0);
- if (ic_data.num_args_tested() == 1) return ic_data.raw();
- const intptr_t kNumArgsTested = 1;
- ICData& result = ICData::Handle(ICData::New(
- Function::Handle(ic_data.function()),
- String::Handle(ic_data.target_name()),
- ic_data.id(),
- kNumArgsTested));
- for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
- const intptr_t class_id = ic_data.GetReceiverClassIdAt(i);
- intptr_t duplicate_class_id = -1;
- for (intptr_t k = 0; k < result.NumberOfChecks(); k++) {
- if (class_id == result.GetReceiverClassIdAt(k)) {
- duplicate_class_id = k;
- break;
- }
- }
- if (duplicate_class_id >= 0) {
- ASSERT(result.GetTargetAt(duplicate_class_id) == ic_data.GetTargetAt(i));
- } else {
- // This will make sure that Smi is first if it exists.
- result.AddReceiverCheck(class_id,
- Function::Handle(ic_data.GetTargetAt(i)));
- }
- }
- return result.raw();
-}
-
-
// Only unique implicit instance getters can be currently handled.
bool FlowGraphOptimizer::TryInlineInstanceGetter(BindInstr* instr,
InstanceCallComp* comp) {
@@ -409,7 +376,7 @@
if (comp->ic_data()->NumberOfChecks() <= kMaxChecks) {
PolymorphicInstanceCallComp* call = new PolymorphicInstanceCallComp(comp);
ICData& unary_checks =
- ICData::ZoneHandle(ToUnaryClassChecks(*comp->ic_data()));
+ ICData::ZoneHandle(comp->ic_data()->AsUnaryClassChecks());
call->set_ic_data(&unary_checks);
instr->set_computation(call);
}
@@ -600,13 +567,18 @@
void FlowGraphOptimizer::VisitEqualityCompare(EqualityCompareComp* comp,
BindInstr* instr) {
- if (comp->HasICData()) {
- // Replace binary checks with unary ones since EmitNative expects it.
- ICData& unary_checks =
- ICData::Handle(ToUnaryClassChecks(*comp->ic_data()));
- comp->set_ic_data(&unary_checks);
+ if (comp->HasICData() && (comp->ic_data()->NumberOfChecks() == 1)) {
+ ASSERT(comp->ic_data()->num_args_tested() == 2);
+ GrowableArray<intptr_t> class_ids;
+ Function& target = Function::Handle();
+ comp->ic_data()->GetCheckAt(0, &class_ids, &target);
+ // TODO(srdjan): allow for mixed mode comparison.
+ if ((class_ids[0] == kSmi) && (class_ids[1] == kSmi)) {
+ comp->set_receiver_class_id(kSmi);
+ } else if ((class_ids[0] == kDouble) && (class_ids[1] == kDouble)) {
+ comp->set_receiver_class_id(kDouble);
+ }
}
-
TryFuseComparisonWithBranch(instr, comp);
}
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.h ('k') | runtime/vm/il_printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698