| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "test/unittests/compiler/graph-unittest.h" | 5 #include "test/unittests/compiler/graph-unittest.h" | 
| 6 | 6 | 
| 7 #include <ostream>  // NOLINT(readability/streams) | 7 #include <ostream>  // NOLINT(readability/streams) | 
| 8 | 8 | 
| 9 #include "src/compiler/node-properties-inl.h" | 9 #include "src/compiler/node-properties-inl.h" | 
|  | 10 #include "src/compiler/simplified-operator.h" | 
| 10 | 11 | 
| 11 using testing::_; | 12 using testing::_; | 
| 12 using testing::MakeMatcher; | 13 using testing::MakeMatcher; | 
| 13 using testing::MatcherInterface; | 14 using testing::MatcherInterface; | 
| 14 using testing::MatchResultListener; | 15 using testing::MatchResultListener; | 
| 15 using testing::StringMatchResultListener; | 16 using testing::StringMatchResultListener; | 
| 16 | 17 | 
| 17 namespace v8 { | 18 namespace v8 { | 
| 18 namespace internal { | 19 namespace internal { | 
| 19 | 20 | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61 Node* GraphTest::Int64Constant(int64_t value) { | 62 Node* GraphTest::Int64Constant(int64_t value) { | 
| 62   return graph()->NewNode(common()->Int64Constant(value)); | 63   return graph()->NewNode(common()->Int64Constant(value)); | 
| 63 } | 64 } | 
| 64 | 65 | 
| 65 | 66 | 
| 66 Node* GraphTest::NumberConstant(volatile double value) { | 67 Node* GraphTest::NumberConstant(volatile double value) { | 
| 67   return graph()->NewNode(common()->NumberConstant(value)); | 68   return graph()->NewNode(common()->NumberConstant(value)); | 
| 68 } | 69 } | 
| 69 | 70 | 
| 70 | 71 | 
|  | 72 Node* GraphTest::HeapConstant(const Handle<HeapObject>& value) { | 
|  | 73   return HeapConstant(Unique<HeapObject>::CreateUninitialized(value)); | 
|  | 74 } | 
|  | 75 | 
|  | 76 | 
| 71 Node* GraphTest::HeapConstant(const Unique<HeapObject>& value) { | 77 Node* GraphTest::HeapConstant(const Unique<HeapObject>& value) { | 
| 72   return graph()->NewNode(common()->HeapConstant(value)); | 78   Node* node = graph()->NewNode(common()->HeapConstant(value)); | 
|  | 79   Type* type = Type::Constant(value.handle(), zone()); | 
|  | 80   NodeProperties::SetBounds(node, Bounds(type)); | 
|  | 81   return node; | 
| 73 } | 82 } | 
| 74 | 83 | 
| 75 | 84 | 
| 76 Node* GraphTest::FalseConstant() { | 85 Node* GraphTest::FalseConstant() { | 
| 77   return HeapConstant( | 86   return HeapConstant( | 
| 78       Unique<HeapObject>::CreateImmovable(factory()->false_value())); | 87       Unique<HeapObject>::CreateImmovable(factory()->false_value())); | 
| 79 } | 88 } | 
| 80 | 89 | 
| 81 | 90 | 
| 82 Node* GraphTest::TrueConstant() { | 91 Node* GraphTest::TrueConstant() { | 
| 83   return HeapConstant( | 92   return HeapConstant( | 
| 84       Unique<HeapObject>::CreateImmovable(factory()->true_value())); | 93       Unique<HeapObject>::CreateImmovable(factory()->true_value())); | 
| 85 } | 94 } | 
| 86 | 95 | 
| 87 | 96 | 
|  | 97 Node* GraphTest::UndefinedConstant() { | 
|  | 98   return HeapConstant( | 
|  | 99       Unique<HeapObject>::CreateImmovable(factory()->undefined_value())); | 
|  | 100 } | 
|  | 101 | 
|  | 102 | 
| 88 Matcher<Node*> GraphTest::IsFalseConstant() { | 103 Matcher<Node*> GraphTest::IsFalseConstant() { | 
| 89   return IsHeapConstant( | 104   return IsHeapConstant( | 
| 90       Unique<HeapObject>::CreateImmovable(factory()->false_value())); | 105       Unique<HeapObject>::CreateImmovable(factory()->false_value())); | 
| 91 } | 106 } | 
| 92 | 107 | 
| 93 | 108 | 
| 94 Matcher<Node*> GraphTest::IsTrueConstant() { | 109 Matcher<Node*> GraphTest::IsTrueConstant() { | 
| 95   return IsHeapConstant( | 110   return IsHeapConstant( | 
| 96       Unique<HeapObject>::CreateImmovable(factory()->true_value())); | 111       Unique<HeapObject>::CreateImmovable(factory()->true_value())); | 
| 97 } | 112 } | 
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 423   const Matcher<CallDescriptor*> descriptor_matcher_; | 438   const Matcher<CallDescriptor*> descriptor_matcher_; | 
| 424   const Matcher<Node*> value0_matcher_; | 439   const Matcher<Node*> value0_matcher_; | 
| 425   const Matcher<Node*> value1_matcher_; | 440   const Matcher<Node*> value1_matcher_; | 
| 426   const Matcher<Node*> value2_matcher_; | 441   const Matcher<Node*> value2_matcher_; | 
| 427   const Matcher<Node*> value3_matcher_; | 442   const Matcher<Node*> value3_matcher_; | 
| 428   const Matcher<Node*> effect_matcher_; | 443   const Matcher<Node*> effect_matcher_; | 
| 429   const Matcher<Node*> control_matcher_; | 444   const Matcher<Node*> control_matcher_; | 
| 430 }; | 445 }; | 
| 431 | 446 | 
| 432 | 447 | 
|  | 448 class IsLoadFieldMatcher FINAL : public NodeMatcher { | 
|  | 449  public: | 
|  | 450   IsLoadFieldMatcher(const Matcher<FieldAccess>& access_matcher, | 
|  | 451                      const Matcher<Node*>& base_matcher, | 
|  | 452                      const Matcher<Node*>& effect_matcher) | 
|  | 453       : NodeMatcher(IrOpcode::kLoadField), | 
|  | 454         access_matcher_(access_matcher), | 
|  | 455         base_matcher_(base_matcher), | 
|  | 456         effect_matcher_(effect_matcher) {} | 
|  | 457 | 
|  | 458   virtual void DescribeTo(std::ostream* os) const OVERRIDE { | 
|  | 459     NodeMatcher::DescribeTo(os); | 
|  | 460     *os << " whose access ("; | 
|  | 461     access_matcher_.DescribeTo(os); | 
|  | 462     *os << "), base ("; | 
|  | 463     base_matcher_.DescribeTo(os); | 
|  | 464     *os << ") and effect ("; | 
|  | 465     effect_matcher_.DescribeTo(os); | 
|  | 466     *os << ")"; | 
|  | 467   } | 
|  | 468 | 
|  | 469   virtual bool MatchAndExplain(Node* node, | 
|  | 470                                MatchResultListener* listener) const OVERRIDE { | 
|  | 471     return (NodeMatcher::MatchAndExplain(node, listener) && | 
|  | 472             PrintMatchAndExplain(OpParameter<FieldAccess>(node), "access", | 
|  | 473                                  access_matcher_, listener) && | 
|  | 474             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | 
|  | 475                                  base_matcher_, listener) && | 
|  | 476             PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", | 
|  | 477                                  effect_matcher_, listener)); | 
|  | 478   } | 
|  | 479 | 
|  | 480  private: | 
|  | 481   const Matcher<FieldAccess> access_matcher_; | 
|  | 482   const Matcher<Node*> base_matcher_; | 
|  | 483   const Matcher<Node*> effect_matcher_; | 
|  | 484 }; | 
|  | 485 | 
|  | 486 | 
|  | 487 class IsLoadElementMatcher FINAL : public NodeMatcher { | 
|  | 488  public: | 
|  | 489   IsLoadElementMatcher(const Matcher<ElementAccess>& access_matcher, | 
|  | 490                        const Matcher<Node*>& base_matcher, | 
|  | 491                        const Matcher<Node*>& index_matcher, | 
|  | 492                        const Matcher<Node*>& length_matcher, | 
|  | 493                        const Matcher<Node*>& effect_matcher, | 
|  | 494                        const Matcher<Node*>& control_matcher) | 
|  | 495       : NodeMatcher(IrOpcode::kLoadElement), | 
|  | 496         access_matcher_(access_matcher), | 
|  | 497         base_matcher_(base_matcher), | 
|  | 498         index_matcher_(index_matcher), | 
|  | 499         length_matcher_(length_matcher), | 
|  | 500         effect_matcher_(effect_matcher), | 
|  | 501         control_matcher_(control_matcher) {} | 
|  | 502 | 
|  | 503   virtual void DescribeTo(std::ostream* os) const OVERRIDE { | 
|  | 504     NodeMatcher::DescribeTo(os); | 
|  | 505     *os << " whose access ("; | 
|  | 506     access_matcher_.DescribeTo(os); | 
|  | 507     *os << "), base ("; | 
|  | 508     base_matcher_.DescribeTo(os); | 
|  | 509     *os << "), index ("; | 
|  | 510     index_matcher_.DescribeTo(os); | 
|  | 511     *os << "), length ("; | 
|  | 512     length_matcher_.DescribeTo(os); | 
|  | 513     *os << "), effect ("; | 
|  | 514     effect_matcher_.DescribeTo(os); | 
|  | 515     *os << ") and control ("; | 
|  | 516     control_matcher_.DescribeTo(os); | 
|  | 517     *os << ")"; | 
|  | 518   } | 
|  | 519 | 
|  | 520   virtual bool MatchAndExplain(Node* node, | 
|  | 521                                MatchResultListener* listener) const OVERRIDE { | 
|  | 522     return (NodeMatcher::MatchAndExplain(node, listener) && | 
|  | 523             PrintMatchAndExplain(OpParameter<ElementAccess>(node), "access", | 
|  | 524                                  access_matcher_, listener) && | 
|  | 525             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | 
|  | 526                                  base_matcher_, listener) && | 
|  | 527             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), | 
|  | 528                                  "index", index_matcher_, listener) && | 
|  | 529             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 2), | 
|  | 530                                  "length", length_matcher_, listener) && | 
|  | 531             PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", | 
|  | 532                                  effect_matcher_, listener) && | 
|  | 533             PrintMatchAndExplain(NodeProperties::GetControlInput(node), | 
|  | 534                                  "control", control_matcher_, listener)); | 
|  | 535   } | 
|  | 536 | 
|  | 537  private: | 
|  | 538   const Matcher<ElementAccess> access_matcher_; | 
|  | 539   const Matcher<Node*> base_matcher_; | 
|  | 540   const Matcher<Node*> index_matcher_; | 
|  | 541   const Matcher<Node*> length_matcher_; | 
|  | 542   const Matcher<Node*> effect_matcher_; | 
|  | 543   const Matcher<Node*> control_matcher_; | 
|  | 544 }; | 
|  | 545 | 
|  | 546 | 
|  | 547 class IsStoreElementMatcher FINAL : public NodeMatcher { | 
|  | 548  public: | 
|  | 549   IsStoreElementMatcher(const Matcher<ElementAccess>& access_matcher, | 
|  | 550                         const Matcher<Node*>& base_matcher, | 
|  | 551                         const Matcher<Node*>& index_matcher, | 
|  | 552                         const Matcher<Node*>& length_matcher, | 
|  | 553                         const Matcher<Node*>& value_matcher, | 
|  | 554                         const Matcher<Node*>& effect_matcher, | 
|  | 555                         const Matcher<Node*>& control_matcher) | 
|  | 556       : NodeMatcher(IrOpcode::kStoreElement), | 
|  | 557         access_matcher_(access_matcher), | 
|  | 558         base_matcher_(base_matcher), | 
|  | 559         index_matcher_(index_matcher), | 
|  | 560         length_matcher_(length_matcher), | 
|  | 561         value_matcher_(value_matcher), | 
|  | 562         effect_matcher_(effect_matcher), | 
|  | 563         control_matcher_(control_matcher) {} | 
|  | 564 | 
|  | 565   virtual void DescribeTo(std::ostream* os) const OVERRIDE { | 
|  | 566     NodeMatcher::DescribeTo(os); | 
|  | 567     *os << " whose access ("; | 
|  | 568     access_matcher_.DescribeTo(os); | 
|  | 569     *os << "), base ("; | 
|  | 570     base_matcher_.DescribeTo(os); | 
|  | 571     *os << "), index ("; | 
|  | 572     index_matcher_.DescribeTo(os); | 
|  | 573     *os << "), length ("; | 
|  | 574     length_matcher_.DescribeTo(os); | 
|  | 575     *os << "), value ("; | 
|  | 576     value_matcher_.DescribeTo(os); | 
|  | 577     *os << "), effect ("; | 
|  | 578     effect_matcher_.DescribeTo(os); | 
|  | 579     *os << ") and control ("; | 
|  | 580     control_matcher_.DescribeTo(os); | 
|  | 581     *os << ")"; | 
|  | 582   } | 
|  | 583 | 
|  | 584   virtual bool MatchAndExplain(Node* node, | 
|  | 585                                MatchResultListener* listener) const OVERRIDE { | 
|  | 586     return (NodeMatcher::MatchAndExplain(node, listener) && | 
|  | 587             PrintMatchAndExplain(OpParameter<ElementAccess>(node), "access", | 
|  | 588                                  access_matcher_, listener) && | 
|  | 589             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | 
|  | 590                                  base_matcher_, listener) && | 
|  | 591             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), | 
|  | 592                                  "index", index_matcher_, listener) && | 
|  | 593             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 2), | 
|  | 594                                  "length", length_matcher_, listener) && | 
|  | 595             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 3), | 
|  | 596                                  "value", value_matcher_, listener) && | 
|  | 597             PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", | 
|  | 598                                  effect_matcher_, listener) && | 
|  | 599             PrintMatchAndExplain(NodeProperties::GetControlInput(node), | 
|  | 600                                  "control", control_matcher_, listener)); | 
|  | 601   } | 
|  | 602 | 
|  | 603  private: | 
|  | 604   const Matcher<ElementAccess> access_matcher_; | 
|  | 605   const Matcher<Node*> base_matcher_; | 
|  | 606   const Matcher<Node*> index_matcher_; | 
|  | 607   const Matcher<Node*> length_matcher_; | 
|  | 608   const Matcher<Node*> value_matcher_; | 
|  | 609   const Matcher<Node*> effect_matcher_; | 
|  | 610   const Matcher<Node*> control_matcher_; | 
|  | 611 }; | 
|  | 612 | 
|  | 613 | 
| 433 class IsLoadMatcher FINAL : public NodeMatcher { | 614 class IsLoadMatcher FINAL : public NodeMatcher { | 
| 434  public: | 615  public: | 
| 435   IsLoadMatcher(const Matcher<LoadRepresentation>& rep_matcher, | 616   IsLoadMatcher(const Matcher<LoadRepresentation>& rep_matcher, | 
| 436                 const Matcher<Node*>& base_matcher, | 617                 const Matcher<Node*>& base_matcher, | 
| 437                 const Matcher<Node*>& index_matcher, | 618                 const Matcher<Node*>& index_matcher, | 
| 438                 const Matcher<Node*>& effect_matcher, | 619                 const Matcher<Node*>& effect_matcher, | 
| 439                 const Matcher<Node*>& control_matcher) | 620                 const Matcher<Node*>& control_matcher) | 
| 440       : NodeMatcher(IrOpcode::kLoad), | 621       : NodeMatcher(IrOpcode::kLoad), | 
| 441         rep_matcher_(rep_matcher), | 622         rep_matcher_(rep_matcher), | 
| 442         base_matcher_(base_matcher), | 623         base_matcher_(base_matcher), | 
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 708                       const Matcher<Node*>& value2_matcher, | 889                       const Matcher<Node*>& value2_matcher, | 
| 709                       const Matcher<Node*>& value3_matcher, | 890                       const Matcher<Node*>& value3_matcher, | 
| 710                       const Matcher<Node*>& effect_matcher, | 891                       const Matcher<Node*>& effect_matcher, | 
| 711                       const Matcher<Node*>& control_matcher) { | 892                       const Matcher<Node*>& control_matcher) { | 
| 712   return MakeMatcher(new IsCallMatcher( | 893   return MakeMatcher(new IsCallMatcher( | 
| 713       descriptor_matcher, value0_matcher, value1_matcher, value2_matcher, | 894       descriptor_matcher, value0_matcher, value1_matcher, value2_matcher, | 
| 714       value3_matcher, effect_matcher, control_matcher)); | 895       value3_matcher, effect_matcher, control_matcher)); | 
| 715 } | 896 } | 
| 716 | 897 | 
| 717 | 898 | 
|  | 899 Matcher<Node*> IsLoadField(const Matcher<FieldAccess>& access_matcher, | 
|  | 900                            const Matcher<Node*>& base_matcher, | 
|  | 901                            const Matcher<Node*>& effect_matcher) { | 
|  | 902   return MakeMatcher( | 
|  | 903       new IsLoadFieldMatcher(access_matcher, base_matcher, effect_matcher)); | 
|  | 904 } | 
|  | 905 | 
|  | 906 | 
|  | 907 Matcher<Node*> IsLoadElement(const Matcher<ElementAccess>& access_matcher, | 
|  | 908                              const Matcher<Node*>& base_matcher, | 
|  | 909                              const Matcher<Node*>& index_matcher, | 
|  | 910                              const Matcher<Node*>& length_matcher, | 
|  | 911                              const Matcher<Node*>& effect_matcher, | 
|  | 912                              const Matcher<Node*>& control_matcher) { | 
|  | 913   return MakeMatcher(new IsLoadElementMatcher(access_matcher, base_matcher, | 
|  | 914                                               index_matcher, length_matcher, | 
|  | 915                                               effect_matcher, control_matcher)); | 
|  | 916 } | 
|  | 917 | 
|  | 918 | 
|  | 919 Matcher<Node*> IsStoreElement(const Matcher<ElementAccess>& access_matcher, | 
|  | 920                               const Matcher<Node*>& base_matcher, | 
|  | 921                               const Matcher<Node*>& index_matcher, | 
|  | 922                               const Matcher<Node*>& length_matcher, | 
|  | 923                               const Matcher<Node*>& value_matcher, | 
|  | 924                               const Matcher<Node*>& effect_matcher, | 
|  | 925                               const Matcher<Node*>& control_matcher) { | 
|  | 926   return MakeMatcher(new IsStoreElementMatcher( | 
|  | 927       access_matcher, base_matcher, index_matcher, length_matcher, | 
|  | 928       value_matcher, effect_matcher, control_matcher)); | 
|  | 929 } | 
|  | 930 | 
|  | 931 | 
| 718 Matcher<Node*> IsLoad(const Matcher<LoadRepresentation>& rep_matcher, | 932 Matcher<Node*> IsLoad(const Matcher<LoadRepresentation>& rep_matcher, | 
| 719                       const Matcher<Node*>& base_matcher, | 933                       const Matcher<Node*>& base_matcher, | 
| 720                       const Matcher<Node*>& index_matcher, | 934                       const Matcher<Node*>& index_matcher, | 
| 721                       const Matcher<Node*>& effect_matcher, | 935                       const Matcher<Node*>& effect_matcher, | 
| 722                       const Matcher<Node*>& control_matcher) { | 936                       const Matcher<Node*>& control_matcher) { | 
| 723   return MakeMatcher(new IsLoadMatcher(rep_matcher, base_matcher, index_matcher, | 937   return MakeMatcher(new IsLoadMatcher(rep_matcher, base_matcher, index_matcher, | 
| 724                                        effect_matcher, control_matcher)); | 938                                        effect_matcher, control_matcher)); | 
| 725 } | 939 } | 
| 726 | 940 | 
| 727 | 941 | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 773 IS_UNOP_MATCHER(ChangeUint32ToUint64) | 987 IS_UNOP_MATCHER(ChangeUint32ToUint64) | 
| 774 IS_UNOP_MATCHER(TruncateFloat64ToFloat32) | 988 IS_UNOP_MATCHER(TruncateFloat64ToFloat32) | 
| 775 IS_UNOP_MATCHER(TruncateFloat64ToInt32) | 989 IS_UNOP_MATCHER(TruncateFloat64ToInt32) | 
| 776 IS_UNOP_MATCHER(TruncateInt64ToInt32) | 990 IS_UNOP_MATCHER(TruncateInt64ToInt32) | 
| 777 IS_UNOP_MATCHER(Float64Sqrt) | 991 IS_UNOP_MATCHER(Float64Sqrt) | 
| 778 #undef IS_UNOP_MATCHER | 992 #undef IS_UNOP_MATCHER | 
| 779 | 993 | 
| 780 }  // namespace compiler | 994 }  // namespace compiler | 
| 781 }  // namespace internal | 995 }  // namespace internal | 
| 782 }  // namespace v8 | 996 }  // namespace v8 | 
| OLD | NEW | 
|---|