Fix crashes in Smi equality comparisons: Smi equality instruction may have null as inputs. Null is treated specially in equality and therefore does not enter the ICdata, type feedback does not know about null being encountered.

TODO: fix excessive deoptimziation due to one of the inputs not being Smi.
(Crash was reproduced running test suite with optimization counter threshold 5)
Review URL: https://codereview.chromium.org//11049011

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@13149 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
srdjan@google.com 2012-10-02 22:52:39 +00:00
parent 46e5218fc7
commit 6388bd11c4
2 changed files with 4 additions and 16 deletions

View file

@ -574,12 +574,6 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
}
Immediate SmiConstantToImmediate(const Object& constant) {
ASSERT(constant.IsSmi());
return Immediate(reinterpret_cast<int32_t>(constant.raw()));
}
static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
const LocationSummary& locs,
Token::Kind kind,
@ -607,10 +601,10 @@ static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
}
if (left.IsConstant()) {
__ cmpl(right.reg(), SmiConstantToImmediate(left.constant()));
__ CompareObject(right.reg(), left.constant());
true_condition = FlowGraphCompiler::FlipCondition(true_condition);
} else if (right.IsConstant()) {
__ cmpl(left.reg(), SmiConstantToImmediate(right.constant()));
__ CompareObject(left.reg(), right.constant());
} else {
__ cmpl(left.reg(), right.reg());
}

View file

@ -573,12 +573,6 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
}
Immediate SmiConstantToImmediate(const Object& constant) {
ASSERT(constant.IsSmi());
return Immediate(reinterpret_cast<int64_t>(constant.raw()));
}
static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
const LocationSummary& locs,
Token::Kind kind,
@ -606,10 +600,10 @@ static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
}
if (left.IsConstant()) {
__ cmpq(right.reg(), SmiConstantToImmediate(left.constant()));
__ CompareObject(right.reg(), left.constant());
true_condition = FlowGraphCompiler::FlipCondition(true_condition);
} else if (right.IsConstant()) {
__ cmpq(left.reg(), SmiConstantToImmediate(right.constant()));
__ CompareObject(left.reg(), right.constant());
} else {
__ cmpq(left.reg(), right.reg());
}