Index: test/compiler-unittests/graph-unittest.cc |
diff --git a/test/compiler-unittests/graph-unittest.cc b/test/compiler-unittests/graph-unittest.cc |
index 6c946de590aa2ce45e8a3d6c86a05bdb065d18f2..e5b413c545260c519d8697a1556702ec85a499c7 100644 |
--- a/test/compiler-unittests/graph-unittest.cc |
+++ b/test/compiler-unittests/graph-unittest.cc |
@@ -22,6 +22,12 @@ inline std::ostream& operator<<(std::ostream& os, |
const PrintableUnique<T>& value) { |
return os << value.string(); |
} |
+inline std::ostream& operator<<(std::ostream& os, |
+ const ExternalReference& value) { |
+ OStringStream ost; |
+ compiler::StaticParameterTraits<ExternalReference>::PrintTo(ost, value); |
+ return os << ost.c_str(); |
+} |
namespace compiler { |
@@ -66,7 +72,8 @@ class NodeMatcher : public MatcherInterface<Node*> { |
return false; |
} |
if (node->opcode() != opcode_) { |
- *listener << "whose opcode is " << IrOpcode::Mnemonic(node->opcode()); |
+ *listener << "whose opcode is " << IrOpcode::Mnemonic(node->opcode()) |
+ << " but should have been " << IrOpcode::Mnemonic(opcode_); |
return false; |
} |
return true; |
@@ -141,10 +148,11 @@ class IsMergeMatcher V8_FINAL : public NodeMatcher { |
}; |
-class IsIfTrueMatcher V8_FINAL : public NodeMatcher { |
+class IsControl1Matcher V8_FINAL : public NodeMatcher { |
public: |
- explicit IsIfTrueMatcher(const Matcher<Node*>& control_matcher) |
- : NodeMatcher(IrOpcode::kIfTrue), control_matcher_(control_matcher) {} |
+ IsControl1Matcher(IrOpcode::Value opcode, |
+ const Matcher<Node*>& control_matcher) |
+ : NodeMatcher(opcode), control_matcher_(control_matcher) {} |
virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { |
NodeMatcher::DescribeTo(os); |
@@ -165,27 +173,35 @@ class IsIfTrueMatcher V8_FINAL : public NodeMatcher { |
}; |
-class IsIfFalseMatcher V8_FINAL : public NodeMatcher { |
+class IsFinishMatcher V8_FINAL : public NodeMatcher { |
public: |
- explicit IsIfFalseMatcher(const Matcher<Node*>& control_matcher) |
- : NodeMatcher(IrOpcode::kIfFalse), control_matcher_(control_matcher) {} |
+ IsFinishMatcher(const Matcher<Node*>& value_matcher, |
+ const Matcher<Node*>& effect_matcher) |
+ : NodeMatcher(IrOpcode::kFinish), |
+ value_matcher_(value_matcher), |
+ effect_matcher_(effect_matcher) {} |
virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { |
NodeMatcher::DescribeTo(os); |
- *os << " whose control ("; |
- control_matcher_.DescribeTo(os); |
+ *os << " whose value ("; |
+ value_matcher_.DescribeTo(os); |
+ *os << ") and effect ("; |
+ effect_matcher_.DescribeTo(os); |
*os << ")"; |
} |
virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const |
V8_OVERRIDE { |
return (NodeMatcher::MatchAndExplain(node, listener) && |
- PrintMatchAndExplain(NodeProperties::GetControlInput(node), |
- "control", control_matcher_, listener)); |
+ PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), |
+ "value", value_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", |
+ effect_matcher_, listener)); |
} |
private: |
- const Matcher<Node*> control_matcher_; |
+ const Matcher<Node*> value_matcher_; |
+ const Matcher<Node*> effect_matcher_; |
}; |
@@ -285,6 +301,71 @@ class IsProjectionMatcher V8_FINAL : public NodeMatcher { |
}; |
+class IsCallMatcher V8_FINAL : public NodeMatcher { |
+ public: |
+ IsCallMatcher(const Matcher<CallDescriptor*>& descriptor_matcher, |
+ const Matcher<Node*>& value0_matcher, |
+ const Matcher<Node*>& value1_matcher, |
+ const Matcher<Node*>& value2_matcher, |
+ const Matcher<Node*>& value3_matcher, |
+ const Matcher<Node*>& effect_matcher, |
+ const Matcher<Node*>& control_matcher) |
+ : NodeMatcher(IrOpcode::kCall), |
+ descriptor_matcher_(descriptor_matcher), |
+ value0_matcher_(value0_matcher), |
+ value1_matcher_(value1_matcher), |
+ value2_matcher_(value2_matcher), |
+ value3_matcher_(value3_matcher), |
+ effect_matcher_(effect_matcher), |
+ control_matcher_(control_matcher) {} |
+ |
+ virtual void DescribeTo(std::ostream* os) const V8_OVERRIDE { |
+ NodeMatcher::DescribeTo(os); |
+ *os << " whose value0 ("; |
+ value0_matcher_.DescribeTo(os); |
+ *os << ") and value1 ("; |
+ value1_matcher_.DescribeTo(os); |
+ *os << ") and value2 ("; |
+ value2_matcher_.DescribeTo(os); |
+ *os << ") and value3 ("; |
+ value3_matcher_.DescribeTo(os); |
+ *os << ") and effect ("; |
+ effect_matcher_.DescribeTo(os); |
+ *os << ") and control ("; |
+ control_matcher_.DescribeTo(os); |
+ *os << ")"; |
+ } |
+ |
+ virtual bool MatchAndExplain(Node* node, MatchResultListener* listener) const |
+ V8_OVERRIDE { |
+ return (NodeMatcher::MatchAndExplain(node, listener) && |
+ PrintMatchAndExplain(OpParameter<CallDescriptor*>(node), |
+ "descriptor", descriptor_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), |
+ "value0", value0_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetValueInput(node, 1), |
+ "value1", value1_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetValueInput(node, 2), |
+ "value2", value2_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetValueInput(node, 3), |
+ "value3", value3_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", |
+ effect_matcher_, listener) && |
+ PrintMatchAndExplain(NodeProperties::GetControlInput(node), |
+ "control", control_matcher_, listener)); |
+ } |
+ |
+ private: |
+ const Matcher<CallDescriptor*> descriptor_matcher_; |
+ const Matcher<Node*> value0_matcher_; |
+ const Matcher<Node*> value1_matcher_; |
+ const Matcher<Node*> value2_matcher_; |
+ const Matcher<Node*> value3_matcher_; |
+ const Matcher<Node*> effect_matcher_; |
+ const Matcher<Node*> control_matcher_; |
+}; |
+ |
+ |
class IsLoadMatcher V8_FINAL : public NodeMatcher { |
public: |
IsLoadMatcher(const Matcher<MachineType>& type_matcher, |
@@ -470,18 +551,32 @@ Matcher<Node*> IsMerge(const Matcher<Node*>& control0_matcher, |
Matcher<Node*> IsIfTrue(const Matcher<Node*>& control_matcher) { |
- return MakeMatcher(new IsIfTrueMatcher(control_matcher)); |
+ return MakeMatcher(new IsControl1Matcher(IrOpcode::kIfTrue, control_matcher)); |
} |
Matcher<Node*> IsIfFalse(const Matcher<Node*>& control_matcher) { |
- return MakeMatcher(new IsIfFalseMatcher(control_matcher)); |
+ return MakeMatcher( |
+ new IsControl1Matcher(IrOpcode::kIfFalse, control_matcher)); |
} |
-Matcher<Node*> IsInt32Constant(const Matcher<int32_t>& value_matcher) { |
+Matcher<Node*> IsControlEffect(const Matcher<Node*>& control_matcher) { |
return MakeMatcher( |
- new IsConstantMatcher<int32_t>(IrOpcode::kInt32Constant, value_matcher)); |
+ new IsControl1Matcher(IrOpcode::kControlEffect, control_matcher)); |
+} |
+ |
+ |
+Matcher<Node*> IsFinish(const Matcher<Node*>& value_matcher, |
+ const Matcher<Node*>& effect_matcher) { |
+ return MakeMatcher(new IsFinishMatcher(value_matcher, effect_matcher)); |
+} |
+ |
+ |
+Matcher<Node*> IsExternalConstant( |
+ const Matcher<ExternalReference>& value_matcher) { |
+ return MakeMatcher(new IsConstantMatcher<ExternalReference>( |
+ IrOpcode::kExternalConstant, value_matcher)); |
} |
@@ -492,6 +587,18 @@ Matcher<Node*> IsHeapConstant( |
} |
+Matcher<Node*> IsInt32Constant(const Matcher<int32_t>& value_matcher) { |
+ return MakeMatcher( |
+ new IsConstantMatcher<int32_t>(IrOpcode::kInt32Constant, value_matcher)); |
+} |
+ |
+ |
+Matcher<Node*> IsNumberConstant(const Matcher<double>& value_matcher) { |
+ return MakeMatcher( |
+ new IsConstantMatcher<double>(IrOpcode::kNumberConstant, value_matcher)); |
+} |
+ |
+ |
Matcher<Node*> IsPhi(const Matcher<Node*>& value0_matcher, |
const Matcher<Node*>& value1_matcher, |
const Matcher<Node*>& merge_matcher) { |
@@ -506,6 +613,19 @@ Matcher<Node*> IsProjection(const Matcher<int32_t>& index_matcher, |
} |
+Matcher<Node*> IsCall(const Matcher<CallDescriptor*>& descriptor_matcher, |
+ const Matcher<Node*>& value0_matcher, |
+ const Matcher<Node*>& value1_matcher, |
+ const Matcher<Node*>& value2_matcher, |
+ const Matcher<Node*>& value3_matcher, |
+ const Matcher<Node*>& effect_matcher, |
+ const Matcher<Node*>& control_matcher) { |
+ return MakeMatcher(new IsCallMatcher( |
+ descriptor_matcher, value0_matcher, value1_matcher, value2_matcher, |
+ value3_matcher, effect_matcher, control_matcher)); |
+} |
+ |
+ |
Matcher<Node*> IsLoad(const Matcher<MachineType>& type_matcher, |
const Matcher<Node*>& base_matcher, |
const Matcher<Node*>& index_matcher, |