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

Side by Side Diff: src/hydrogen.cc

Issue 5961016: Optimize array-length and fast element loads.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 11 months 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 3625 matching lines...) Expand 10 before | Expand all | Expand 10 after
3636 3636
3637 3637
3638 HInstruction* HGraphBuilder::BuildLoadKeyedFastElement(HValue* object, 3638 HInstruction* HGraphBuilder::BuildLoadKeyedFastElement(HValue* object,
3639 HValue* key, 3639 HValue* key,
3640 Property* expr) { 3640 Property* expr) {
3641 ASSERT(!expr->key()->IsPropertyName() && expr->IsMonomorphic()); 3641 ASSERT(!expr->key()->IsPropertyName() && expr->IsMonomorphic());
3642 AddInstruction(new HCheckNonSmi(object)); 3642 AddInstruction(new HCheckNonSmi(object));
3643 Handle<Map> map = expr->GetMonomorphicReceiverType(); 3643 Handle<Map> map = expr->GetMonomorphicReceiverType();
3644 ASSERT(map->has_fast_elements()); 3644 ASSERT(map->has_fast_elements());
3645 AddInstruction(new HCheckMap(object, map)); 3645 AddInstruction(new HCheckMap(object, map));
3646 HInstruction* elements = AddInstruction(new HLoadElements(object)); 3646 bool is_array = (map->instance_type() == JS_ARRAY_TYPE);
3647 HInstruction* length = AddInstruction(new HArrayLength(elements)); 3647 HLoadElements* elements = new HLoadElements(object);
3648 AddInstruction(new HBoundsCheck(key, length)); 3648 HInstruction* length = NULL;
3649 if (is_array) {
3650 length = AddInstruction(new HJSArrayLength(object));
3651 AddInstruction(new HBoundsCheck(key, length));
3652 AddInstruction(elements);
3653 } else {
3654 AddInstruction(elements);
3655 length = AddInstruction(new HFixedArrayLength(elements));
3656 AddInstruction(new HBoundsCheck(key, length));
3657 }
3649 return new HLoadKeyedFastElement(elements, key); 3658 return new HLoadKeyedFastElement(elements, key);
3650 } 3659 }
3651 3660
3652 3661
3653 HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, 3662 HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object,
3654 HValue* key, 3663 HValue* key,
3655 HValue* value) { 3664 HValue* value) {
3656 return new HStoreKeyedGeneric(object, key, value); 3665 return new HStoreKeyedGeneric(object, key, value);
3657 } 3666 }
3658 3667
3659 3668
3660 HInstruction* HGraphBuilder::BuildStoreKeyedFastElement(HValue* object, 3669 HInstruction* HGraphBuilder::BuildStoreKeyedFastElement(HValue* object,
3661 HValue* key, 3670 HValue* key,
3662 HValue* val, 3671 HValue* val,
3663 Expression* expr) { 3672 Expression* expr) {
3664 ASSERT(expr->IsMonomorphic()); 3673 ASSERT(expr->IsMonomorphic());
3665 AddInstruction(new HCheckNonSmi(object)); 3674 AddInstruction(new HCheckNonSmi(object));
3666 Handle<Map> map = expr->GetMonomorphicReceiverType(); 3675 Handle<Map> map = expr->GetMonomorphicReceiverType();
3667 ASSERT(map->has_fast_elements()); 3676 ASSERT(map->has_fast_elements());
3668 AddInstruction(new HCheckMap(object, map)); 3677 AddInstruction(new HCheckMap(object, map));
3669 HInstruction* elements = AddInstruction(new HLoadElements(object)); 3678 HInstruction* elements = AddInstruction(new HLoadElements(object));
3670 AddInstruction(new HCheckMap(elements, Factory::fixed_array_map())); 3679 AddInstruction(new HCheckMap(elements, Factory::fixed_array_map()));
3671 bool is_array = (map->instance_type() == JS_ARRAY_TYPE); 3680 bool is_array = (map->instance_type() == JS_ARRAY_TYPE);
3672 HInstruction* length = NULL; 3681 HInstruction* length = NULL;
3673 if (is_array) { 3682 if (is_array) {
3674 length = AddInstruction(new HArrayLength(object)); 3683 length = AddInstruction(new HJSArrayLength(object));
3675 } else { 3684 } else {
3676 length = AddInstruction(new HArrayLength(elements)); 3685 length = AddInstruction(new HFixedArrayLength(elements));
3677 } 3686 }
3678 AddInstruction(new HBoundsCheck(key, length)); 3687 AddInstruction(new HBoundsCheck(key, length));
3679 return new HStoreKeyedFastElement(elements, key, val); 3688 return new HStoreKeyedFastElement(elements, key, val);
3680 } 3689 }
3681 3690
3682 3691
3683 bool HGraphBuilder::TryArgumentsAccess(Property* expr) { 3692 bool HGraphBuilder::TryArgumentsAccess(Property* expr) {
3684 VariableProxy* proxy = expr->obj()->AsVariableProxy(); 3693 VariableProxy* proxy = expr->obj()->AsVariableProxy();
3685 if (proxy == NULL) return false; 3694 if (proxy == NULL) return false;
3686 if (!proxy->var()->IsStackAllocated()) return false; 3695 if (!proxy->var()->IsStackAllocated()) return false;
(...skipping 26 matching lines...) Expand all
3713 3722
3714 if (TryArgumentsAccess(expr)) return; 3723 if (TryArgumentsAccess(expr)) return;
3715 CHECK_BAILOUT; 3724 CHECK_BAILOUT;
3716 3725
3717 VISIT_FOR_VALUE(expr->obj()); 3726 VISIT_FOR_VALUE(expr->obj());
3718 3727
3719 HInstruction* instr = NULL; 3728 HInstruction* instr = NULL;
3720 if (expr->IsArrayLength()) { 3729 if (expr->IsArrayLength()) {
3721 HValue* array = Pop(); 3730 HValue* array = Pop();
3722 AddInstruction(new HCheckNonSmi(array)); 3731 AddInstruction(new HCheckNonSmi(array));
3723 instr = new HArrayLength(array); 3732 AddInstruction(new HCheckInstanceType(array, JS_ARRAY_TYPE, JS_ARRAY_TYPE));
3733 instr = new HJSArrayLength(array);
3724 3734
3725 } else if (expr->IsFunctionPrototype()) { 3735 } else if (expr->IsFunctionPrototype()) {
3726 HValue* function = Pop(); 3736 HValue* function = Pop();
3727 AddInstruction(new HCheckNonSmi(function)); 3737 AddInstruction(new HCheckNonSmi(function));
3728 instr = new HLoadFunctionPrototype(function); 3738 instr = new HLoadFunctionPrototype(function);
3729 3739
3730 } else if (expr->key()->IsPropertyName()) { 3740 } else if (expr->key()->IsPropertyName()) {
3731 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); 3741 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName();
3732 ZoneMapList* types = expr->GetReceiverTypes(); 3742 ZoneMapList* types = expr->GetReceiverTypes();
3733 3743
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after
4852 TypeInfo info = oracle()->CompareType(expr, TypeFeedbackOracle::RESULT); 4862 TypeInfo info = oracle()->CompareType(expr, TypeFeedbackOracle::RESULT);
4853 HInstruction* instr = NULL; 4863 HInstruction* instr = NULL;
4854 if (op == Token::INSTANCEOF) { 4864 if (op == Token::INSTANCEOF) {
4855 instr = new HInstanceOf(left, right); 4865 instr = new HInstanceOf(left, right);
4856 } else if (op == Token::IN) { 4866 } else if (op == Token::IN) {
4857 BAILOUT("Unsupported comparison: in"); 4867 BAILOUT("Unsupported comparison: in");
4858 } else if (info.IsNonPrimitive()) { 4868 } else if (info.IsNonPrimitive()) {
4859 switch (op) { 4869 switch (op) {
4860 case Token::EQ: 4870 case Token::EQ:
4861 case Token::EQ_STRICT: { 4871 case Token::EQ_STRICT: {
4872 AddInstruction(new HCheckNonSmi(left));
4862 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left)); 4873 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(left));
4874 AddInstruction(new HCheckNonSmi(right));
4863 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right)); 4875 AddInstruction(HCheckInstanceType::NewIsJSObjectOrJSFunction(right));
4864 instr = new HCompareJSObjectEq(left, right); 4876 instr = new HCompareJSObjectEq(left, right);
4865 break; 4877 break;
4866 } 4878 }
4867 default: 4879 default:
4868 BAILOUT("Unsupported non-primitive compare"); 4880 BAILOUT("Unsupported non-primitive compare");
4869 break; 4881 break;
4870 } 4882 }
4871 } else { 4883 } else {
4872 HCompare* compare = new HCompare(left, right, op); 4884 HCompare* compare = new HCompare(left, right, op);
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
5682 } 5694 }
5683 5695
5684 #ifdef DEBUG 5696 #ifdef DEBUG
5685 if (graph_ != NULL) graph_->Verify(); 5697 if (graph_ != NULL) graph_->Verify();
5686 if (chunk_ != NULL) chunk_->Verify(); 5698 if (chunk_ != NULL) chunk_->Verify();
5687 if (allocator_ != NULL) allocator_->Verify(); 5699 if (allocator_ != NULL) allocator_->Verify();
5688 #endif 5700 #endif
5689 } 5701 }
5690 5702
5691 } } // namespace v8::internal 5703 } } // 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