| Index: src/hydrogen-infer-types.cc
|
| diff --git a/src/marking-thread.cc b/src/hydrogen-infer-types.cc
|
| similarity index 51%
|
| copy from src/marking-thread.cc
|
| copy to src/hydrogen-infer-types.cc
|
| index 574485abc7b1c7ae36c2cc04d1a2d2e663fa2921..01c608473672f0e3bdfc507b2c8a03526242983f 100644
|
| --- a/src/marking-thread.cc
|
| +++ b/src/hydrogen-infer-types.cc
|
| @@ -25,64 +25,53 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| -#include "marking-thread.h"
|
| -
|
| -#include "v8.h"
|
| -
|
| -#include "isolate.h"
|
| -#include "v8threads.h"
|
| +#include "hydrogen-infer-types.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -MarkingThread::MarkingThread(Isolate* isolate)
|
| - : Thread("MarkingThread"),
|
| - isolate_(isolate),
|
| - heap_(isolate->heap()),
|
| - start_marking_semaphore_(OS::CreateSemaphore(0)),
|
| - end_marking_semaphore_(OS::CreateSemaphore(0)),
|
| - stop_semaphore_(OS::CreateSemaphore(0)) {
|
| - NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false));
|
| - id_ = NoBarrier_AtomicIncrement(&id_counter_, 1);
|
| -}
|
| -
|
| -
|
| -Atomic32 MarkingThread::id_counter_ = -1;
|
| +void HInferTypesPhase::InferTypes(int from_inclusive, int to_inclusive) {
|
| + for (int i = from_inclusive; i <= to_inclusive; ++i) {
|
| + HBasicBlock* block = graph()->blocks()->at(i);
|
|
|
| + const ZoneList<HPhi*>* phis = block->phis();
|
| + for (int j = 0; j < phis->length(); j++) {
|
| + phis->at(j)->UpdateInferredType();
|
| + }
|
|
|
| -void MarkingThread::Run() {
|
| - Isolate::SetIsolateThreadLocals(isolate_, NULL);
|
| - DisallowHeapAllocation no_allocation;
|
| - DisallowHandleAllocation no_handles;
|
| - DisallowHandleDereference no_deref;
|
| -
|
| - while (true) {
|
| - start_marking_semaphore_->Wait();
|
| -
|
| - if (Acquire_Load(&stop_thread_)) {
|
| - stop_semaphore_->Signal();
|
| - return;
|
| + for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
|
| + it.Current()->UpdateInferredType();
|
| }
|
|
|
| - end_marking_semaphore_->Signal();
|
| + if (block->IsLoopHeader()) {
|
| + HBasicBlock* last_back_edge =
|
| + block->loop_information()->GetLastBackEdge();
|
| + InferTypes(i + 1, last_back_edge->block_id());
|
| + // Skip all blocks already processed by the recursive call.
|
| + i = last_back_edge->block_id();
|
| + // Update phis of the loop header now after the whole loop body is
|
| + // guaranteed to be processed.
|
| + for (int j = 0; j < block->phis()->length(); ++j) {
|
| + HPhi* phi = block->phis()->at(j);
|
| + worklist_.Add(phi, zone());
|
| + in_worklist_.Add(phi->id());
|
| + }
|
| + while (!worklist_.is_empty()) {
|
| + HValue* current = worklist_.RemoveLast();
|
| + in_worklist_.Remove(current->id());
|
| + if (current->UpdateInferredType()) {
|
| + for (HUseIterator it(current->uses()); !it.Done(); it.Advance()) {
|
| + HValue* use = it.value();
|
| + if (!in_worklist_.Contains(use->id())) {
|
| + in_worklist_.Add(use->id());
|
| + worklist_.Add(use, zone());
|
| + }
|
| + }
|
| + }
|
| + }
|
| + ASSERT(in_worklist_.IsEmpty());
|
| + }
|
| }
|
| }
|
|
|
| -
|
| -void MarkingThread::Stop() {
|
| - Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
|
| - start_marking_semaphore_->Signal();
|
| - stop_semaphore_->Wait();
|
| -}
|
| -
|
| -
|
| -void MarkingThread::StartMarking() {
|
| - start_marking_semaphore_->Signal();
|
| -}
|
| -
|
| -
|
| -void MarkingThread::WaitForMarkingThread() {
|
| - end_marking_semaphore_->Wait();
|
| -}
|
| -
|
| } } // namespace v8::internal
|
|
|