Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 90f9c3496b2b4c6853419d218ae96fab4c637820..b1d28b0f0407745c775789e95310eaf3191084d3 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -313,6 +313,34 @@ int HBasicBlock::LoopNestingDepth() const { |
| } |
| +void HBasicBlock::ReplaceControlWithGotoSuccessor(int succ) { |
| + ASSERT(IsFinished()); |
| + ASSERT(end()->SuccessorCount() == 2); // Only this case is supported yet. |
| + ASSERT(succ < end()->SuccessorCount()); |
| + |
| + // Replace control instruction with if(true) or if(false). |
| + HConstant* value = (succ == 0) |
| + ? graph()->GetConstantTrue() |
| + : graph()->GetConstantFalse(); |
| + |
| + HBranch* new_branch = HBranch::New( |
| + zone(), |
| + NULL, |
| + value, |
|
titzer
2014/01/14 13:40:32
Why not always if(true) {succ} else {1 - succ}?
Igor Sheludko
2014/01/14 15:28:00
Done.
|
| + ToBooleanStub::Types(ToBooleanStub::BOOLEAN), |
| + end()->SuccessorAt(0), |
| + end()->SuccessorAt(1)); |
| + |
| + int unreachable_succ = 1 - succ; |
| + |
| + MarkSuccEdgeUnreachable(unreachable_succ); |
| + |
| + end()->DeleteAndReplaceWith(end()->ActualValue()); |
| + new_branch->InsertAfter(last()); |
| + end_ = new_branch; |
| +} |
| + |
| + |
| void HBasicBlock::PostProcessLoopHeader(IterationStatement* stmt) { |
| ASSERT(IsLoopHeader()); |
| @@ -331,6 +359,15 @@ void HBasicBlock::PostProcessLoopHeader(IterationStatement* stmt) { |
| } |
| +void HBasicBlock::MarkSuccEdgeUnreachable(int succ) { |
| + ASSERT(IsFinished()); |
| + HBasicBlock* succ_block = end()->SuccessorAt(succ); |
| + |
| + ASSERT(succ_block->predecessors()->length() == 1); |
| + succ_block->MarkUnreachable(); |
| +} |
| + |
| + |
| void HBasicBlock::RegisterPredecessor(HBasicBlock* pred) { |
| if (HasPredecessor()) { |
| // Only loop header blocks can have a predecessor added after |