Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: src/hydrogen.cc

Issue 8747009: Optimize Crankshaft array literal initialization from boilerplate. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: merge with latest Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3437 matching lines...) Expand 10 before | Expand all | Expand 10 after
3448 3448
3449 3449
3450 void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { 3450 void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
3451 ASSERT(!HasStackOverflow()); 3451 ASSERT(!HasStackOverflow());
3452 ASSERT(current_block() != NULL); 3452 ASSERT(current_block() != NULL);
3453 ASSERT(current_block()->HasPredecessor()); 3453 ASSERT(current_block()->HasPredecessor());
3454 ZoneList<Expression*>* subexprs = expr->values(); 3454 ZoneList<Expression*>* subexprs = expr->values();
3455 int length = subexprs->length(); 3455 int length = subexprs->length();
3456 HValue* context = environment()->LookupContext(); 3456 HValue* context = environment()->LookupContext();
3457 3457
3458 HArrayLiteral* literal = new(zone()) HArrayLiteral(context, 3458 FixedArray* literals = environment()->closure()->literals();
3459 expr->constant_elements(), 3459 Handle<Object> raw_boilerplate(literals->get(expr->literal_index()));
3460 length, 3460
3461 expr->literal_index(), 3461 // For now, no boilerplate causes a deopt.
3462 expr->depth()); 3462 if (raw_boilerplate->IsUndefined()) {
3463 AddInstruction(new(zone()) HSoftDeoptimize);
3464 return ast_context()->ReturnValue(graph()->GetConstantUndefined());
3465 }
3466
3467 Handle<JSObject> boilerplate(Handle<JSObject>::cast(raw_boilerplate));
3468 ElementsKind boilerplate_elements_kind = boilerplate->GetElementsKind();
3469
3470 HArrayLiteral* literal = new(zone()) HArrayLiteral(
3471 context,
3472 boilerplate,
3473 length,
3474 expr->literal_index(),
3475 expr->depth());
3476
3463 // The array is expected in the bailout environment during computation 3477 // The array is expected in the bailout environment during computation
3464 // of the property values and is the value of the entire expression. 3478 // of the property values and is the value of the entire expression.
3465 PushAndAdd(literal); 3479 PushAndAdd(literal);
3466 3480
3467 HLoadElements* elements = NULL; 3481 HLoadElements* elements = NULL;
3468 3482
3469 for (int i = 0; i < length; i++) { 3483 for (int i = 0; i < length; i++) {
3470 Expression* subexpr = subexprs->at(i); 3484 Expression* subexpr = subexprs->at(i);
3471 // If the subexpression is a literal or a simple materialized literal it 3485 // If the subexpression is a literal or a simple materialized literal it
3472 // is already set in the cloned array. 3486 // is already set in the cloned array.
3473 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; 3487 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue;
3474 3488
3475 CHECK_ALIVE(VisitForValue(subexpr)); 3489 CHECK_ALIVE(VisitForValue(subexpr));
3476 HValue* value = Pop(); 3490 HValue* value = Pop();
3477 if (!Smi::IsValid(i)) return Bailout("Non-smi key in array literal"); 3491 if (!Smi::IsValid(i)) return Bailout("Non-smi key in array literal");
3478 3492
3479 elements = new(zone()) HLoadElements(literal); 3493 elements = new(zone()) HLoadElements(literal);
3480 AddInstruction(elements); 3494 AddInstruction(elements);
3481 3495
3482 HValue* key = AddInstruction( 3496 HValue* key = AddInstruction(
3483 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)), 3497 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)),
3484 Representation::Integer32())); 3498 Representation::Integer32()));
3485 HInstruction* elements_kind =
3486 AddInstruction(new(zone()) HElementsKind(literal));
3487 HBasicBlock* store_fast = graph()->CreateBasicBlock();
3488 // Two empty blocks to satisfy edge split form.
3489 HBasicBlock* store_fast_edgesplit1 = graph()->CreateBasicBlock();
3490 HBasicBlock* store_fast_edgesplit2 = graph()->CreateBasicBlock();
3491 HBasicBlock* store_generic = graph()->CreateBasicBlock();
3492 HBasicBlock* check_smi_only_elements = graph()->CreateBasicBlock();
3493 HBasicBlock* join = graph()->CreateBasicBlock();
3494 3499
3495 HIsSmiAndBranch* smicheck = new(zone()) HIsSmiAndBranch(value); 3500 switch (boilerplate_elements_kind) {
3496 smicheck->SetSuccessorAt(0, store_fast_edgesplit1); 3501 case FAST_SMI_ONLY_ELEMENTS:
3497 smicheck->SetSuccessorAt(1, check_smi_only_elements); 3502 case FAST_ELEMENTS:
3498 current_block()->Finish(smicheck); 3503 AddInstruction(new(zone()) HStoreKeyedFastElement(
3499 store_fast_edgesplit1->Finish(new(zone()) HGoto(store_fast)); 3504 elements,
3500 3505 key,
3501 set_current_block(check_smi_only_elements); 3506 value,
3502 HCompareConstantEqAndBranch* smi_elements_check = 3507 boilerplate_elements_kind));
3503 new(zone()) HCompareConstantEqAndBranch(elements_kind, 3508 break;
3504 FAST_ELEMENTS, 3509 case FAST_DOUBLE_ELEMENTS:
3505 Token::EQ_STRICT); 3510 AddInstruction(new(zone()) HStoreKeyedFastDoubleElement(elements,
3506 smi_elements_check->SetSuccessorAt(0, store_fast_edgesplit2); 3511 key,
3507 smi_elements_check->SetSuccessorAt(1, store_generic); 3512 value));
3508 current_block()->Finish(smi_elements_check); 3513 break;
3509 store_fast_edgesplit2->Finish(new(zone()) HGoto(store_fast)); 3514 default:
3510 3515 UNREACHABLE();
3511 set_current_block(store_fast); 3516 break;
3512 AddInstruction(new(zone()) HStoreKeyedFastElement(elements, key, value)); 3517 }
3513 store_fast->Goto(join);
3514
3515 set_current_block(store_generic);
3516 AddInstruction(BuildStoreKeyedGeneric(literal, key, value));
3517 store_generic->Goto(join);
3518
3519 join->SetJoinId(expr->id());
3520 set_current_block(join);
3521 3518
3522 AddSimulate(expr->GetIdForElement(i)); 3519 AddSimulate(expr->GetIdForElement(i));
3523 } 3520 }
3524 return ast_context()->ReturnValue(Pop()); 3521 return ast_context()->ReturnValue(Pop());
3525 } 3522 }
3526 3523
3527 3524
3528 // Sets the lookup result and returns true if the store can be inlined. 3525 // Sets the lookup result and returns true if the store can be inlined.
3529 static bool ComputeStoredField(Handle<Map> type, 3526 static bool ComputeStoredField(Handle<Map> type,
3530 Handle<String> name, 3527 Handle<String> name,
(...skipping 3691 matching lines...) Expand 10 before | Expand all | Expand 10 after
7222 } 7219 }
7223 } 7220 }
7224 7221
7225 #ifdef DEBUG 7222 #ifdef DEBUG
7226 if (graph_ != NULL) graph_->Verify(false); // No full verify. 7223 if (graph_ != NULL) graph_->Verify(false); // No full verify.
7227 if (allocator_ != NULL) allocator_->Verify(); 7224 if (allocator_ != NULL) allocator_->Verify();
7228 #endif 7225 #endif
7229 } 7226 }
7230 7227
7231 } } // namespace v8::internal 7228 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698