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

Side by Side Diff: src/hydrogen.cc

Issue 11775016: Environment bookkeping has linear time complexity now, not a quadratic one. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebased Created 7 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/hydrogen.h ('k') | no next file » | 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 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 int pop_count = environment->pop_count(); 145 int pop_count = environment->pop_count();
146 146
147 HSimulate* instr = 147 HSimulate* instr =
148 new(zone()) HSimulate(ast_id, pop_count, zone(), removable); 148 new(zone()) HSimulate(ast_id, pop_count, zone(), removable);
149 // Order of pushed values: newest (top of stack) first. This allows 149 // Order of pushed values: newest (top of stack) first. This allows
150 // HSimulate::MergeInto() to easily append additional pushed values 150 // HSimulate::MergeInto() to easily append additional pushed values
151 // that are older (from further down the stack). 151 // that are older (from further down the stack).
152 for (int i = 0; i < push_count; ++i) { 152 for (int i = 0; i < push_count; ++i) {
153 instr->AddPushedValue(environment->ExpressionStackAt(i)); 153 instr->AddPushedValue(environment->ExpressionStackAt(i));
154 } 154 }
155 for (int i = 0; i < environment->assigned_variables()->length(); ++i) { 155 for (GrowableBitVector::Iterator it(environment->assigned_variables(),
156 int index = environment->assigned_variables()->at(i); 156 zone());
157 !it.Done();
158 it.Advance()) {
159 int index = it.Current();
157 instr->AddAssignedValue(index, environment->Lookup(index)); 160 instr->AddAssignedValue(index, environment->Lookup(index));
158 } 161 }
159 environment->ClearHistory(); 162 environment->ClearHistory();
160 return instr; 163 return instr;
161 } 164 }
162 165
163 166
164 void HBasicBlock::Finish(HControlInstruction* end) { 167 void HBasicBlock::Finish(HControlInstruction* end) {
165 ASSERT(!IsFinished()); 168 ASSERT(!IsFinished());
166 AddInstruction(end); 169 AddInstruction(end);
(...skipping 9396 matching lines...) Expand 10 before | Expand all | Expand 10 after
9563 #undef CHECK_BAILOUT 9566 #undef CHECK_BAILOUT
9564 #undef CHECK_ALIVE 9567 #undef CHECK_ALIVE
9565 9568
9566 9569
9567 HEnvironment::HEnvironment(HEnvironment* outer, 9570 HEnvironment::HEnvironment(HEnvironment* outer,
9568 Scope* scope, 9571 Scope* scope,
9569 Handle<JSFunction> closure, 9572 Handle<JSFunction> closure,
9570 Zone* zone) 9573 Zone* zone)
9571 : closure_(closure), 9574 : closure_(closure),
9572 values_(0, zone), 9575 values_(0, zone),
9573 assigned_variables_(4, zone),
9574 frame_type_(JS_FUNCTION), 9576 frame_type_(JS_FUNCTION),
9575 parameter_count_(0), 9577 parameter_count_(0),
9576 specials_count_(1), 9578 specials_count_(1),
9577 local_count_(0), 9579 local_count_(0),
9578 outer_(outer), 9580 outer_(outer),
9579 entry_(NULL), 9581 entry_(NULL),
9580 pop_count_(0), 9582 pop_count_(0),
9581 push_count_(0), 9583 push_count_(0),
9582 ast_id_(BailoutId::None()), 9584 ast_id_(BailoutId::None()),
9583 zone_(zone) { 9585 zone_(zone) {
9584 Initialize(scope->num_parameters() + 1, scope->num_stack_slots(), 0); 9586 Initialize(scope->num_parameters() + 1, scope->num_stack_slots(), 0);
9585 } 9587 }
9586 9588
9587 9589
9588 HEnvironment::HEnvironment(Zone* zone) 9590 HEnvironment::HEnvironment(Zone* zone)
9589 : values_(0, zone), 9591 : values_(0, zone),
9590 assigned_variables_(0, zone),
9591 frame_type_(STUB), 9592 frame_type_(STUB),
9592 parameter_count_(0), 9593 parameter_count_(0),
9593 specials_count_(0), 9594 specials_count_(0),
9594 local_count_(0), 9595 local_count_(0),
9595 outer_(NULL), 9596 outer_(NULL),
9596 entry_(NULL), 9597 entry_(NULL),
9597 pop_count_(0), 9598 pop_count_(0),
9598 push_count_(0), 9599 push_count_(0),
9599 ast_id_(BailoutId::None()), 9600 ast_id_(BailoutId::None()),
9600 zone_(zone) { 9601 zone_(zone) {
9601 Initialize(0, 0, 0); 9602 Initialize(0, 0, 0);
9602 } 9603 }
9603 9604
9604 9605
9605 HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone) 9606 HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone)
9606 : values_(0, zone), 9607 : values_(0, zone),
9607 assigned_variables_(0, zone),
9608 frame_type_(JS_FUNCTION), 9608 frame_type_(JS_FUNCTION),
9609 parameter_count_(0), 9609 parameter_count_(0),
9610 specials_count_(1), 9610 specials_count_(1),
9611 local_count_(0), 9611 local_count_(0),
9612 outer_(NULL), 9612 outer_(NULL),
9613 entry_(NULL), 9613 entry_(NULL),
9614 pop_count_(0), 9614 pop_count_(0),
9615 push_count_(0), 9615 push_count_(0),
9616 ast_id_(other->ast_id()), 9616 ast_id_(other->ast_id()),
9617 zone_(zone) { 9617 zone_(zone) {
9618 Initialize(other); 9618 Initialize(other);
9619 } 9619 }
9620 9620
9621 9621
9622 HEnvironment::HEnvironment(HEnvironment* outer, 9622 HEnvironment::HEnvironment(HEnvironment* outer,
9623 Handle<JSFunction> closure, 9623 Handle<JSFunction> closure,
9624 FrameType frame_type, 9624 FrameType frame_type,
9625 int arguments, 9625 int arguments,
9626 Zone* zone) 9626 Zone* zone)
9627 : closure_(closure), 9627 : closure_(closure),
9628 values_(arguments, zone), 9628 values_(arguments, zone),
9629 assigned_variables_(0, zone),
9630 frame_type_(frame_type), 9629 frame_type_(frame_type),
9631 parameter_count_(arguments), 9630 parameter_count_(arguments),
9632 local_count_(0), 9631 local_count_(0),
9633 outer_(outer), 9632 outer_(outer),
9634 entry_(NULL), 9633 entry_(NULL),
9635 pop_count_(0), 9634 pop_count_(0),
9636 push_count_(0), 9635 push_count_(0),
9637 ast_id_(BailoutId::None()), 9636 ast_id_(BailoutId::None()),
9638 zone_(zone) { 9637 zone_(zone) {
9639 } 9638 }
9640 9639
9641 9640
9642 void HEnvironment::Initialize(int parameter_count, 9641 void HEnvironment::Initialize(int parameter_count,
9643 int local_count, 9642 int local_count,
9644 int stack_height) { 9643 int stack_height) {
9645 parameter_count_ = parameter_count; 9644 parameter_count_ = parameter_count;
9646 local_count_ = local_count; 9645 local_count_ = local_count;
9647 9646
9648 // Avoid reallocating the temporaries' backing store on the first Push. 9647 // Avoid reallocating the temporaries' backing store on the first Push.
9649 int total = parameter_count + specials_count_ + local_count + stack_height; 9648 int total = parameter_count + specials_count_ + local_count + stack_height;
9650 values_.Initialize(total + 4, zone()); 9649 values_.Initialize(total + 4, zone());
9651 for (int i = 0; i < total; ++i) values_.Add(NULL, zone()); 9650 for (int i = 0; i < total; ++i) values_.Add(NULL, zone());
9652 } 9651 }
9653 9652
9654 9653
9655 void HEnvironment::Initialize(const HEnvironment* other) { 9654 void HEnvironment::Initialize(const HEnvironment* other) {
9656 closure_ = other->closure(); 9655 closure_ = other->closure();
9657 values_.AddAll(other->values_, zone()); 9656 values_.AddAll(other->values_, zone());
9658 assigned_variables_.AddAll(other->assigned_variables_, zone()); 9657 assigned_variables_.Union(other->assigned_variables_, zone());
9659 frame_type_ = other->frame_type_; 9658 frame_type_ = other->frame_type_;
9660 parameter_count_ = other->parameter_count_; 9659 parameter_count_ = other->parameter_count_;
9661 local_count_ = other->local_count_; 9660 local_count_ = other->local_count_;
9662 if (other->outer_ != NULL) outer_ = other->outer_->Copy(); // Deep copy. 9661 if (other->outer_ != NULL) outer_ = other->outer_->Copy(); // Deep copy.
9663 entry_ = other->entry_; 9662 entry_ = other->entry_;
9664 pop_count_ = other->pop_count_; 9663 pop_count_ = other->pop_count_;
9665 push_count_ = other->push_count_; 9664 push_count_ = other->push_count_;
9666 ast_id_ = other->ast_id_; 9665 ast_id_ = other->ast_id_;
9667 } 9666 }
9668 9667
(...skipping 23 matching lines...) Expand all
9692 phi->AddInput(other->values_[i]); 9691 phi->AddInput(other->values_[i]);
9693 this->values_[i] = phi; 9692 this->values_[i] = phi;
9694 block->AddPhi(phi); 9693 block->AddPhi(phi);
9695 } 9694 }
9696 } 9695 }
9697 } 9696 }
9698 9697
9699 9698
9700 void HEnvironment::Bind(int index, HValue* value) { 9699 void HEnvironment::Bind(int index, HValue* value) {
9701 ASSERT(value != NULL); 9700 ASSERT(value != NULL);
9702 if (!assigned_variables_.Contains(index)) { 9701 assigned_variables_.Add(index, zone());
9703 assigned_variables_.Add(index, zone());
9704 }
9705 values_[index] = value; 9702 values_[index] = value;
9706 } 9703 }
9707 9704
9708 9705
9709 bool HEnvironment::HasExpressionAt(int index) const { 9706 bool HEnvironment::HasExpressionAt(int index) const {
9710 return index >= parameter_count_ + specials_count_ + local_count_; 9707 return index >= parameter_count_ + specials_count_ + local_count_;
9711 } 9708 }
9712 9709
9713 9710
9714 bool HEnvironment::ExpressionStackIsEmpty() const { 9711 bool HEnvironment::ExpressionStackIsEmpty() const {
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
10201 } 10198 }
10202 } 10199 }
10203 10200
10204 #ifdef DEBUG 10201 #ifdef DEBUG
10205 if (graph_ != NULL) graph_->Verify(false); // No full verify. 10202 if (graph_ != NULL) graph_->Verify(false); // No full verify.
10206 if (allocator_ != NULL) allocator_->Verify(); 10203 if (allocator_ != NULL) allocator_->Verify();
10207 #endif 10204 #endif
10208 } 10205 }
10209 10206
10210 } } // namespace v8::internal 10207 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698