Only infer int32 in HBoundsCheck if input is double or int32.

R=jkummerow@chromium.org, mmassi@chromium.org

Review URL: https://chromiumcodereview.appspot.com/17057004

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15156 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
verwaest@chromium.org 2013-06-14 14:14:07 +00:00
parent 84759d7e6e
commit 41c63d8899

View File

@ -1151,19 +1151,14 @@ void HBoundsCheck::PrintDataTo(StringStream* stream) {
void HBoundsCheck::InferRepresentation(HInferRepresentation* h_infer) {
ASSERT(CheckFlag(kFlexibleRepresentation));
Representation r;
HValue* actual_index = index()->ActualValue();
HValue* actual_length = length()->ActualValue();
Representation index_rep = actual_index->representation();
if (!actual_length->representation().IsSmiOrTagged()) {
r = Representation::Integer32();
} else if ((index_rep.IsTagged() && actual_index->type().IsSmi()) ||
index_rep.IsSmi()) {
// If the index is smi, allow the length to be smi, since it is usually
// already smi from loading it out of the length field of a JSArray. This
// allows for direct comparison without untagging.
r = Representation::Smi();
} else {
Representation length_rep = actual_length->representation();
if (index_rep.IsTagged()) index_rep = Representation::Smi();
if (length_rep.IsTagged()) length_rep = Representation::Smi();
Representation r = index_rep.generalize(length_rep);
if (r.is_more_general_than(Representation::Integer32())) {
r = Representation::Integer32();
}
UpdateRepresentation(r, h_infer, "boundscheck");