| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/machine-graph-verifier.h" | 5 #include "src/compiler/machine-graph-verifier.h" |
| 6 | 6 |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| 11 #include "src/compiler/node-properties.h" | 11 #include "src/compiler/node-properties.h" |
| 12 #include "src/compiler/node.h" | 12 #include "src/compiler/node.h" |
| 13 #include "src/compiler/schedule.h" | 13 #include "src/compiler/schedule.h" |
| 14 #include "src/zone/zone.h" | 14 #include "src/zone/zone.h" |
| 15 | 15 |
| 16 namespace v8 { | 16 namespace v8 { |
| 17 namespace internal { | 17 namespace internal { |
| 18 namespace compiler { | 18 namespace compiler { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 class MachineRepresentationInferrer { | 22 class MachineRepresentationInferrer { |
| 23 public: | 23 public: |
| 24 MachineRepresentationInferrer(Schedule const* schedule, Graph const* graph, | 24 MachineRepresentationInferrer(Schedule const* schedule, Graph const* graph, |
| 25 Linkage* linkage, Zone* zone) | 25 Linkage* linkage, Zone* zone) |
| 26 : schedule_(schedule), | 26 : schedule_(schedule), |
| 27 linkage_(linkage), | 27 linkage_(linkage), |
| 28 representation_vector_(graph->NodeCount(), zone) { | 28 representation_vector_(graph->NodeCount(), MachineRepresentation::kNone, |
| 29 zone) { |
| 29 Run(); | 30 Run(); |
| 30 } | 31 } |
| 31 | 32 |
| 32 MachineRepresentation GetRepresentation(Node const* node) const { | 33 MachineRepresentation GetRepresentation(Node const* node) const { |
| 33 return representation_vector_.at(node->id()); | 34 return representation_vector_.at(node->id()); |
| 34 } | 35 } |
| 35 | 36 |
| 36 private: | 37 private: |
| 37 MachineRepresentation GetProjectionType(Node const* projection) { | 38 MachineRepresentation GetProjectionType(Node const* projection) { |
| 38 size_t index = ProjectionIndexOf(projection->op()); | 39 size_t index = ProjectionIndexOf(projection->op()); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 } | 228 } |
| 228 } | 229 } |
| 229 | 230 |
| 230 Schedule const* const schedule_; | 231 Schedule const* const schedule_; |
| 231 Linkage const* const linkage_; | 232 Linkage const* const linkage_; |
| 232 ZoneVector<MachineRepresentation> representation_vector_; | 233 ZoneVector<MachineRepresentation> representation_vector_; |
| 233 }; | 234 }; |
| 234 | 235 |
| 235 class MachineRepresentationChecker { | 236 class MachineRepresentationChecker { |
| 236 public: | 237 public: |
| 237 MachineRepresentationChecker(Schedule const* const schedule, | 238 MachineRepresentationChecker( |
| 238 MachineRepresentationInferrer const* const typer) | 239 Schedule const* const schedule, |
| 239 : schedule_(schedule), typer_(typer) {} | 240 MachineRepresentationInferrer const* const inferrer) |
| 241 : schedule_(schedule), inferrer_(inferrer) {} |
| 240 | 242 |
| 241 void Run() { | 243 void Run() { |
| 242 BasicBlockVector const* blocks = schedule_->all_blocks(); | 244 BasicBlockVector const* blocks = schedule_->all_blocks(); |
| 243 for (BasicBlock* block : *blocks) { | 245 for (BasicBlock* block : *blocks) { |
| 244 for (size_t i = 0; i <= block->NodeCount(); ++i) { | 246 for (size_t i = 0; i <= block->NodeCount(); ++i) { |
| 245 Node const* node = | 247 Node const* node = |
| 246 i < block->NodeCount() ? block->NodeAt(i) : block->control_input(); | 248 i < block->NodeCount() ? block->NodeAt(i) : block->control_input(); |
| 247 if (node == nullptr) { | 249 if (node == nullptr) { |
| 248 DCHECK_EQ(block->NodeCount(), i); | 250 DCHECK_EQ(block->NodeCount(), i); |
| 249 break; | 251 break; |
| 250 } | 252 } |
| 251 switch (node->opcode()) { | 253 switch (node->opcode()) { |
| 252 case IrOpcode::kCall: | 254 case IrOpcode::kCall: |
| 253 case IrOpcode::kTailCall: | 255 case IrOpcode::kTailCall: |
| 254 CheckCallInputs(node); | 256 CheckCallInputs(node); |
| 255 break; | 257 break; |
| 256 case IrOpcode::kChangeBitToTagged: | 258 case IrOpcode::kChangeBitToTagged: |
| 257 CHECK_EQ(MachineRepresentation::kBit, | 259 CHECK_EQ(MachineRepresentation::kBit, |
| 258 typer_->GetRepresentation(node->InputAt(0))); | 260 inferrer_->GetRepresentation(node->InputAt(0))); |
| 259 break; | 261 break; |
| 260 case IrOpcode::kChangeTaggedToBit: | 262 case IrOpcode::kChangeTaggedToBit: |
| 261 CHECK_EQ(MachineRepresentation::kTagged, | 263 CHECK_EQ(MachineRepresentation::kTagged, |
| 262 typer_->GetRepresentation(node->InputAt(0))); | 264 inferrer_->GetRepresentation(node->InputAt(0))); |
| 263 break; | 265 break; |
| 264 case IrOpcode::kRoundInt64ToFloat64: | 266 case IrOpcode::kRoundInt64ToFloat64: |
| 265 case IrOpcode::kRoundUint64ToFloat64: | 267 case IrOpcode::kRoundUint64ToFloat64: |
| 266 case IrOpcode::kRoundInt64ToFloat32: | 268 case IrOpcode::kRoundInt64ToFloat32: |
| 267 case IrOpcode::kRoundUint64ToFloat32: | 269 case IrOpcode::kRoundUint64ToFloat32: |
| 268 case IrOpcode::kTruncateInt64ToInt32: | 270 case IrOpcode::kTruncateInt64ToInt32: |
| 269 CheckValueInputForInt64Op(node, 0); | 271 CheckValueInputForInt64Op(node, 0); |
| 270 break; | 272 break; |
| 271 case IrOpcode::kBitcastWordToTagged: | 273 case IrOpcode::kBitcastWordToTagged: |
| 272 case IrOpcode::kBitcastWordToTaggedSigned: | 274 case IrOpcode::kBitcastWordToTaggedSigned: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 283 case IrOpcode::kChangeFloat64ToUint32: | 285 case IrOpcode::kChangeFloat64ToUint32: |
| 284 case IrOpcode::kRoundFloat64ToInt32: | 286 case IrOpcode::kRoundFloat64ToInt32: |
| 285 case IrOpcode::kFloat64ExtractLowWord32: | 287 case IrOpcode::kFloat64ExtractLowWord32: |
| 286 case IrOpcode::kFloat64ExtractHighWord32: | 288 case IrOpcode::kFloat64ExtractHighWord32: |
| 287 case IrOpcode::kBitcastFloat64ToInt64: | 289 case IrOpcode::kBitcastFloat64ToInt64: |
| 288 CheckValueInputForFloat64Op(node, 0); | 290 CheckValueInputForFloat64Op(node, 0); |
| 289 break; | 291 break; |
| 290 case IrOpcode::kWord64Equal: | 292 case IrOpcode::kWord64Equal: |
| 291 CheckValueInputIsTaggedOrPointer(node, 0); | 293 CheckValueInputIsTaggedOrPointer(node, 0); |
| 292 CheckValueInputRepresentationIs( | 294 CheckValueInputRepresentationIs( |
| 293 node, 1, typer_->GetRepresentation(node->InputAt(0))); | 295 node, 1, inferrer_->GetRepresentation(node->InputAt(0))); |
| 294 break; | 296 break; |
| 295 case IrOpcode::kInt64LessThan: | 297 case IrOpcode::kInt64LessThan: |
| 296 case IrOpcode::kInt64LessThanOrEqual: | 298 case IrOpcode::kInt64LessThanOrEqual: |
| 297 case IrOpcode::kUint64LessThan: | 299 case IrOpcode::kUint64LessThan: |
| 298 case IrOpcode::kUint64LessThanOrEqual: | 300 case IrOpcode::kUint64LessThanOrEqual: |
| 299 CheckValueInputForInt64Op(node, 0); | 301 CheckValueInputForInt64Op(node, 0); |
| 300 CheckValueInputForInt64Op(node, 1); | 302 CheckValueInputForInt64Op(node, 1); |
| 301 break; | 303 break; |
| 302 case IrOpcode::kInt32x4ExtractLane: | 304 case IrOpcode::kInt32x4ExtractLane: |
| 303 CheckValueInputRepresentationIs(node, 0, | 305 CheckValueInputRepresentationIs(node, 0, |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 case MachineRepresentation::kTaggedPointer: | 395 case MachineRepresentation::kTaggedPointer: |
| 394 case MachineRepresentation::kTaggedSigned: | 396 case MachineRepresentation::kTaggedSigned: |
| 395 CheckValueInputIsTagged(node, 2); | 397 CheckValueInputIsTagged(node, 2); |
| 396 break; | 398 break; |
| 397 default: | 399 default: |
| 398 CheckValueInputRepresentationIs( | 400 CheckValueInputRepresentationIs( |
| 399 node, 2, AtomicStoreRepresentationOf(node->op())); | 401 node, 2, AtomicStoreRepresentationOf(node->op())); |
| 400 } | 402 } |
| 401 break; | 403 break; |
| 402 case IrOpcode::kPhi: | 404 case IrOpcode::kPhi: |
| 403 switch (typer_->GetRepresentation(node)) { | 405 switch (inferrer_->GetRepresentation(node)) { |
| 404 case MachineRepresentation::kTagged: | 406 case MachineRepresentation::kTagged: |
| 405 case MachineRepresentation::kTaggedPointer: | 407 case MachineRepresentation::kTaggedPointer: |
| 406 case MachineRepresentation::kTaggedSigned: | 408 case MachineRepresentation::kTaggedSigned: |
| 407 for (int i = 0; i < node->op()->ValueInputCount(); ++i) { | 409 for (int i = 0; i < node->op()->ValueInputCount(); ++i) { |
| 408 CheckValueInputIsTagged(node, i); | 410 CheckValueInputIsTagged(node, i); |
| 409 } | 411 } |
| 410 break; | 412 break; |
| 411 default: | 413 default: |
| 412 for (int i = 0; i < node->op()->ValueInputCount(); ++i) { | 414 for (int i = 0; i < node->op()->ValueInputCount(); ++i) { |
| 413 CheckValueInputRepresentationIs( | 415 CheckValueInputRepresentationIs( |
| 414 node, i, typer_->GetRepresentation(node)); | 416 node, i, inferrer_->GetRepresentation(node)); |
| 415 } | 417 } |
| 416 break; | 418 break; |
| 417 } | 419 } |
| 418 break; | 420 break; |
| 419 case IrOpcode::kBranch: | 421 case IrOpcode::kBranch: |
| 420 case IrOpcode::kSwitch: | 422 case IrOpcode::kSwitch: |
| 421 CheckValueInputForInt32Op(node, 0); | 423 CheckValueInputForInt32Op(node, 0); |
| 422 break; | 424 break; |
| 423 case IrOpcode::kReturn: | 425 case IrOpcode::kReturn: |
| 424 // TODO(epertoso): use the linkage to determine which tipe we | 426 // TODO(epertoso): use the linkage to determine which tipe we |
| (...skipping 12 matching lines...) Expand all Loading... |
| 437 break; | 439 break; |
| 438 } | 440 } |
| 439 } | 441 } |
| 440 } | 442 } |
| 441 } | 443 } |
| 442 | 444 |
| 443 private: | 445 private: |
| 444 void CheckValueInputRepresentationIs(Node const* node, int index, | 446 void CheckValueInputRepresentationIs(Node const* node, int index, |
| 445 MachineRepresentation representation) { | 447 MachineRepresentation representation) { |
| 446 Node const* input = node->InputAt(index); | 448 Node const* input = node->InputAt(index); |
| 447 if (typer_->GetRepresentation(input) != representation) { | 449 if (inferrer_->GetRepresentation(input) != representation) { |
| 448 std::stringstream str; | 450 std::stringstream str; |
| 449 str << "TypeError: node #" << node->id() << ":" << *node->op() | 451 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 450 << " uses node #" << input->id() << ":" << *input->op() | 452 << " uses node #" << input->id() << ":" << *input->op() |
| 451 << " which doesn't have a " << MachineReprToString(representation) | 453 << " which doesn't have a " << MachineReprToString(representation) |
| 452 << " representation."; | 454 << " representation."; |
| 453 FATAL(str.str().c_str()); | 455 FATAL(str.str().c_str()); |
| 454 } | 456 } |
| 455 } | 457 } |
| 456 | 458 |
| 457 void CheckValueInputIsTagged(Node const* node, int index) { | 459 void CheckValueInputIsTagged(Node const* node, int index) { |
| 458 Node const* input = node->InputAt(index); | 460 Node const* input = node->InputAt(index); |
| 459 switch (typer_->GetRepresentation(input)) { | 461 switch (inferrer_->GetRepresentation(input)) { |
| 460 case MachineRepresentation::kTagged: | 462 case MachineRepresentation::kTagged: |
| 461 case MachineRepresentation::kTaggedPointer: | 463 case MachineRepresentation::kTaggedPointer: |
| 462 case MachineRepresentation::kTaggedSigned: | 464 case MachineRepresentation::kTaggedSigned: |
| 463 return; | 465 return; |
| 464 default: | 466 default: |
| 465 break; | 467 break; |
| 466 } | 468 } |
| 467 std::ostringstream str; | 469 std::ostringstream str; |
| 468 str << "TypeError: node #" << node->id() << ":" << *node->op() | 470 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 469 << " uses node #" << input->id() << ":" << *input->op() | 471 << " uses node #" << input->id() << ":" << *input->op() |
| 470 << " which doesn't have a tagged representation."; | 472 << " which doesn't have a tagged representation."; |
| 471 FATAL(str.str().c_str()); | 473 FATAL(str.str().c_str()); |
| 472 } | 474 } |
| 473 | 475 |
| 474 void CheckValueInputIsTaggedOrPointer(Node const* node, int index) { | 476 void CheckValueInputIsTaggedOrPointer(Node const* node, int index) { |
| 475 Node const* input = node->InputAt(index); | 477 Node const* input = node->InputAt(index); |
| 476 switch (typer_->GetRepresentation(input)) { | 478 switch (inferrer_->GetRepresentation(input)) { |
| 477 case MachineRepresentation::kTagged: | 479 case MachineRepresentation::kTagged: |
| 478 case MachineRepresentation::kTaggedPointer: | 480 case MachineRepresentation::kTaggedPointer: |
| 479 case MachineRepresentation::kTaggedSigned: | 481 case MachineRepresentation::kTaggedSigned: |
| 480 return; | 482 return; |
| 481 default: | 483 default: |
| 482 break; | 484 break; |
| 483 } | 485 } |
| 484 if (typer_->GetRepresentation(input) != | 486 if (inferrer_->GetRepresentation(input) != |
| 485 MachineType::PointerRepresentation()) { | 487 MachineType::PointerRepresentation()) { |
| 486 std::ostringstream str; | 488 std::ostringstream str; |
| 487 str << "TypeError: node #" << node->id() << ":" << *node->op() | 489 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 488 << " uses node #" << input->id() << ":" << *input->op() | 490 << " uses node #" << input->id() << ":" << *input->op() |
| 489 << " which doesn't have a tagged or pointer representation."; | 491 << " which doesn't have a tagged or pointer representation."; |
| 490 FATAL(str.str().c_str()); | 492 FATAL(str.str().c_str()); |
| 491 } | 493 } |
| 492 } | 494 } |
| 493 | 495 |
| 494 void CheckValueInputForInt32Op(Node const* node, int index) { | 496 void CheckValueInputForInt32Op(Node const* node, int index) { |
| 495 Node const* input = node->InputAt(index); | 497 Node const* input = node->InputAt(index); |
| 496 switch (typer_->GetRepresentation(input)) { | 498 switch (inferrer_->GetRepresentation(input)) { |
| 497 case MachineRepresentation::kBit: | 499 case MachineRepresentation::kBit: |
| 498 case MachineRepresentation::kWord8: | 500 case MachineRepresentation::kWord8: |
| 499 case MachineRepresentation::kWord16: | 501 case MachineRepresentation::kWord16: |
| 500 case MachineRepresentation::kWord32: | 502 case MachineRepresentation::kWord32: |
| 501 return; | 503 return; |
| 502 case MachineRepresentation::kNone: { | 504 case MachineRepresentation::kNone: { |
| 503 std::ostringstream str; | 505 std::ostringstream str; |
| 504 str << "TypeError: node #" << input->id() << ":" << *input->op() | 506 str << "TypeError: node #" << input->id() << ":" << *input->op() |
| 505 << " is untyped."; | 507 << " is untyped."; |
| 506 FATAL(str.str().c_str()); | 508 FATAL(str.str().c_str()); |
| 507 break; | 509 break; |
| 508 } | 510 } |
| 509 default: | 511 default: |
| 510 break; | 512 break; |
| 511 } | 513 } |
| 512 std::ostringstream str; | 514 std::ostringstream str; |
| 513 str << "TypeError: node #" << node->id() << ":" << *node->op() | 515 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 514 << " uses node #" << input->id() << ":" << *input->op() | 516 << " uses node #" << input->id() << ":" << *input->op() |
| 515 << " which doesn't have an int32-compatible representation."; | 517 << " which doesn't have an int32-compatible representation."; |
| 516 FATAL(str.str().c_str()); | 518 FATAL(str.str().c_str()); |
| 517 } | 519 } |
| 518 | 520 |
| 519 void CheckValueInputForInt64Op(Node const* node, int index) { | 521 void CheckValueInputForInt64Op(Node const* node, int index) { |
| 520 Node const* input = node->InputAt(index); | 522 Node const* input = node->InputAt(index); |
| 521 switch (typer_->GetRepresentation(input)) { | 523 switch (inferrer_->GetRepresentation(input)) { |
| 522 case MachineRepresentation::kWord64: | 524 case MachineRepresentation::kWord64: |
| 523 return; | 525 return; |
| 524 case MachineRepresentation::kNone: { | 526 case MachineRepresentation::kNone: { |
| 525 std::ostringstream str; | 527 std::ostringstream str; |
| 526 str << "TypeError: node #" << input->id() << ":" << *input->op() | 528 str << "TypeError: node #" << input->id() << ":" << *input->op() |
| 527 << " is untyped."; | 529 << " is untyped."; |
| 528 FATAL(str.str().c_str()); | 530 FATAL(str.str().c_str()); |
| 529 break; | 531 break; |
| 530 } | 532 } |
| 531 | 533 |
| 532 default: | 534 default: |
| 533 break; | 535 break; |
| 534 } | 536 } |
| 535 std::ostringstream str; | 537 std::ostringstream str; |
| 536 str << "TypeError: node #" << node->id() << ":" << *node->op() | 538 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 537 << " uses node #" << input->id() << ":" << *input->op() | 539 << " uses node #" << input->id() << ":" << *input->op() |
| 538 << " which doesn't have a kWord64 representation."; | 540 << " which doesn't have a kWord64 representation."; |
| 539 FATAL(str.str().c_str()); | 541 FATAL(str.str().c_str()); |
| 540 } | 542 } |
| 541 | 543 |
| 542 void CheckValueInputForFloat32Op(Node const* node, int index) { | 544 void CheckValueInputForFloat32Op(Node const* node, int index) { |
| 543 Node const* input = node->InputAt(index); | 545 Node const* input = node->InputAt(index); |
| 544 if (MachineRepresentation::kFloat32 == typer_->GetRepresentation(input)) { | 546 if (MachineRepresentation::kFloat32 == |
| 547 inferrer_->GetRepresentation(input)) { |
| 545 return; | 548 return; |
| 546 } | 549 } |
| 547 std::ostringstream str; | 550 std::ostringstream str; |
| 548 str << "TypeError: node #" << node->id() << ":" << *node->op() | 551 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 549 << " uses node #" << input->id() << ":" << *input->op() | 552 << " uses node #" << input->id() << ":" << *input->op() |
| 550 << " which doesn't have a kFloat32 representation."; | 553 << " which doesn't have a kFloat32 representation."; |
| 551 FATAL(str.str().c_str()); | 554 FATAL(str.str().c_str()); |
| 552 } | 555 } |
| 553 | 556 |
| 554 void CheckValueInputForFloat64Op(Node const* node, int index) { | 557 void CheckValueInputForFloat64Op(Node const* node, int index) { |
| 555 Node const* input = node->InputAt(index); | 558 Node const* input = node->InputAt(index); |
| 556 if (MachineRepresentation::kFloat64 == typer_->GetRepresentation(input)) { | 559 if (MachineRepresentation::kFloat64 == |
| 560 inferrer_->GetRepresentation(input)) { |
| 557 return; | 561 return; |
| 558 } | 562 } |
| 559 std::ostringstream str; | 563 std::ostringstream str; |
| 560 str << "TypeError: node #" << node->id() << ":" << *node->op() | 564 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 561 << " uses node #" << input->id() << ":" << *input->op() | 565 << " uses node #" << input->id() << ":" << *input->op() |
| 562 << " which doesn't have a kFloat64 representation."; | 566 << " which doesn't have a kFloat64 representation."; |
| 563 FATAL(str.str().c_str()); | 567 FATAL(str.str().c_str()); |
| 564 } | 568 } |
| 565 | 569 |
| 566 void CheckCallInputs(Node const* node) { | 570 void CheckCallInputs(Node const* node) { |
| 567 CallDescriptor const* desc = CallDescriptorOf(node->op()); | 571 CallDescriptor const* desc = CallDescriptorOf(node->op()); |
| 568 std::ostringstream str; | 572 std::ostringstream str; |
| 569 bool should_log_error = false; | 573 bool should_log_error = false; |
| 570 for (size_t i = 0; i < desc->InputCount(); ++i) { | 574 for (size_t i = 0; i < desc->InputCount(); ++i) { |
| 571 Node const* input = node->InputAt(static_cast<int>(i)); | 575 Node const* input = node->InputAt(static_cast<int>(i)); |
| 572 MachineRepresentation const input_type = typer_->GetRepresentation(input); | 576 MachineRepresentation const input_type = |
| 577 inferrer_->GetRepresentation(input); |
| 573 MachineRepresentation const expected_input_type = | 578 MachineRepresentation const expected_input_type = |
| 574 desc->GetInputType(i).representation(); | 579 desc->GetInputType(i).representation(); |
| 575 if (!IsCompatible(expected_input_type, input_type)) { | 580 if (!IsCompatible(expected_input_type, input_type)) { |
| 576 if (!should_log_error) { | 581 if (!should_log_error) { |
| 577 should_log_error = true; | 582 should_log_error = true; |
| 578 str << "TypeError: node #" << node->id() << ":" << *node->op() | 583 str << "TypeError: node #" << node->id() << ":" << *node->op() |
| 579 << " has wrong type for:" << std::endl; | 584 << " has wrong type for:" << std::endl; |
| 580 } else { | 585 } else { |
| 581 str << std::endl; | 586 str << std::endl; |
| 582 } | 587 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 actual == MachineRepresentation::kWord8 || | 647 actual == MachineRepresentation::kWord8 || |
| 643 actual == MachineRepresentation::kWord16 || | 648 actual == MachineRepresentation::kWord16 || |
| 644 actual == MachineRepresentation::kWord32); | 649 actual == MachineRepresentation::kWord32); |
| 645 case MachineRepresentation::kNone: | 650 case MachineRepresentation::kNone: |
| 646 UNREACHABLE(); | 651 UNREACHABLE(); |
| 647 } | 652 } |
| 648 return false; | 653 return false; |
| 649 } | 654 } |
| 650 | 655 |
| 651 Schedule const* const schedule_; | 656 Schedule const* const schedule_; |
| 652 MachineRepresentationInferrer const* const typer_; | 657 MachineRepresentationInferrer const* const inferrer_; |
| 653 }; | 658 }; |
| 654 | 659 |
| 655 } // namespace | 660 } // namespace |
| 656 | 661 |
| 657 void MachineGraphVerifier::Run(Graph* graph, Schedule const* const schedule, | 662 void MachineGraphVerifier::Run(Graph* graph, Schedule const* const schedule, |
| 658 Linkage* linkage, Zone* temp_zone) { | 663 Linkage* linkage, Zone* temp_zone) { |
| 659 MachineRepresentationInferrer representation_inferrer(schedule, graph, | 664 MachineRepresentationInferrer representation_inferrer(schedule, graph, |
| 660 linkage, temp_zone); | 665 linkage, temp_zone); |
| 661 MachineRepresentationChecker checker(schedule, &representation_inferrer); | 666 MachineRepresentationChecker checker(schedule, &representation_inferrer); |
| 662 checker.Run(); | 667 checker.Run(); |
| 663 } | 668 } |
| 664 | 669 |
| 665 } // namespace compiler | 670 } // namespace compiler |
| 666 } // namespace internal | 671 } // namespace internal |
| 667 } // namespace v8 | 672 } // namespace v8 |
| OLD | NEW |