Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index c923d2c2f787b16f3e0ec5674f5763731b7cede5..20f86bf5207341ffb1e03f52ff162e053dc16547 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -8808,6 +8808,12 @@ HValue* HOptimizedGraphBuilder::BuildArrayIndexOf(HValue* receiver, |
Push(graph()->GetConstantMinus1()); |
if (IsFastDoubleElementsKind(kind) || IsFastSmiElementsKind(kind)) { |
+ // Make sure that we can actually compare numbers correctly below, see |
+ // https://code.google.com/p/chromium/issues/detail?id=407946 for details. |
+ search_element = AddUncasted<HForceRepresentation>( |
+ search_element, IsFastSmiElementsKind(kind) ? Representation::Smi() |
+ : Representation::Double()); |
+ |
LoopBuilder loop(this, context(), direction); |
{ |
HValue* index = loop.BeginBody(initial, terminating, token); |
@@ -8815,12 +8821,8 @@ HValue* HOptimizedGraphBuilder::BuildArrayIndexOf(HValue* receiver, |
elements, index, static_cast<HValue*>(NULL), |
kind, ALLOW_RETURN_HOLE); |
IfBuilder if_issame(this); |
- if (IsFastDoubleElementsKind(kind)) { |
- if_issame.If<HCompareNumericAndBranch>( |
- element, search_element, Token::EQ_STRICT); |
- } else { |
- if_issame.If<HCompareObjectEqAndBranch>(element, search_element); |
- } |
+ if_issame.If<HCompareNumericAndBranch>(element, search_element, |
+ Token::EQ_STRICT); |
if_issame.Then(); |
{ |
Drop(1); |