Commit 8afeaabe authored by verwaest@chromium.org's avatar verwaest@chromium.org

Allow boundscheck elimination to work on Smi keys.

R=jkummerow@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15001 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b3282c29
...@@ -1058,6 +1058,7 @@ void HBoundsCheck::ApplyIndexChange() { ...@@ -1058,6 +1058,7 @@ void HBoundsCheck::ApplyIndexChange() {
block()->graph()->GetInvalidContext(), current_index, add_offset); block()->graph()->GetInvalidContext(), current_index, add_offset);
add->InsertBefore(this); add->InsertBefore(this);
add->AssumeRepresentation(index()->representation()); add->AssumeRepresentation(index()->representation());
add->ClearFlag(kCanOverflow);
current_index = add; current_index = add;
} }
......
...@@ -3660,9 +3660,6 @@ class HBoundsCheck: public HTemplateInstruction<2> { ...@@ -3660,9 +3660,6 @@ class HBoundsCheck: public HTemplateInstruction<2> {
virtual Representation RequiredInputRepresentation(int arg_index) { virtual Representation RequiredInputRepresentation(int arg_index) {
return representation(); return representation();
} }
virtual Representation observed_input_representation(int index) {
return Representation::Integer32();
}
virtual bool IsRelationTrueInternal(NumericRelation relation, virtual bool IsRelationTrueInternal(NumericRelation relation,
HValue* related_value, HValue* related_value,
......
...@@ -4115,7 +4115,7 @@ class BoundsCheckKey : public ZoneObject { ...@@ -4115,7 +4115,7 @@ class BoundsCheckKey : public ZoneObject {
static BoundsCheckKey* Create(Zone* zone, static BoundsCheckKey* Create(Zone* zone,
HBoundsCheck* check, HBoundsCheck* check,
int32_t* offset) { int32_t* offset) {
if (!check->index()->representation().IsInteger32()) return NULL; if (!check->index()->representation().IsSmiOrInteger32()) return NULL;
HValue* index_base = NULL; HValue* index_base = NULL;
HConstant* constant = NULL; HConstant* constant = NULL;
...@@ -4211,7 +4211,7 @@ class BoundsCheckBbData: public ZoneObject { ...@@ -4211,7 +4211,7 @@ class BoundsCheckBbData: public ZoneObject {
// returns false, otherwise it returns true. // returns false, otherwise it returns true.
bool CoverCheck(HBoundsCheck* new_check, bool CoverCheck(HBoundsCheck* new_check,
int32_t new_offset) { int32_t new_offset) {
ASSERT(new_check->index()->representation().IsInteger32()); ASSERT(new_check->index()->representation().IsSmiOrInteger32());
bool keep_new_check = false; bool keep_new_check = false;
if (new_offset > upper_offset_) { if (new_offset > upper_offset_) {
...@@ -4320,8 +4320,8 @@ class BoundsCheckBbData: public ZoneObject { ...@@ -4320,8 +4320,8 @@ class BoundsCheckBbData: public ZoneObject {
HValue* index_context = IndexContext(*add, check); HValue* index_context = IndexContext(*add, check);
if (index_context == NULL) return false; if (index_context == NULL) return false;
HConstant* new_constant = new(BasicBlock()->zone()) HConstant* new_constant = new(BasicBlock()->zone()) HConstant(
HConstant(new_offset, Representation::Integer32()); new_offset, representation);
if (*add == NULL) { if (*add == NULL) {
new_constant->InsertBefore(check); new_constant->InsertBefore(check);
(*add) = HAdd::New( (*add) = HAdd::New(
...@@ -4453,7 +4453,7 @@ void HGraph::EliminateRedundantBoundsChecks() { ...@@ -4453,7 +4453,7 @@ void HGraph::EliminateRedundantBoundsChecks() {
static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) { static void DehoistArrayIndex(ArrayInstructionInterface* array_operation) {
HValue* index = array_operation->GetKey()->ActualValue(); HValue* index = array_operation->GetKey()->ActualValue();
if (!index->representation().IsInteger32()) return; if (!index->representation().IsSmiOrInteger32()) return;
HConstant* constant; HConstant* constant;
HValue* subexpression; HValue* subexpression;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment