Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index dff96b4f7b488b89f030eca4540b8ea7c5d41846..d73eb07c98ca39c286ffb916fd81357b850ad539 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -3264,7 +3264,7 @@ void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| // Load the elements array before the first store. |
| if (elements == NULL) { |
| - elements = new(zone()) HLoadElements(literal); |
| + elements = new(zone()) HLoadElements(literal, literal); |
|
Kevin Millikin (Chromium)
2011/07/11 15:03:54
The second occurrence of literal is used as a toke
Jakob Kummerow
2011/07/19 14:55:44
Obsolete (I undid the changes to HLoadElements).
|
| AddInstruction(elements); |
| } |
| @@ -3895,8 +3895,8 @@ HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, |
| : BuildLoadKeyedGeneric(object, key); |
| } |
| AddInstruction(new(zone()) HCheckNonSmi(object)); |
| - AddInstruction(new(zone()) HCheckMap(object, map)); |
| - HInstruction* elements = new(zone()) HLoadElements(object); |
| + HInstruction* mapcheck = AddInstruction(new(zone()) HCheckMap(object, map)); |
| + HInstruction* elements = new(zone()) HLoadElements(object, mapcheck); |
| HInstruction* length = NULL; |
| HInstruction* checked_key = NULL; |
| if (map->has_external_array_elements()) { |
| @@ -3911,7 +3911,7 @@ HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, |
| } |
| ASSERT(map->has_fast_elements()); |
| if (map->instance_type() == JS_ARRAY_TYPE) { |
| - length = AddInstruction(new(zone()) HJSArrayLength(object)); |
| + length = AddInstruction(new(zone()) HJSArrayLength(object, mapcheck)); |
| checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
| AddInstruction(elements); |
| } else { |
| @@ -3962,6 +3962,7 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| HInstruction* elements_kind_instr = |
| AddInstruction(new(zone()) HElementsKind(object)); |
| + HCompareConstantEqAndBranch* elements_kind_branch = NULL; |
| HInstruction* elements = NULL; |
| HLoadExternalArrayPointer* external_elements = NULL; |
| HInstruction* checked_key = NULL; |
| @@ -3978,14 +3979,8 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| JSObject::LAST_ELEMENTS_KIND); |
| if (elements_kind == JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND |
| && todo_external_array) { |
| - elements = AddInstruction(new(zone()) HLoadElements(object)); |
| - // We need to forcibly prevent some ElementsKind-dependent instructions |
| - // from being hoisted out of any loops they might occur in, because |
| - // the current loop-invariant-code-motion algorithm isn't clever enough |
| - // to deal with them properly. |
| - // There's some performance to be gained by developing a smarter |
| - // solution for this. |
| - elements->ClearFlag(HValue::kUseGVN); |
| + elements = AddInstruction( |
| + new(zone()) HLoadElements(object, elements_kind_branch)); |
|
Kevin Millikin (Chromium)
2011/07/11 15:03:54
Should we assert the check instruction is not NULL
Jakob Kummerow
2011/07/19 14:55:44
Good catch! Depending on the JS code being execute
|
| HInstruction* length = |
| AddInstruction(new(zone()) HExternalArrayLength(elements)); |
| checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
| @@ -3995,13 +3990,11 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| if (type_todo[elements_kind]) { |
| HBasicBlock* if_true = graph()->CreateBasicBlock(); |
| HBasicBlock* if_false = graph()->CreateBasicBlock(); |
| - HCompareConstantEqAndBranch* compare = |
| - new(zone()) HCompareConstantEqAndBranch(elements_kind_instr, |
| - elements_kind, |
| - Token::EQ_STRICT); |
| - compare->SetSuccessorAt(0, if_true); |
| - compare->SetSuccessorAt(1, if_false); |
| - current_block()->Finish(compare); |
| + elements_kind_branch = new(zone()) HCompareConstantEqAndBranch( |
| + elements_kind_instr, elements_kind, Token::EQ_STRICT); |
| + elements_kind_branch->SetSuccessorAt(0, if_true); |
| + elements_kind_branch->SetSuccessorAt(1, if_false); |
| + current_block()->Finish(elements_kind_branch); |
| set_current_block(if_true); |
| HInstruction* access; |
| @@ -4015,12 +4008,11 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| current_block()->Finish(typecheck); |
| set_current_block(if_jsarray); |
| - HInstruction* length = new(zone()) HJSArrayLength(object); |
| + HInstruction* length = new(zone()) HJSArrayLength(object, typecheck); |
| AddInstruction(length); |
| - length->ClearFlag(HValue::kUseGVN); |
| checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
| - elements = AddInstruction(new(zone()) HLoadElements(object)); |
| - elements->ClearFlag(HValue::kUseGVN); |
| + elements = |
| + AddInstruction(new(zone()) HLoadElements(object, checked_key)); |
| if (is_store) { |
| access = AddInstruction( |
| new(zone()) HStoreKeyedFastElement(elements, checked_key, val)); |
| @@ -4036,8 +4028,7 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| if_jsarray->Goto(join); |
| set_current_block(if_fastobject); |
| - elements = AddInstruction(new(zone()) HLoadElements(object)); |
| - elements->ClearFlag(HValue::kUseGVN); |
| + elements = AddInstruction(new(zone()) HLoadElements(object, typecheck)); |
| length = AddInstruction(new(zone()) HFixedArrayLength(elements)); |
| checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
| if (is_store) { |
| @@ -4170,8 +4161,9 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
| if (expr->IsArrayLength()) { |
| HValue* array = Pop(); |
| AddInstruction(new(zone()) HCheckNonSmi(array)); |
| - AddInstruction(HCheckInstanceType::NewIsJSArray(array)); |
| - instr = new(zone()) HJSArrayLength(array); |
| + HInstruction* mapcheck = |
| + AddInstruction(HCheckInstanceType::NewIsJSArray(array)); |
| + instr = new(zone()) HJSArrayLength(array, mapcheck); |
| } else if (expr->IsStringLength()) { |
| HValue* string = Pop(); |