| Index: test/unittests/compiler/js-typed-lowering-unittest.cc
|
| diff --git a/test/unittests/compiler/js-typed-lowering-unittest.cc b/test/unittests/compiler/js-typed-lowering-unittest.cc
|
| index 7ef1e81d47da427a1e3e3c025aa0975525e438a1..37dc1f3eb54864bd506a5a6a277f522363712b8f 100644
|
| --- a/test/unittests/compiler/js-typed-lowering-unittest.cc
|
| +++ b/test/unittests/compiler/js-typed-lowering-unittest.cc
|
| @@ -74,7 +74,8 @@ const LanguageMode kLanguageModes[] = {SLOPPY, STRICT, STRONG};
|
|
|
| class JSTypedLoweringTest : public TypedGraphTest {
|
| public:
|
| - JSTypedLoweringTest() : TypedGraphTest(3), javascript_(zone()) {}
|
| + JSTypedLoweringTest()
|
| + : TypedGraphTest(3), javascript_(zone()), deps_(isolate(), zone()) {}
|
| ~JSTypedLoweringTest() override {}
|
|
|
| protected:
|
| @@ -85,7 +86,9 @@ class JSTypedLoweringTest : public TypedGraphTest {
|
| &machine);
|
| // TODO(titzer): mock the GraphReducer here for better unit testing.
|
| GraphReducer graph_reducer(zone(), graph());
|
| - JSTypedLowering reducer(&graph_reducer, &jsgraph, zone());
|
| + JSTypedLowering reducer(&graph_reducer, &deps_,
|
| + JSTypedLowering::kDeoptimizationEnabled, &jsgraph,
|
| + zone());
|
| return reducer.Reduce(node);
|
| }
|
|
|
| @@ -116,6 +119,7 @@ class JSTypedLoweringTest : public TypedGraphTest {
|
|
|
| private:
|
| JSOperatorBuilder javascript_;
|
| + CompilationDependencies deps_;
|
| };
|
|
|
|
|
| @@ -1168,6 +1172,70 @@ TEST_F(JSTypedLoweringTest, JSCreateWithContext) {
|
| _));
|
| }
|
|
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// JSInstanceOf
|
| +// Test that instanceOf is reduced if and only if the right-hand side is a
|
| +// function constant. Functional correctness is ensured elsewhere.
|
| +
|
| +
|
| +TEST_F(JSTypedLoweringTest, JSInstanceOfSpecializationWithoutSmiCheck) {
|
| + Node* const context = Parameter(Type::Any());
|
| + Node* const frame_state = EmptyFrameState();
|
| + Node* const effect = graph()->start();
|
| + Node* const control = graph()->start();
|
| +
|
| + // Reduce if left-hand side is known to be an object.
|
| + Node* instanceOf =
|
| + graph()->NewNode(javascript()->InstanceOf(), Parameter(Type::Object(), 0),
|
| + HeapConstant(isolate()->object_function()), context,
|
| + frame_state, effect, control);
|
| + Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context,
|
| + frame_state, effect, control);
|
| + Reduction r = Reduce(instanceOf);
|
| + ASSERT_TRUE(r.Changed());
|
| + ASSERT_EQ(r.replacement(), dummy->InputAt(0));
|
| + ASSERT_NE(instanceOf, dummy->InputAt(0));
|
| +}
|
| +
|
| +
|
| +TEST_F(JSTypedLoweringTest, JSInstanceOfSpecializationWithSmiCheck) {
|
| + Node* const context = Parameter(Type::Any());
|
| + Node* const frame_state = EmptyFrameState();
|
| + Node* const effect = graph()->start();
|
| + Node* const control = graph()->start();
|
| +
|
| + // Reduce if left-hand side could be a Smi.
|
| + Node* instanceOf =
|
| + graph()->NewNode(javascript()->InstanceOf(), Parameter(Type::Any(), 0),
|
| + HeapConstant(isolate()->object_function()), context,
|
| + frame_state, effect, control);
|
| + Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context,
|
| + frame_state, effect, control);
|
| + Reduction r = Reduce(instanceOf);
|
| + ASSERT_TRUE(r.Changed());
|
| + ASSERT_EQ(r.replacement(), dummy->InputAt(0));
|
| + ASSERT_NE(instanceOf, dummy->InputAt(0));
|
| +}
|
| +
|
| +
|
| +TEST_F(JSTypedLoweringTest, JSInstanceOfNoSpecialization) {
|
| + Node* const context = Parameter(Type::Any());
|
| + Node* const frame_state = EmptyFrameState();
|
| + Node* const effect = graph()->start();
|
| + Node* const control = graph()->start();
|
| +
|
| + // Do not reduce if right-hand side is not a function constant.
|
| + Node* instanceOf = graph()->NewNode(
|
| + javascript()->InstanceOf(), Parameter(Type::Any(), 0),
|
| + Parameter(Type::Any()), context, frame_state, effect, control);
|
| + Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context,
|
| + frame_state, effect, control);
|
| + Reduction r = Reduce(instanceOf);
|
| + ASSERT_FALSE(r.Changed());
|
| + ASSERT_EQ(instanceOf, dummy->InputAt(0));
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|