| 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/compiler-unittests/node-matchers.h" |    5 #include "test/compiler-unittests/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  |   10  | 
|   11 using testing::MakeMatcher; |   11 using testing::MakeMatcher; | 
|   12 using testing::MatcherInterface; |   12 using testing::MatcherInterface; | 
|   13 using testing::MatchResultListener; |   13 using testing::MatchResultListener; | 
|   14 using testing::StringMatchResultListener; |   14 using testing::StringMatchResultListener; | 
|   15  |   15  | 
|   16 namespace v8 { |   16 namespace v8 { | 
|   17 namespace internal { |   17 namespace internal { | 
|   18  |   18  | 
|   19 // TODO(bmeurer): Find a new home for these functions. |   19 // TODO(bmeurer): Find a new home for these functions. | 
|   20 template <typename T> |   20 template <typename T> | 
|   21 inline std::ostream& operator<<(std::ostream& os, |   21 inline std::ostream& operator<<(std::ostream& os, | 
|   22                                 const PrintableUnique<T>& value) { |   22                                 const PrintableUnique<T>& value) { | 
|   23   return os << value.string(); |   23   return os << value.string(); | 
|   24 } |   24 } | 
|   25  |   25  | 
|   26 namespace compiler { |   26 namespace compiler { | 
|   27  |   27  | 
 |   28 GraphTest::GraphTest(int num_parameters) : graph_(zone()) { | 
 |   29   graph()->SetStart(graph()->NewNode(common()->Start(num_parameters))); | 
 |   30 } | 
 |   31  | 
 |   32  | 
 |   33 GraphTest::~GraphTest() {} | 
 |   34  | 
 |   35  | 
|   28 namespace { |   36 namespace { | 
|   29  |   37  | 
|   30 template <typename T> |   38 template <typename T> | 
|   31 bool PrintMatchAndExplain(const T& value, const char* value_name, |   39 bool PrintMatchAndExplain(const T& value, const char* value_name, | 
|   32                           const Matcher<T>& value_matcher, |   40                           const Matcher<T>& value_matcher, | 
|   33                           MatchResultListener* listener) { |   41                           MatchResultListener* listener) { | 
|   34   StringMatchResultListener value_listener; |   42   StringMatchResultListener value_listener; | 
|   35   if (!value_matcher.MatchAndExplain(value, &value_listener)) { |   43   if (!value_matcher.MatchAndExplain(value, &value_listener)) { | 
|   36     *listener << "whose " << value_name << " " << value << " doesn't match"; |   44     *listener << "whose " << value_name << " " << value << " doesn't match"; | 
|   37     if (value_listener.str() != "") { |   45     if (value_listener.str() != "") { | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   94             PrintMatchAndExplain(NodeProperties::GetControlInput(node), |  102             PrintMatchAndExplain(NodeProperties::GetControlInput(node), | 
|   95                                  "control", control_matcher_, listener)); |  103                                  "control", control_matcher_, listener)); | 
|   96   } |  104   } | 
|   97  |  105  | 
|   98  private: |  106  private: | 
|   99   const Matcher<Node*> value_matcher_; |  107   const Matcher<Node*> value_matcher_; | 
|  100   const Matcher<Node*> control_matcher_; |  108   const Matcher<Node*> control_matcher_; | 
|  101 }; |  109 }; | 
|  102  |  110  | 
|  103  |  111  | 
 |  112 class IsMergeMatcher V8_FINAL : public NodeMatcher { | 
 |  113  public: | 
 |  114   IsMergeMatcher(const Matcher<Node*>& control0_matcher, | 
 |  115                  const Matcher<Node*>& control1_matcher) | 
 |  116       : NodeMatcher(IrOpcode::kMerge), | 
 |  117         control0_matcher_(control0_matcher), | 
 |  118         control1_matcher_(control1_matcher) {} | 
 |  119  | 
 |  120   virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { | 
 |  121     NodeMatcher::DescribeTo(os); | 
 |  122     *os << " whose control0 ("; | 
 |  123     control0_matcher_.DescribeTo(os); | 
 |  124     *os << ") and control1 ("; | 
 |  125     control1_matcher_.DescribeTo(os); | 
 |  126     *os << ")"; | 
 |  127   } | 
 |  128  | 
 |  129   virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const | 
 |  130       V8_OVERRIDE { | 
 |  131     return (NodeMatcher::MatchAndExplain(node, listener) && | 
 |  132             PrintMatchAndExplain(NodeProperties::GetControlInput(node, 0), | 
 |  133                                  "control0", control0_matcher_, listener) && | 
 |  134             PrintMatchAndExplain(NodeProperties::GetControlInput(node, 1), | 
 |  135                                  "control1", control1_matcher_, listener)); | 
 |  136   } | 
 |  137  | 
 |  138  private: | 
 |  139   const Matcher<Node*> control0_matcher_; | 
 |  140   const Matcher<Node*> control1_matcher_; | 
 |  141 }; | 
 |  142  | 
 |  143  | 
 |  144 class IsIfTrueMatcher V8_FINAL : public NodeMatcher { | 
 |  145  public: | 
 |  146   explicit IsIfTrueMatcher(const Matcher<Node*>& control_matcher) | 
 |  147       : NodeMatcher(IrOpcode::kIfTrue), control_matcher_(control_matcher) {} | 
 |  148  | 
 |  149   virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { | 
 |  150     NodeMatcher::DescribeTo(os); | 
 |  151     *os << " whose control ("; | 
 |  152     control_matcher_.DescribeTo(os); | 
 |  153     *os << ")"; | 
 |  154   } | 
 |  155  | 
 |  156   virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const | 
 |  157       V8_OVERRIDE { | 
 |  158     return (NodeMatcher::MatchAndExplain(node, listener) && | 
 |  159             PrintMatchAndExplain(NodeProperties::GetControlInput(node), | 
 |  160                                  "control", control_matcher_, listener)); | 
 |  161   } | 
 |  162  | 
 |  163  private: | 
 |  164   const Matcher<Node*> control_matcher_; | 
 |  165 }; | 
 |  166  | 
 |  167  | 
 |  168 class IsIfFalseMatcher V8_FINAL : public NodeMatcher { | 
 |  169  public: | 
 |  170   explicit IsIfFalseMatcher(const Matcher<Node*>& control_matcher) | 
 |  171       : NodeMatcher(IrOpcode::kIfFalse), control_matcher_(control_matcher) {} | 
 |  172  | 
 |  173   virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { | 
 |  174     NodeMatcher::DescribeTo(os); | 
 |  175     *os << " whose control ("; | 
 |  176     control_matcher_.DescribeTo(os); | 
 |  177     *os << ")"; | 
 |  178   } | 
 |  179  | 
 |  180   virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const | 
 |  181       V8_OVERRIDE { | 
 |  182     return (NodeMatcher::MatchAndExplain(node, listener) && | 
 |  183             PrintMatchAndExplain(NodeProperties::GetControlInput(node), | 
 |  184                                  "control", control_matcher_, listener)); | 
 |  185   } | 
 |  186  | 
 |  187  private: | 
 |  188   const Matcher<Node*> control_matcher_; | 
 |  189 }; | 
 |  190  | 
 |  191  | 
|  104 template <typename T> |  192 template <typename T> | 
|  105 class IsConstantMatcher V8_FINAL : public NodeMatcher { |  193 class IsConstantMatcher V8_FINAL : public NodeMatcher { | 
|  106  public: |  194  public: | 
|  107   IsConstantMatcher(IrOpcode::Value opcode, const Matcher<T>& value_matcher) |  195   IsConstantMatcher(IrOpcode::Value opcode, const Matcher<T>& value_matcher) | 
|  108       : NodeMatcher(opcode), value_matcher_(value_matcher) {} |  196       : NodeMatcher(opcode), value_matcher_(value_matcher) {} | 
|  109  |  197  | 
|  110   virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { |  198   virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { | 
|  111     NodeMatcher::DescribeTo(os); |  199     NodeMatcher::DescribeTo(os); | 
|  112     *os << " whose value ("; |  200     *os << " whose value ("; | 
|  113     value_matcher_.DescribeTo(os); |  201     value_matcher_.DescribeTo(os); | 
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  359   virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const |  447   virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const | 
|  360       V8_OVERRIDE { |  448       V8_OVERRIDE { | 
|  361     return (NodeMatcher::MatchAndExplain(node, listener) && |  449     return (NodeMatcher::MatchAndExplain(node, listener) && | 
|  362             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), |  450             PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), | 
|  363                                  "input", input_matcher_, listener)); |  451                                  "input", input_matcher_, listener)); | 
|  364   } |  452   } | 
|  365  |  453  | 
|  366  private: |  454  private: | 
|  367   const Matcher<Node*> input_matcher_; |  455   const Matcher<Node*> input_matcher_; | 
|  368 }; |  456 }; | 
|  369  |  | 
|  370 } |  457 } | 
|  371  |  458  | 
|  372  |  459  | 
|  373 Matcher<Node*> IsBranch(const Matcher<Node*>& value_matcher, |  460 Matcher<Node*> IsBranch(const Matcher<Node*>& value_matcher, | 
|  374                         const Matcher<Node*>& control_matcher) { |  461                         const Matcher<Node*>& control_matcher) { | 
|  375   return MakeMatcher(new IsBranchMatcher(value_matcher, control_matcher)); |  462   return MakeMatcher(new IsBranchMatcher(value_matcher, control_matcher)); | 
|  376 } |  463 } | 
|  377  |  464  | 
|  378  |  465  | 
 |  466 Matcher<Node*> IsMerge(const Matcher<Node*>& control0_matcher, | 
 |  467                        const Matcher<Node*>& control1_matcher) { | 
 |  468   return MakeMatcher(new IsMergeMatcher(control0_matcher, control1_matcher)); | 
 |  469 } | 
 |  470  | 
 |  471  | 
 |  472 Matcher<Node*> IsIfTrue(const Matcher<Node*>& control_matcher) { | 
 |  473   return MakeMatcher(new IsIfTrueMatcher(control_matcher)); | 
 |  474 } | 
 |  475  | 
 |  476  | 
 |  477 Matcher<Node*> IsIfFalse(const Matcher<Node*>& control_matcher) { | 
 |  478   return MakeMatcher(new IsIfFalseMatcher(control_matcher)); | 
 |  479 } | 
 |  480  | 
 |  481  | 
|  379 Matcher<Node*> IsInt32Constant(const Matcher<int32_t>& value_matcher) { |  482 Matcher<Node*> IsInt32Constant(const Matcher<int32_t>& value_matcher) { | 
|  380   return MakeMatcher( |  483   return MakeMatcher( | 
|  381       new IsConstantMatcher<int32_t>(IrOpcode::kInt32Constant, value_matcher)); |  484       new IsConstantMatcher<int32_t>(IrOpcode::kInt32Constant, value_matcher)); | 
|  382 } |  485 } | 
|  383  |  486  | 
|  384  |  487  | 
|  385 Matcher<Node*> IsHeapConstant( |  488 Matcher<Node*> IsHeapConstant( | 
|  386     const Matcher<PrintableUnique<HeapObject> >& value_matcher) { |  489     const Matcher<PrintableUnique<HeapObject> >& value_matcher) { | 
|  387   return MakeMatcher(new IsConstantMatcher<PrintableUnique<HeapObject> >( |  490   return MakeMatcher(new IsConstantMatcher<PrintableUnique<HeapObject> >( | 
|  388       IrOpcode::kHeapConstant, value_matcher)); |  491       IrOpcode::kHeapConstant, value_matcher)); | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  447   Matcher<Node*> Is##Name(const Matcher<Node*>& input_matcher) {             \ |  550   Matcher<Node*> Is##Name(const Matcher<Node*>& input_matcher) {             \ | 
|  448     return MakeMatcher(new IsUnopMatcher(IrOpcode::k##Name, input_matcher)); \ |  551     return MakeMatcher(new IsUnopMatcher(IrOpcode::k##Name, input_matcher)); \ | 
|  449   } |  552   } | 
|  450 IS_UNOP_MATCHER(ConvertInt64ToInt32) |  553 IS_UNOP_MATCHER(ConvertInt64ToInt32) | 
|  451 IS_UNOP_MATCHER(ChangeInt32ToFloat64) |  554 IS_UNOP_MATCHER(ChangeInt32ToFloat64) | 
|  452 #undef IS_UNOP_MATCHER |  555 #undef IS_UNOP_MATCHER | 
|  453  |  556  | 
|  454 }  // namespace compiler |  557 }  // namespace compiler | 
|  455 }  // namespace internal |  558 }  // namespace internal | 
|  456 }  // namespace v8 |  559 }  // namespace v8 | 
| OLD | NEW |