mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 04:28:05 +00:00
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:
parent
46e5218fc7
commit
6388bd11c4
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue