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

Side by Side Diff: src/hydrogen.cc

Issue 11028027: Revert trunk to bleeding_edge at r12484 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 8 years, 2 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/hydrogen.h ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 end_ = end; 161 end_ = end;
162 for (HSuccessorIterator it(end); !it.Done(); it.Advance()) { 162 for (HSuccessorIterator it(end); !it.Done(); it.Advance()) {
163 it.Current()->RegisterPredecessor(this); 163 it.Current()->RegisterPredecessor(this);
164 } 164 }
165 } 165 }
166 166
167 167
168 void HBasicBlock::Goto(HBasicBlock* block, FunctionState* state) { 168 void HBasicBlock::Goto(HBasicBlock* block, FunctionState* state) {
169 bool drop_extra = state != NULL && 169 bool drop_extra = state != NULL &&
170 state->inlining_kind() == DROP_EXTRA_ON_RETURN; 170 state->inlining_kind() == DROP_EXTRA_ON_RETURN;
171 bool arguments_pushed = state != NULL && state->arguments_pushed();
171 172
172 if (block->IsInlineReturnTarget()) { 173 if (block->IsInlineReturnTarget()) {
173 AddInstruction(new(zone()) HLeaveInlined()); 174 AddInstruction(new(zone()) HLeaveInlined(arguments_pushed));
174 last_environment_ = last_environment()->DiscardInlined(drop_extra); 175 last_environment_ = last_environment()->DiscardInlined(drop_extra);
175 } 176 }
176 177
177 AddSimulate(BailoutId::None()); 178 AddSimulate(BailoutId::None());
178 HGoto* instr = new(zone()) HGoto(block); 179 HGoto* instr = new(zone()) HGoto(block);
179 Finish(instr); 180 Finish(instr);
180 } 181 }
181 182
182 183
183 void HBasicBlock::AddLeaveInlined(HValue* return_value, 184 void HBasicBlock::AddLeaveInlined(HValue* return_value,
184 FunctionState* state) { 185 FunctionState* state) {
185 HBasicBlock* target = state->function_return(); 186 HBasicBlock* target = state->function_return();
186 bool drop_extra = state->inlining_kind() == DROP_EXTRA_ON_RETURN; 187 bool drop_extra = state->inlining_kind() == DROP_EXTRA_ON_RETURN;
188 bool arguments_pushed = state->arguments_pushed();
187 189
188 ASSERT(target->IsInlineReturnTarget()); 190 ASSERT(target->IsInlineReturnTarget());
189 ASSERT(return_value != NULL); 191 ASSERT(return_value != NULL);
190 AddInstruction(new(zone()) HLeaveInlined()); 192 AddInstruction(new(zone()) HLeaveInlined(arguments_pushed));
191 last_environment_ = last_environment()->DiscardInlined(drop_extra); 193 last_environment_ = last_environment()->DiscardInlined(drop_extra);
192 last_environment()->Push(return_value); 194 last_environment()->Push(return_value);
193 AddSimulate(BailoutId::None()); 195 AddSimulate(BailoutId::None());
194 HGoto* instr = new(zone()) HGoto(target); 196 HGoto* instr = new(zone()) HGoto(target);
195 Finish(instr); 197 Finish(instr);
196 } 198 }
197 199
198 200
199 void HBasicBlock::SetInitialEnvironment(HEnvironment* env) { 201 void HBasicBlock::SetInitialEnvironment(HEnvironment* env) {
200 ASSERT(!HasEnvironment()); 202 ASSERT(!HasEnvironment());
(...skipping 3222 matching lines...) Expand 10 before | Expand all | Expand 10 after
3423 HValue* IndexBase() const { return index_base_; } 3425 HValue* IndexBase() const { return index_base_; }
3424 HValue* Length() const { return length_; } 3426 HValue* Length() const { return length_; }
3425 3427
3426 uint32_t Hash() { 3428 uint32_t Hash() {
3427 return static_cast<uint32_t>(index_base_->Hashcode() ^ length_->Hashcode()); 3429 return static_cast<uint32_t>(index_base_->Hashcode() ^ length_->Hashcode());
3428 } 3430 }
3429 3431
3430 static BoundsCheckKey* Create(Zone* zone, 3432 static BoundsCheckKey* Create(Zone* zone,
3431 HBoundsCheck* check, 3433 HBoundsCheck* check,
3432 int32_t* offset) { 3434 int32_t* offset) {
3433 if (!check->index()->representation().IsInteger32()) return NULL;
3434
3435 HValue* index_base = NULL; 3435 HValue* index_base = NULL;
3436 HConstant* constant = NULL; 3436 HConstant* constant = NULL;
3437 bool is_sub = false; 3437 bool is_sub = false;
3438 3438
3439 if (check->index()->IsAdd()) { 3439 if (check->index()->IsAdd()) {
3440 HAdd* index = HAdd::cast(check->index()); 3440 HAdd* index = HAdd::cast(check->index());
3441 if (index->left()->IsConstant()) { 3441 if (index->left()->IsConstant()) {
3442 constant = HConstant::cast(index->left()); 3442 constant = HConstant::cast(index->left());
3443 index_base = index->right(); 3443 index_base = index->right();
3444 } else if (index->right()->IsConstant()) { 3444 } else if (index->right()->IsConstant()) {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
3675 if (!i->IsBoundsCheck()) continue; 3675 if (!i->IsBoundsCheck()) continue;
3676 3676
3677 HBoundsCheck* check = HBoundsCheck::cast(i); 3677 HBoundsCheck* check = HBoundsCheck::cast(i);
3678 check->ReplaceAllUsesWith(check->index()); 3678 check->ReplaceAllUsesWith(check->index());
3679 3679
3680 if (!FLAG_array_bounds_checks_elimination) continue; 3680 if (!FLAG_array_bounds_checks_elimination) continue;
3681 3681
3682 int32_t offset; 3682 int32_t offset;
3683 BoundsCheckKey* key = 3683 BoundsCheckKey* key =
3684 BoundsCheckKey::Create(zone(), check, &offset); 3684 BoundsCheckKey::Create(zone(), check, &offset);
3685 if (key == NULL) continue;
3686 BoundsCheckBbData** data_p = table->LookupOrInsert(key, zone()); 3685 BoundsCheckBbData** data_p = table->LookupOrInsert(key, zone());
3687 BoundsCheckBbData* data = *data_p; 3686 BoundsCheckBbData* data = *data_p;
3688 if (data == NULL) { 3687 if (data == NULL) {
3689 bb_data_list = new(zone()) BoundsCheckBbData(key, 3688 bb_data_list = new(zone()) BoundsCheckBbData(key,
3690 offset, 3689 offset,
3691 offset, 3690 offset,
3692 bb, 3691 bb,
3693 check, 3692 check,
3694 check, 3693 check,
3695 bb_data_list, 3694 bb_data_list,
(...skipping 2848 matching lines...) Expand 10 before | Expand all | Expand 10 after
6544 6543
6545 6544
6546 void HGraphBuilder::EnsureArgumentsArePushedForAccess() { 6545 void HGraphBuilder::EnsureArgumentsArePushedForAccess() {
6547 // Outermost function already has arguments on the stack. 6546 // Outermost function already has arguments on the stack.
6548 if (function_state()->outer() == NULL) return; 6547 if (function_state()->outer() == NULL) return;
6549 6548
6550 if (function_state()->arguments_pushed()) return; 6549 if (function_state()->arguments_pushed()) return;
6551 6550
6552 // Push arguments when entering inlined function. 6551 // Push arguments when entering inlined function.
6553 HEnterInlined* entry = function_state()->entry(); 6552 HEnterInlined* entry = function_state()->entry();
6554 entry->set_arguments_pushed();
6555 6553
6556 ZoneList<HValue*>* arguments_values = entry->arguments_values(); 6554 ZoneList<HValue*>* arguments_values = entry->arguments_values();
6557 6555
6558 HInstruction* insert_after = entry; 6556 HInstruction* insert_after = entry;
6559 for (int i = 0; i < arguments_values->length(); i++) { 6557 for (int i = 0; i < arguments_values->length(); i++) {
6560 HValue* argument = arguments_values->at(i); 6558 HValue* argument = arguments_values->at(i);
6561 HInstruction* push_argument = new(zone()) HPushArgument(argument); 6559 HInstruction* push_argument = new(zone()) HPushArgument(argument);
6562 push_argument->InsertAfter(insert_after); 6560 push_argument->InsertAfter(insert_after);
6563 insert_after = push_argument; 6561 insert_after = push_argument;
6564 } 6562 }
(...skipping 2822 matching lines...) Expand 10 before | Expand all | Expand 10 after
9387 Handle<JSFunction> closure, 9385 Handle<JSFunction> closure,
9388 Zone* zone) 9386 Zone* zone)
9389 : closure_(closure), 9387 : closure_(closure),
9390 values_(0, zone), 9388 values_(0, zone),
9391 assigned_variables_(4, zone), 9389 assigned_variables_(4, zone),
9392 frame_type_(JS_FUNCTION), 9390 frame_type_(JS_FUNCTION),
9393 parameter_count_(0), 9391 parameter_count_(0),
9394 specials_count_(1), 9392 specials_count_(1),
9395 local_count_(0), 9393 local_count_(0),
9396 outer_(outer), 9394 outer_(outer),
9397 entry_(NULL),
9398 pop_count_(0), 9395 pop_count_(0),
9399 push_count_(0), 9396 push_count_(0),
9400 ast_id_(BailoutId::None()), 9397 ast_id_(BailoutId::None()),
9401 zone_(zone) { 9398 zone_(zone) {
9402 Initialize(scope->num_parameters() + 1, scope->num_stack_slots(), 0); 9399 Initialize(scope->num_parameters() + 1, scope->num_stack_slots(), 0);
9403 } 9400 }
9404 9401
9405 9402
9406 HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone) 9403 HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone)
9407 : values_(0, zone), 9404 : values_(0, zone),
9408 assigned_variables_(0, zone), 9405 assigned_variables_(0, zone),
9409 frame_type_(JS_FUNCTION), 9406 frame_type_(JS_FUNCTION),
9410 parameter_count_(0), 9407 parameter_count_(0),
9411 specials_count_(1), 9408 specials_count_(1),
9412 local_count_(0), 9409 local_count_(0),
9413 outer_(NULL), 9410 outer_(NULL),
9414 entry_(NULL),
9415 pop_count_(0), 9411 pop_count_(0),
9416 push_count_(0), 9412 push_count_(0),
9417 ast_id_(other->ast_id()), 9413 ast_id_(other->ast_id()),
9418 zone_(zone) { 9414 zone_(zone) {
9419 Initialize(other); 9415 Initialize(other);
9420 } 9416 }
9421 9417
9422 9418
9423 HEnvironment::HEnvironment(HEnvironment* outer, 9419 HEnvironment::HEnvironment(HEnvironment* outer,
9424 Handle<JSFunction> closure, 9420 Handle<JSFunction> closure,
9425 FrameType frame_type, 9421 FrameType frame_type,
9426 int arguments, 9422 int arguments,
9427 Zone* zone) 9423 Zone* zone)
9428 : closure_(closure), 9424 : closure_(closure),
9429 values_(arguments, zone), 9425 values_(arguments, zone),
9430 assigned_variables_(0, zone), 9426 assigned_variables_(0, zone),
9431 frame_type_(frame_type), 9427 frame_type_(frame_type),
9432 parameter_count_(arguments), 9428 parameter_count_(arguments),
9433 local_count_(0), 9429 local_count_(0),
9434 outer_(outer), 9430 outer_(outer),
9435 entry_(NULL),
9436 pop_count_(0), 9431 pop_count_(0),
9437 push_count_(0), 9432 push_count_(0),
9438 ast_id_(BailoutId::None()), 9433 ast_id_(BailoutId::None()),
9439 zone_(zone) { 9434 zone_(zone) {
9440 } 9435 }
9441 9436
9442 9437
9443 void HEnvironment::Initialize(int parameter_count, 9438 void HEnvironment::Initialize(int parameter_count,
9444 int local_count, 9439 int local_count,
9445 int stack_height) { 9440 int stack_height) {
9446 parameter_count_ = parameter_count; 9441 parameter_count_ = parameter_count;
9447 local_count_ = local_count; 9442 local_count_ = local_count;
9448 9443
9449 // Avoid reallocating the temporaries' backing store on the first Push. 9444 // Avoid reallocating the temporaries' backing store on the first Push.
9450 int total = parameter_count + specials_count_ + local_count + stack_height; 9445 int total = parameter_count + specials_count_ + local_count + stack_height;
9451 values_.Initialize(total + 4, zone()); 9446 values_.Initialize(total + 4, zone());
9452 for (int i = 0; i < total; ++i) values_.Add(NULL, zone()); 9447 for (int i = 0; i < total; ++i) values_.Add(NULL, zone());
9453 } 9448 }
9454 9449
9455 9450
9456 void HEnvironment::Initialize(const HEnvironment* other) { 9451 void HEnvironment::Initialize(const HEnvironment* other) {
9457 closure_ = other->closure(); 9452 closure_ = other->closure();
9458 values_.AddAll(other->values_, zone()); 9453 values_.AddAll(other->values_, zone());
9459 assigned_variables_.AddAll(other->assigned_variables_, zone()); 9454 assigned_variables_.AddAll(other->assigned_variables_, zone());
9460 frame_type_ = other->frame_type_; 9455 frame_type_ = other->frame_type_;
9461 parameter_count_ = other->parameter_count_; 9456 parameter_count_ = other->parameter_count_;
9462 local_count_ = other->local_count_; 9457 local_count_ = other->local_count_;
9463 if (other->outer_ != NULL) outer_ = other->outer_->Copy(); // Deep copy. 9458 if (other->outer_ != NULL) outer_ = other->outer_->Copy(); // Deep copy.
9464 entry_ = other->entry_;
9465 pop_count_ = other->pop_count_; 9459 pop_count_ = other->pop_count_;
9466 push_count_ = other->push_count_; 9460 push_count_ = other->push_count_;
9467 ast_id_ = other->ast_id_; 9461 ast_id_ = other->ast_id_;
9468 } 9462 }
9469 9463
9470 9464
9471 void HEnvironment::AddIncomingEdge(HBasicBlock* block, HEnvironment* other) { 9465 void HEnvironment::AddIncomingEdge(HBasicBlock* block, HEnvironment* other) {
9472 ASSERT(!block->IsLoopHeader()); 9466 ASSERT(!block->IsLoopHeader());
9473 ASSERT(values_.length() == other->values_.length()); 9467 ASSERT(values_.length() == other->values_.length());
9474 9468
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
9983 } 9977 }
9984 } 9978 }
9985 9979
9986 #ifdef DEBUG 9980 #ifdef DEBUG
9987 if (graph_ != NULL) graph_->Verify(false); // No full verify. 9981 if (graph_ != NULL) graph_->Verify(false); // No full verify.
9988 if (allocator_ != NULL) allocator_->Verify(); 9982 if (allocator_ != NULL) allocator_->Verify();
9989 #endif 9983 #endif
9990 } 9984 }
9991 9985
9992 } } // namespace v8::internal 9986 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698