From: Benedikt Meurer Date: Tue, 2 Dec 2014 11:40:25 +0000 (+0100) Subject: [turbofan] Cache the JSStoreProperty operator(s). X-Git-Tag: upstream/4.7.83~5431 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a94a612220bcd68e22c3bcae107805487082bbb3;p=platform%2Fupstream%2Fv8.git [turbofan] Cache the JSStoreProperty operator(s). TEST=unittests R=dcarney@chromium.org Review URL: https://codereview.chromium.org/769193003 Cr-Commit-Position: refs/heads/master@{#25609} --- diff --git a/src/compiler/js-operator.cc b/src/compiler/js-operator.cc index d3959c7..14dfe6f 100644 --- a/src/compiler/js-operator.cc +++ b/src/compiler/js-operator.cc @@ -259,6 +259,16 @@ struct JSOperatorGlobalCache FINAL { Name##Operator k##Name##Operator; CACHED_OP_LIST(CACHED) #undef CACHED + + template + struct StorePropertyOperator FINAL : public Operator1 { + StorePropertyOperator() + : Operator1(IrOpcode::kJSStoreProperty, + Operator::kNoProperties, "JSStoreProperty", 3, + 1, 1, 0, 1, 0, kStrictMode) {} + }; + StorePropertyOperator kStorePropertySloppyOperator; + StorePropertyOperator kStorePropertyStrictOperator; }; @@ -335,11 +345,14 @@ const Operator* JSOperatorBuilder::LoadProperty( const Operator* JSOperatorBuilder::StoreProperty(StrictMode strict_mode) { - return new (zone()) Operator1( // -- - IrOpcode::kJSStoreProperty, Operator::kNoProperties, // opcode - "JSStoreProperty", // name - 3, 1, 1, 0, 1, 0, // counts - strict_mode); // parameter + switch (strict_mode) { + case SLOPPY: + return &cache_.kStorePropertySloppyOperator; + case STRICT: + return &cache_.kStorePropertyStrictOperator; + } + UNREACHABLE(); + return nullptr; } diff --git a/test/unittests/compiler/js-operator-unittest.cc b/test/unittests/compiler/js-operator-unittest.cc index f16629d..fc8dfba 100644 --- a/test/unittests/compiler/js-operator-unittest.cc +++ b/test/unittests/compiler/js-operator-unittest.cc @@ -13,6 +13,7 @@ namespace compiler { // ----------------------------------------------------------------------------- // Shared operators. + namespace { struct SharedOperator { @@ -142,6 +143,73 @@ TEST_P(JSSharedOperatorTest, Properties) { INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest, ::testing::ValuesIn(kSharedOperators)); + +// ----------------------------------------------------------------------------- +// JSStoreProperty. + + +class JSStorePropertyOperatorTest + : public TestWithZone, + public ::testing::WithParamInterface {}; + + +TEST_P(JSStorePropertyOperatorTest, InstancesAreGloballyShared) { + const StrictMode mode = GetParam(); + JSOperatorBuilder javascript1(zone()); + JSOperatorBuilder javascript2(zone()); + EXPECT_EQ(javascript1.StoreProperty(mode), javascript2.StoreProperty(mode)); +} + + +TEST_P(JSStorePropertyOperatorTest, NumberOfInputsAndOutputs) { + JSOperatorBuilder javascript(zone()); + const StrictMode mode = GetParam(); + const Operator* op = javascript.StoreProperty(mode); + + // TODO(jarin): Get rid of this hack. + const int frame_state_input_count = FLAG_turbo_deoptimization ? 1 : 0; + EXPECT_EQ(3, op->ValueInputCount()); + EXPECT_EQ(1, OperatorProperties::GetContextInputCount(op)); + EXPECT_EQ(frame_state_input_count, + OperatorProperties::GetFrameStateInputCount(op)); + EXPECT_EQ(1, op->EffectInputCount()); + EXPECT_EQ(1, op->ControlInputCount()); + EXPECT_EQ(6 + frame_state_input_count, + OperatorProperties::GetTotalInputCount(op)); + + EXPECT_EQ(0, op->ValueOutputCount()); + EXPECT_EQ(1, op->EffectOutputCount()); + EXPECT_EQ(0, op->ControlOutputCount()); +} + + +TEST_P(JSStorePropertyOperatorTest, OpcodeIsCorrect) { + JSOperatorBuilder javascript(zone()); + const StrictMode mode = GetParam(); + const Operator* op = javascript.StoreProperty(mode); + EXPECT_EQ(IrOpcode::kJSStoreProperty, op->opcode()); +} + + +TEST_P(JSStorePropertyOperatorTest, OpParameter) { + JSOperatorBuilder javascript(zone()); + const StrictMode mode = GetParam(); + const Operator* op = javascript.StoreProperty(mode); + EXPECT_EQ(mode, OpParameter(op)); +} + + +TEST_P(JSStorePropertyOperatorTest, Properties) { + JSOperatorBuilder javascript(zone()); + const StrictMode mode = GetParam(); + const Operator* op = javascript.StoreProperty(mode); + EXPECT_EQ(Operator::kNoProperties, op->properties()); +} + + +INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSStorePropertyOperatorTest, + ::testing::Values(SLOPPY, STRICT)); + } // namespace compiler } // namespace internal } // namespace v8