Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index 38f3dac13ad19ef8d8aa9d6e194e403ce4163ee1..4f8af2b0c041f429b1992213a8f4d7571dd5bea4 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -774,6 +774,28 @@ void HBoundsCheck::PrintDataTo(StringStream* stream) { |
} |
+void HBoundsCheck::InferRepresentation(HInferRepresentation* h_infer) { |
+ ASSERT(CheckFlag(kFlexibleRepresentation)); |
+ Representation r; |
+ if (key_mode_ == DONT_ALLOW_SMI_KEY || |
+ !length()->representation().IsTagged()) { |
+ r = Representation::Integer32(); |
+ } else if (index()->representation().IsTagged() || |
+ (index()->IsConstant() && |
+ HConstant::cast(index())->HasInteger32Value() && |
+ Smi::IsValid(HConstant::cast(index())->Integer32Value()))) { |
+ // If the index is tagged, or a constant that holds a Smi, allow the length |
+ // to be tagged, since it is usually already tagged from loading it out of |
+ // the length field of a JSArray. This allows for direct comparison without |
+ // untagging. |
+ r = Representation::Tagged(); |
+ } else { |
+ r = Representation::Integer32(); |
+ } |
+ UpdateRepresentation(r, h_infer, "boundscheck"); |
+} |
+ |
+ |
void HCallConstantFunction::PrintDataTo(StringStream* stream) { |
if (IsApplyFunction()) { |
stream->Add("optimized apply "); |