Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1011 UpdateControlDependencyToLeaveFunction(control); | 1011 UpdateControlDependencyToLeaveFunction(control); |
| 1012 environment()->BindAccumulator(value); | 1012 environment()->BindAccumulator(value); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 | 1015 |
| 1016 void BytecodeGraphBuilder::BuildBinaryOp( | 1016 void BytecodeGraphBuilder::BuildBinaryOp( |
| 1017 const Operator* js_op, const interpreter::BytecodeArrayIterator& iterator) { | 1017 const Operator* js_op, const interpreter::BytecodeArrayIterator& iterator) { |
| 1018 Node* left = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | 1018 Node* left = environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1019 Node* right = environment()->LookupAccumulator(); | 1019 Node* right = environment()->LookupAccumulator(); |
| 1020 Node* node = NewNode(js_op, left, right); | 1020 Node* node = NewNode(js_op, left, right); |
| 1021 | |
| 1022 AddEmptyFrameStateInputs(node); | 1021 AddEmptyFrameStateInputs(node); |
| 1023 environment()->BindAccumulator(node); | 1022 environment()->BindAccumulator(node); |
| 1024 } | 1023 } |
| 1025 | 1024 |
| 1026 | 1025 |
| 1027 void BytecodeGraphBuilder::VisitAdd( | 1026 void BytecodeGraphBuilder::VisitAdd( |
| 1028 const interpreter::BytecodeArrayIterator& iterator) { | 1027 const interpreter::BytecodeArrayIterator& iterator) { |
| 1029 BinaryOperationHints hints = BinaryOperationHints::Any(); | 1028 BinaryOperationHints hints = BinaryOperationHints::Any(); |
| 1030 BuildBinaryOp(javascript()->Add(language_mode(), hints), iterator); | 1029 BuildBinaryOp(javascript()->Add(language_mode(), hints), iterator); |
| 1031 } | 1030 } |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1254 BuildCastOperator(javascript()->ToName(), iterator); | 1253 BuildCastOperator(javascript()->ToName(), iterator); |
| 1255 } | 1254 } |
| 1256 | 1255 |
| 1257 | 1256 |
| 1258 void BytecodeGraphBuilder::VisitToNumber( | 1257 void BytecodeGraphBuilder::VisitToNumber( |
| 1259 const interpreter::BytecodeArrayIterator& iterator) { | 1258 const interpreter::BytecodeArrayIterator& iterator) { |
| 1260 BuildCastOperator(javascript()->ToNumber(), iterator); | 1259 BuildCastOperator(javascript()->ToNumber(), iterator); |
| 1261 } | 1260 } |
| 1262 | 1261 |
| 1263 | 1262 |
| 1264 void BytecodeGraphBuilder::VisitToObject( | |
| 1265 const interpreter::BytecodeArrayIterator& iterator) { | |
| 1266 BuildCastOperator(javascript()->ToObject(), iterator); | |
| 1267 } | |
| 1268 | |
| 1269 | |
| 1270 void BytecodeGraphBuilder::VisitJump( | 1263 void BytecodeGraphBuilder::VisitJump( |
| 1271 const interpreter::BytecodeArrayIterator& iterator) { | 1264 const interpreter::BytecodeArrayIterator& iterator) { |
| 1272 BuildJump(); | 1265 BuildJump(); |
| 1273 } | 1266 } |
| 1274 | 1267 |
| 1275 | 1268 |
| 1276 void BytecodeGraphBuilder::VisitJumpConstant( | 1269 void BytecodeGraphBuilder::VisitJumpConstant( |
| 1277 const interpreter::BytecodeArrayIterator& iterator) { | 1270 const interpreter::BytecodeArrayIterator& iterator) { |
| 1278 BuildJump(); | 1271 BuildJump(); |
| 1279 } | 1272 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1367 const interpreter::BytecodeArrayIterator& iterator) { | 1360 const interpreter::BytecodeArrayIterator& iterator) { |
| 1368 Node* control = | 1361 Node* control = |
| 1369 NewNode(common()->Return(), environment()->LookupAccumulator()); | 1362 NewNode(common()->Return(), environment()->LookupAccumulator()); |
| 1370 UpdateControlDependencyToLeaveFunction(control); | 1363 UpdateControlDependencyToLeaveFunction(control); |
| 1371 set_environment(nullptr); | 1364 set_environment(nullptr); |
| 1372 } | 1365 } |
| 1373 | 1366 |
| 1374 | 1367 |
| 1375 void BytecodeGraphBuilder::VisitForInPrepare( | 1368 void BytecodeGraphBuilder::VisitForInPrepare( |
| 1376 const interpreter::BytecodeArrayIterator& iterator) { | 1369 const interpreter::BytecodeArrayIterator& iterator) { |
| 1377 UNIMPLEMENTED(); | 1370 // Bytecode generator only reaches here if the object is not null or |
| 1371 // undefined, whereas ast-graph-builder has to check. | |
| 1372 Node* object = environment()->LookupAccumulator(); | |
| 1373 Node* receiver = NewNode(javascript()->ToObject(), object); | |
| 1374 AddEmptyFrameStateInputs(receiver); | |
| 1375 Node* prepare = NewNode(javascript()->ForInPrepare(), receiver); | |
| 1376 AddEmptyFrameStateInputs(prepare); | |
|
rmcilroy
2015/12/17 15:43:26
Hmm, this is a bit troubling for deopt - you have
oth
2015/12/17 19:28:23
NP. Will re-spin shortly. The interpreter needs a
| |
| 1377 Node* cache_type = NewNode(common()->Projection(0), prepare); | |
| 1378 Node* cache_array = NewNode(common()->Projection(1), prepare); | |
| 1379 Node* cache_length = NewNode(common()->Projection(2), prepare); | |
| 1380 environment()->BindRegister(iterator.GetRegisterOperand(0), receiver); | |
| 1381 environment()->BindRegister(iterator.GetRegisterOperand(1), cache_type); | |
| 1382 environment()->BindRegister(iterator.GetRegisterOperand(2), cache_array); | |
| 1383 environment()->BindRegister(iterator.GetRegisterOperand(3), cache_length); | |
| 1384 } | |
| 1385 | |
| 1386 | |
| 1387 void BytecodeGraphBuilder::VisitForInDone( | |
| 1388 const interpreter::BytecodeArrayIterator& iterator) { | |
| 1389 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); | |
| 1390 Node* cache_length = | |
| 1391 environment()->LookupRegister(iterator.GetRegisterOperand(1)); | |
| 1392 Node* exit_cond = NewNode(javascript()->ForInDone(), index, cache_length); | |
| 1393 AddEmptyFrameStateInputs(exit_cond); | |
| 1394 environment()->BindAccumulator(exit_cond); | |
| 1378 } | 1395 } |
| 1379 | 1396 |
| 1380 | 1397 |
| 1381 void BytecodeGraphBuilder::VisitForInNext( | 1398 void BytecodeGraphBuilder::VisitForInNext( |
| 1382 const interpreter::BytecodeArrayIterator& iterator) { | 1399 const interpreter::BytecodeArrayIterator& iterator) { |
| 1383 UNIMPLEMENTED(); | 1400 Node* receiver = |
| 1401 environment()->LookupRegister(iterator.GetRegisterOperand(0)); | |
| 1402 Node* cache_type = | |
| 1403 environment()->LookupRegister(iterator.GetRegisterOperand(1)); | |
| 1404 Node* cache_array = | |
| 1405 environment()->LookupRegister(iterator.GetRegisterOperand(2)); | |
| 1406 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(3)); | |
| 1407 Node* value = NewNode(javascript()->ForInNext(), receiver, cache_array, | |
| 1408 cache_type, index); | |
| 1409 AddEmptyFrameStateInputs(value); | |
| 1410 environment()->BindAccumulator(value); | |
| 1384 } | 1411 } |
| 1385 | 1412 |
| 1386 | 1413 |
| 1387 void BytecodeGraphBuilder::VisitForInDone( | 1414 void BytecodeGraphBuilder::VisitForInStep( |
| 1388 const interpreter::BytecodeArrayIterator& iterator) { | 1415 const interpreter::BytecodeArrayIterator& iterator) { |
| 1389 UNIMPLEMENTED(); | 1416 Node* index = environment()->LookupRegister(iterator.GetRegisterOperand(0)); |
| 1417 index = NewNode(javascript()->ForInStep(), index); | |
| 1418 AddEmptyFrameStateInputs(index); | |
| 1419 environment()->BindRegister(iterator.GetRegisterOperand(0), index); | |
| 1390 } | 1420 } |
| 1391 | 1421 |
| 1392 | 1422 |
| 1393 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( | 1423 void BytecodeGraphBuilder::MergeEnvironmentsOfBackwardBranches( |
| 1394 int source_offset, int target_offset) { | 1424 int source_offset, int target_offset) { |
| 1395 DCHECK_GE(source_offset, target_offset); | 1425 DCHECK_GE(source_offset, target_offset); |
| 1396 const ZoneVector<int>* branch_sites = | 1426 const ZoneVector<int>* branch_sites = |
| 1397 branch_analysis()->BackwardBranchesTargetting(target_offset); | 1427 branch_analysis()->BackwardBranchesTargetting(target_offset); |
| 1398 if (branch_sites->back() == source_offset) { | 1428 if (branch_sites->back() == source_offset) { |
| 1399 // The set of back branches is complete, merge them. | 1429 // The set of back branches is complete, merge them. |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1632 | 1662 |
| 1633 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1663 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { |
| 1634 if (environment()->IsMarkedAsUnreachable()) return; | 1664 if (environment()->IsMarkedAsUnreachable()) return; |
| 1635 environment()->MarkAsUnreachable(); | 1665 environment()->MarkAsUnreachable(); |
| 1636 exit_controls_.push_back(exit); | 1666 exit_controls_.push_back(exit); |
| 1637 } | 1667 } |
| 1638 | 1668 |
| 1639 } // namespace compiler | 1669 } // namespace compiler |
| 1640 } // namespace internal | 1670 } // namespace internal |
| 1641 } // namespace v8 | 1671 } // namespace v8 |
| OLD | NEW |