Revision f230a1cf deps/v8/src/hydrogen-osr.cc
deps/v8/src/hydrogen-osr.cc | ||
---|---|---|
37 | 37 |
} |
38 | 38 |
|
39 | 39 |
|
40 |
// Build a new loop header block and set it as the current block. |
|
41 |
HBasicBlock *HOsrBuilder::BuildLoopEntry() { |
|
42 |
HBasicBlock* loop_entry = builder_->CreateLoopHeaderBlock(); |
|
43 |
builder_->current_block()->Goto(loop_entry); |
|
44 |
builder_->set_current_block(loop_entry); |
|
45 |
return loop_entry; |
|
46 |
} |
|
47 |
|
|
48 |
|
|
49 |
HBasicBlock* HOsrBuilder::BuildPossibleOsrLoopEntry( |
|
50 |
IterationStatement* statement) { |
|
51 |
// Check if there is an OSR here first. |
|
52 |
if (!HasOsrEntryAt(statement)) return BuildLoopEntry(); |
|
40 |
HBasicBlock* HOsrBuilder::BuildOsrLoopEntry(IterationStatement* statement) { |
|
41 |
ASSERT(HasOsrEntryAt(statement)); |
|
53 | 42 |
|
54 | 43 |
Zone* zone = builder_->zone(); |
55 | 44 |
HGraph* graph = builder_->graph(); |
... | ... | |
63 | 52 |
HBasicBlock* non_osr_entry = graph->CreateBasicBlock(); |
64 | 53 |
osr_entry_ = graph->CreateBasicBlock(); |
65 | 54 |
HValue* true_value = graph->GetConstantTrue(); |
66 |
HBranch* test = new(zone) HBranch(true_value, ToBooleanStub::Types(),
|
|
67 |
non_osr_entry, osr_entry_); |
|
68 |
builder_->current_block()->Finish(test);
|
|
55 |
HBranch* test = builder_->New<HBranch>(true_value, ToBooleanStub::Types(),
|
|
56 |
non_osr_entry, osr_entry_);
|
|
57 |
builder_->FinishCurrentBlock(test);
|
|
69 | 58 |
|
70 | 59 |
HBasicBlock* loop_predecessor = graph->CreateBasicBlock(); |
71 |
non_osr_entry->Goto(loop_predecessor);
|
|
60 |
builder_->Goto(non_osr_entry, loop_predecessor);
|
|
72 | 61 |
|
73 | 62 |
builder_->set_current_block(osr_entry_); |
74 | 63 |
osr_entry_->set_osr_entry(); |
... | ... | |
108 | 97 |
builder_->Add<HOsrEntry>(osr_entry_id); |
109 | 98 |
HContext* context = builder_->Add<HContext>(); |
110 | 99 |
environment->BindContext(context); |
111 |
builder_->current_block()->Goto(loop_predecessor);
|
|
100 |
builder_->Goto(loop_predecessor); |
|
112 | 101 |
loop_predecessor->SetJoinId(statement->EntryId()); |
113 | 102 |
builder_->set_current_block(loop_predecessor); |
114 | 103 |
|
115 | 104 |
// Create the final loop entry |
116 |
osr_loop_entry_ = BuildLoopEntry(); |
|
105 |
osr_loop_entry_ = builder_->BuildLoopEntry();
|
|
117 | 106 |
return osr_loop_entry_; |
118 | 107 |
} |
119 | 108 |
|
Also available in: Unified diff