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

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 1863123002: [crankshaft] Make infinite loop preserve control flow. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-599710.js » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/allocation-site-scopes.h" 9 #include "src/allocation-site-scopes.h"
10 #include "src/ast/ast-numbering.h" 10 #include "src/ast/ast-numbering.h"
(...skipping 5093 matching lines...) Expand 10 before | Expand all | Expand 10 after
5104 HBasicBlock* loop_entry = BuildLoopEntry(stmt); 5104 HBasicBlock* loop_entry = BuildLoopEntry(stmt);
5105 5105
5106 BreakAndContinueInfo break_info(stmt, scope()); 5106 BreakAndContinueInfo break_info(stmt, scope());
5107 { 5107 {
5108 BreakAndContinueScope push(&break_info, this); 5108 BreakAndContinueScope push(&break_info, this);
5109 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); 5109 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry));
5110 } 5110 }
5111 HBasicBlock* body_exit = 5111 HBasicBlock* body_exit =
5112 JoinContinue(stmt, current_block(), break_info.continue_block()); 5112 JoinContinue(stmt, current_block(), break_info.continue_block());
5113 HBasicBlock* loop_successor = NULL; 5113 HBasicBlock* loop_successor = NULL;
5114 if (body_exit != NULL && !stmt->cond()->ToBooleanIsTrue()) { 5114 if (body_exit != NULL) {
5115 set_current_block(body_exit); 5115 set_current_block(body_exit);
5116 loop_successor = graph()->CreateBasicBlock(); 5116 loop_successor = graph()->CreateBasicBlock();
5117 if (stmt->cond()->ToBooleanIsFalse()) { 5117 if (stmt->cond()->ToBooleanIsFalse()) {
5118 loop_entry->loop_information()->stack_check()->Eliminate(); 5118 loop_entry->loop_information()->stack_check()->Eliminate();
5119 Goto(loop_successor); 5119 Goto(loop_successor);
5120 body_exit = NULL; 5120 body_exit = NULL;
5121 } else { 5121 } else {
5122 // The block for a true condition, the actual predecessor block of the 5122 // The block for a true condition, the actual predecessor block of the
5123 // back edge. 5123 // back edge.
5124 body_exit = graph()->CreateBasicBlock(); 5124 body_exit = graph()->CreateBasicBlock();
(...skipping 21 matching lines...) Expand all
5146 5146
5147 void HOptimizedGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { 5147 void HOptimizedGraphBuilder::VisitWhileStatement(WhileStatement* stmt) {
5148 DCHECK(!HasStackOverflow()); 5148 DCHECK(!HasStackOverflow());
5149 DCHECK(current_block() != NULL); 5149 DCHECK(current_block() != NULL);
5150 DCHECK(current_block()->HasPredecessor()); 5150 DCHECK(current_block()->HasPredecessor());
5151 DCHECK(current_block() != NULL); 5151 DCHECK(current_block() != NULL);
5152 HBasicBlock* loop_entry = BuildLoopEntry(stmt); 5152 HBasicBlock* loop_entry = BuildLoopEntry(stmt);
5153 5153
5154 // If the condition is constant true, do not generate a branch. 5154 // If the condition is constant true, do not generate a branch.
5155 HBasicBlock* loop_successor = NULL; 5155 HBasicBlock* loop_successor = NULL;
5156 if (!stmt->cond()->ToBooleanIsTrue()) { 5156 HBasicBlock* body_entry = graph()->CreateBasicBlock();
5157 HBasicBlock* body_entry = graph()->CreateBasicBlock(); 5157 loop_successor = graph()->CreateBasicBlock();
5158 loop_successor = graph()->CreateBasicBlock(); 5158 CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor));
5159 CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor)); 5159 if (body_entry->HasPredecessor()) {
5160 if (body_entry->HasPredecessor()) { 5160 body_entry->SetJoinId(stmt->BodyId());
5161 body_entry->SetJoinId(stmt->BodyId()); 5161 set_current_block(body_entry);
5162 set_current_block(body_entry); 5162 }
5163 } 5163 if (loop_successor->HasPredecessor()) {
5164 if (loop_successor->HasPredecessor()) { 5164 loop_successor->SetJoinId(stmt->ExitId());
5165 loop_successor->SetJoinId(stmt->ExitId()); 5165 } else {
5166 } else { 5166 loop_successor = NULL;
5167 loop_successor = NULL;
5168 }
5169 } 5167 }
5170 5168
5171 BreakAndContinueInfo break_info(stmt, scope()); 5169 BreakAndContinueInfo break_info(stmt, scope());
5172 if (current_block() != NULL) { 5170 if (current_block() != NULL) {
5173 BreakAndContinueScope push(&break_info, this); 5171 BreakAndContinueScope push(&break_info, this);
5174 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); 5172 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry));
5175 } 5173 }
5176 HBasicBlock* body_exit = 5174 HBasicBlock* body_exit =
5177 JoinContinue(stmt, current_block(), break_info.continue_block()); 5175 JoinContinue(stmt, current_block(), break_info.continue_block());
5178 HBasicBlock* loop_exit = CreateLoop(stmt, 5176 HBasicBlock* loop_exit = CreateLoop(stmt,
5179 loop_entry, 5177 loop_entry,
5180 body_exit, 5178 body_exit,
5181 loop_successor, 5179 loop_successor,
5182 break_info.break_block()); 5180 break_info.break_block());
5183 set_current_block(loop_exit); 5181 set_current_block(loop_exit);
5184 } 5182 }
5185 5183
5186 5184
5187 void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { 5185 void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) {
5188 DCHECK(!HasStackOverflow()); 5186 DCHECK(!HasStackOverflow());
5189 DCHECK(current_block() != NULL); 5187 DCHECK(current_block() != NULL);
5190 DCHECK(current_block()->HasPredecessor()); 5188 DCHECK(current_block()->HasPredecessor());
5191 if (stmt->init() != NULL) { 5189 if (stmt->init() != NULL) {
5192 CHECK_ALIVE(Visit(stmt->init())); 5190 CHECK_ALIVE(Visit(stmt->init()));
5193 } 5191 }
5194 DCHECK(current_block() != NULL); 5192 DCHECK(current_block() != NULL);
5195 HBasicBlock* loop_entry = BuildLoopEntry(stmt); 5193 HBasicBlock* loop_entry = BuildLoopEntry(stmt);
5196 5194
5197 HBasicBlock* loop_successor = NULL; 5195 HBasicBlock* loop_successor = graph()->CreateBasicBlock();
5196 HBasicBlock* body_entry = graph()->CreateBasicBlock();
5198 if (stmt->cond() != NULL) { 5197 if (stmt->cond() != NULL) {
5199 HBasicBlock* body_entry = graph()->CreateBasicBlock();
5200 loop_successor = graph()->CreateBasicBlock();
5201 CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor)); 5198 CHECK_BAILOUT(VisitForControl(stmt->cond(), body_entry, loop_successor));
5202 if (body_entry->HasPredecessor()) { 5199 if (body_entry->HasPredecessor()) {
5203 body_entry->SetJoinId(stmt->BodyId()); 5200 body_entry->SetJoinId(stmt->BodyId());
5204 set_current_block(body_entry); 5201 set_current_block(body_entry);
5205 } 5202 }
5206 if (loop_successor->HasPredecessor()) { 5203 if (loop_successor->HasPredecessor()) {
5207 loop_successor->SetJoinId(stmt->ExitId()); 5204 loop_successor->SetJoinId(stmt->ExitId());
5208 } else { 5205 } else {
5209 loop_successor = NULL; 5206 loop_successor = NULL;
5210 } 5207 }
5208 } else {
5209 // Create dummy control flow so that variable liveness analysis
5210 // produces teh correct result.
5211 HControlInstruction* branch = New<HBranch>(graph()->GetConstantTrue());
5212 branch->SetSuccessorAt(0, body_entry);
5213 branch->SetSuccessorAt(1, loop_successor);
5214 FinishCurrentBlock(branch);
5215 set_current_block(body_entry);
5211 } 5216 }
5212 5217
5213 BreakAndContinueInfo break_info(stmt, scope()); 5218 BreakAndContinueInfo break_info(stmt, scope());
5214 if (current_block() != NULL) { 5219 if (current_block() != NULL) {
5215 BreakAndContinueScope push(&break_info, this); 5220 BreakAndContinueScope push(&break_info, this);
5216 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); 5221 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry));
5217 } 5222 }
5218 HBasicBlock* body_exit = 5223 HBasicBlock* body_exit =
5219 JoinContinue(stmt, current_block(), break_info.continue_block()); 5224 JoinContinue(stmt, current_block(), break_info.continue_block());
5220 5225
(...skipping 8349 matching lines...) Expand 10 before | Expand all | Expand 10 after
13570 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13575 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13571 } 13576 }
13572 13577
13573 #ifdef DEBUG 13578 #ifdef DEBUG
13574 graph_->Verify(false); // No full verify. 13579 graph_->Verify(false); // No full verify.
13575 #endif 13580 #endif
13576 } 13581 }
13577 13582
13578 } // namespace internal 13583 } // namespace internal
13579 } // namespace v8 13584 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-599710.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698