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

Side by Side Diff: src/compiler/bytecode-graph-builder.cc

Issue 1957393004: Allow Turbofan optimization of Ignition generators (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/compiler/bytecode-graph-builder.h" 5 #include "src/compiler/bytecode-graph-builder.h"
6 6
7 #include "src/compiler/bytecode-branch-analysis.h" 7 #include "src/compiler/bytecode-branch-analysis.h"
8 #include "src/compiler/linkage.h" 8 #include "src/compiler/linkage.h"
9 #include "src/compiler/operator-properties.h" 9 #include "src/compiler/operator-properties.h"
10 #include "src/interpreter/bytecodes.h" 10 #include "src/interpreter/bytecodes.h"
(...skipping 1349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 1360
1361 void BytecodeGraphBuilder::VisitForInStep() { 1361 void BytecodeGraphBuilder::VisitForInStep() {
1362 FrameStateBeforeAndAfter states(this); 1362 FrameStateBeforeAndAfter states(this);
1363 Node* index = 1363 Node* index =
1364 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); 1364 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0));
1365 index = NewNode(javascript()->ForInStep(), index); 1365 index = NewNode(javascript()->ForInStep(), index);
1366 environment()->BindAccumulator(index, &states); 1366 environment()->BindAccumulator(index, &states);
1367 } 1367 }
1368 1368
1369 void BytecodeGraphBuilder::VisitSuspendGenerator() { 1369 void BytecodeGraphBuilder::VisitSuspendGenerator() {
1370 UNIMPLEMENTED(); 1370 Node* state = environment()->LookupAccumulator();
1371 Node* generator = environment()->LookupRegister(
1372 bytecode_iterator().GetRegisterOperand(0));
1373
1374 for (int i = 0; i < environment()->register_count(); ++i) {
1375 NewNode(javascript()->CallRuntime(Runtime::kGeneratorWriteRegister),
Benedikt Meurer 2016/05/10 10:32:08 Nit: use StoreRegister or SetRegister instead of W
neis 2016/05/10 11:32:06 Done.
1376 generator, jsgraph()->Constant(i),
1377 environment()->LookupRegister(interpreter::Register(i)));
Michael Starzinger 2016/05/10 10:53:05 nit: Better pull out the "environment()->LookupReg
neis 2016/05/10 11:32:06 Done.
1378 }
1379
1380 NewNode(javascript()->CallRuntime(Runtime::kGeneratorSetContext), generator);
1381 NewNode(javascript()->CallRuntime(Runtime::kGeneratorSetContinuation),
1382 generator, state);
1371 } 1383 }
1372 1384
1373 void BytecodeGraphBuilder::VisitResumeGenerator() { 1385 void BytecodeGraphBuilder::VisitResumeGenerator() {
1374 UNIMPLEMENTED(); 1386 FrameStateBeforeAndAfter states(this);
1387
1388 Node* generator = environment()->LookupRegister(
1389 bytecode_iterator().GetRegisterOperand(0));
1390 Node* state = NewNode(javascript()->CallRuntime(
1391 Runtime::kGeneratorGetContinuation), generator);
1392
1393 // Bijection between registers and array indices must match that used in
1394 // InterpreterAssembler::ExportRegisterFile.
1395 for (int i = 0; i < environment()->register_count(); ++i) {
1396 Node* value = NewNode(
1397 javascript()->CallRuntime(Runtime::kGeneratorReadRegister),
Benedikt Meurer 2016/05/10 10:32:08 Nit: use LoadRegister instead of ReadRegister
neis 2016/05/10 11:32:06 Done.
1398 generator, jsgraph()->Constant(i));
1399 environment()->BindRegister(interpreter::Register(i), value);
1400
1401 NewNode(javascript()->CallRuntime(Runtime::kGeneratorWriteRegister),
1402 generator, jsgraph()->Constant(i), jsgraph()->StaleRegisterConstant());
1403 }
1404
1405 NewNode(javascript()->CallRuntime(Runtime::kGeneratorSetContinuation),
1406 generator, jsgraph()->Constant(JSGeneratorObject::kGeneratorExecuting));
1407
1408 environment()->BindAccumulator(state, &states);
1375 } 1409 }
1376 1410
1377 void BytecodeGraphBuilder::VisitWide() { 1411 void BytecodeGraphBuilder::VisitWide() {
1378 // Consumed by the BytecodeArrayIterator. 1412 // Consumed by the BytecodeArrayIterator.
1379 UNREACHABLE(); 1413 UNREACHABLE();
1380 } 1414 }
1381 1415
1382 void BytecodeGraphBuilder::VisitExtraWide() { 1416 void BytecodeGraphBuilder::VisitExtraWide() {
1383 // Consumed by the BytecodeArrayIterator. 1417 // Consumed by the BytecodeArrayIterator.
1384 UNREACHABLE(); 1418 UNREACHABLE();
1385 } 1419 }
1386 1420
1387 void BytecodeGraphBuilder::VisitIllegal() { 1421 void BytecodeGraphBuilder::VisitIllegal() {
1388 // Never present in valid bytecode. 1422 NewNode(javascript()->CallRuntime(Runtime::kAbort),
1389 UNREACHABLE(); 1423 jsgraph()->Constant(kIllegalBytecode));
1390 } 1424 }
1391 1425
1392 void BytecodeGraphBuilder::SwitchToMergeEnvironment(int current_offset) { 1426 void BytecodeGraphBuilder::SwitchToMergeEnvironment(int current_offset) {
1393 if (merge_environments_[current_offset] != nullptr) { 1427 if (merge_environments_[current_offset] != nullptr) {
1394 if (environment() != nullptr) { 1428 if (environment() != nullptr) {
1395 merge_environments_[current_offset]->Merge(environment()); 1429 merge_environments_[current_offset]->Merge(environment());
1396 } 1430 }
1397 set_environment(merge_environments_[current_offset]); 1431 set_environment(merge_environments_[current_offset]);
1398 } 1432 }
1399 } 1433 }
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 // Phi does not exist yet, introduce one. 1688 // Phi does not exist yet, introduce one.
1655 value = NewPhi(inputs, value, control); 1689 value = NewPhi(inputs, value, control);
1656 value->ReplaceInput(inputs - 1, other); 1690 value->ReplaceInput(inputs - 1, other);
1657 } 1691 }
1658 return value; 1692 return value;
1659 } 1693 }
1660 1694
1661 } // namespace compiler 1695 } // namespace compiler
1662 } // namespace internal 1696 } // namespace internal
1663 } // namespace v8 1697 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698