From 6388bd11c41c030735260d15da480200a8cfa66d Mon Sep 17 00:00:00 2001 From: "srdjan@google.com" Date: Tue, 2 Oct 2012 22:52:39 +0000 Subject: [PATCH] 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 --- runtime/vm/intermediate_language_ia32.cc | 10 ++-------- runtime/vm/intermediate_language_x64.cc | 10 ++-------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc index 16c8b803b7e..48ad527956e 100644 --- a/runtime/vm/intermediate_language_ia32.cc +++ b/runtime/vm/intermediate_language_ia32.cc @@ -574,12 +574,6 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler, } -Immediate SmiConstantToImmediate(const Object& constant) { - ASSERT(constant.IsSmi()); - return Immediate(reinterpret_cast(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()); } diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc index b31050bf7ca..cc75f1feef7 100644 --- a/runtime/vm/intermediate_language_x64.cc +++ b/runtime/vm/intermediate_language_x64.cc @@ -573,12 +573,6 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler, } -Immediate SmiConstantToImmediate(const Object& constant) { - ASSERT(constant.IsSmi()); - return Immediate(reinterpret_cast(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()); }