Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
|
Jarin
2016/07/04 13:18:07
Actually, this is unit-testable, so we should test
Benedikt Meurer
2016/07/05 11:29:09
Done.
| |
| 4 | |
| 5 #include "src/compiler/access-builder.h" | |
| 6 #include "src/compiler/load-elimination.h" | |
| 7 #include "src/compiler/simplified-operator.h" | |
| 8 #include "test/unittests/compiler/graph-unittest.h" | |
| 9 #include "test/unittests/compiler/node-test-utils.h" | |
| 10 | |
| 11 namespace v8 { | |
| 12 namespace internal { | |
| 13 namespace compiler { | |
| 14 | |
| 15 class LoadEliminationTest : public TypedGraphTest { | |
| 16 public: | |
| 17 LoadEliminationTest() : TypedGraphTest(3), simplified_(zone()) {} | |
| 18 ~LoadEliminationTest() override {} | |
| 19 | |
| 20 protected: | |
| 21 Reduction Reduce(Node* node) { | |
| 22 // TODO(titzer): mock the GraphReducer here for better unit testing. | |
| 23 GraphReducer graph_reducer(zone(), graph()); | |
| 24 LoadElimination reducer(&graph_reducer, graph(), simplified()); | |
| 25 return reducer.Reduce(node); | |
| 26 } | |
| 27 | |
| 28 SimplifiedOperatorBuilder* simplified() { return &simplified_; } | |
| 29 | |
| 30 private: | |
| 31 SimplifiedOperatorBuilder simplified_; | |
| 32 }; | |
| 33 | |
| 34 | |
| 35 TEST_F(LoadEliminationTest, LoadFieldWithStoreField) { | |
| 36 Node* object1 = Parameter(Type::Any(), 0); | |
| 37 Node* object2 = Parameter(Type::Any(), 1); | |
| 38 Node* value = Parameter(Type::Any(), 2); | |
| 39 Node* effect = graph()->start(); | |
| 40 Node* control = graph()->start(); | |
| 41 | |
| 42 FieldAccess access1 = AccessBuilder::ForContextSlot(42); | |
| 43 Node* store1 = graph()->NewNode(simplified()->StoreField(access1), object1, | |
| 44 value, effect, control); | |
| 45 Reduction r1 = Reduce(graph()->NewNode(simplified()->LoadField(access1), | |
| 46 object1, store1, control)); | |
| 47 ASSERT_TRUE(r1.Changed()); | |
| 48 EXPECT_EQ(value, r1.replacement()); | |
| 49 | |
| 50 FieldAccess access2 = AccessBuilder::ForMap(); | |
| 51 Node* store2 = graph()->NewNode(simplified()->StoreField(access2), object1, | |
| 52 object2, store1, control); | |
| 53 Reduction r2 = Reduce(graph()->NewNode(simplified()->LoadField(access2), | |
| 54 object1, store2, control)); | |
| 55 ASSERT_TRUE(r2.Changed()); | |
| 56 EXPECT_EQ(object2, r2.replacement()); | |
| 57 | |
| 58 Node* store3 = graph()->NewNode( | |
| 59 simplified()->StoreBuffer(BufferAccess(kExternalInt8Array)), object2, | |
| 60 value, Int32Constant(10), object1, store2, control); | |
| 61 | |
| 62 Reduction r3 = Reduce(graph()->NewNode(simplified()->LoadField(access1), | |
| 63 object2, store3, control)); | |
| 64 ASSERT_FALSE(r3.Changed()); | |
| 65 | |
| 66 Reduction r4 = Reduce(graph()->NewNode(simplified()->LoadField(access1), | |
| 67 object1, store3, control)); | |
| 68 ASSERT_TRUE(r4.Changed()); | |
| 69 EXPECT_EQ(value, r4.replacement()); | |
| 70 } | |
| 71 | |
| 72 } // namespace compiler | |
| 73 } // namespace internal | |
| 74 } // namespace v8 | |
| OLD | NEW |