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 "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 #include "src/compiler/change-lowering.h" | 6 #include "src/compiler/change-lowering.h" |
7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 #include "src/compiler/simplified-operator.h" | 10 #include "src/compiler/simplified-operator.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 class ChangeLoweringCommonTest | 99 class ChangeLoweringCommonTest |
100 : public ChangeLoweringTest, | 100 : public ChangeLoweringTest, |
101 public ::testing::WithParamInterface<MachineRepresentation> { | 101 public ::testing::WithParamInterface<MachineRepresentation> { |
102 public: | 102 public: |
103 ~ChangeLoweringCommonTest() override {} | 103 ~ChangeLoweringCommonTest() override {} |
104 | 104 |
105 MachineRepresentation WordRepresentation() const final { return GetParam(); } | 105 MachineRepresentation WordRepresentation() const final { return GetParam(); } |
106 }; | 106 }; |
107 | 107 |
108 TARGET_TEST_P(ChangeLoweringCommonTest, StoreFieldSmi) { | 108 TARGET_TEST_P(ChangeLoweringCommonTest, StoreFieldSmi) { |
109 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 109 FieldAccess access = { |
110 Handle<Name>::null(), Type::Any(), | 110 kTaggedBase, FixedArrayBase::kHeaderSize, Handle<Name>::null(), |
111 MachineType::AnyTagged()}; | 111 Type::Any(), MachineType::AnyTagged(), kNoWriteBarrier}; |
112 Node* p0 = Parameter(Type::TaggedPointer()); | 112 Node* p0 = Parameter(Type::TaggedPointer()); |
113 Node* p1 = Parameter(Type::TaggedSigned()); | 113 Node* p1 = Parameter(Type::TaggedSigned()); |
114 Node* store = graph()->NewNode(simplified()->StoreField(access), p0, p1, | 114 Node* store = graph()->NewNode(simplified()->StoreField(access), p0, p1, |
115 graph()->start(), graph()->start()); | 115 graph()->start(), graph()->start()); |
116 Reduction r = Reduce(store); | 116 Reduction r = Reduce(store); |
117 | 117 |
118 ASSERT_TRUE(r.Changed()); | 118 ASSERT_TRUE(r.Changed()); |
119 EXPECT_THAT(r.replacement(), | 119 EXPECT_THAT(r.replacement(), |
120 IsStore(StoreRepresentation(MachineRepresentation::kTagged, | 120 IsStore(StoreRepresentation(MachineRepresentation::kTagged, |
121 kNoWriteBarrier), | 121 kNoWriteBarrier), |
122 p0, IsIntPtrConstant(access.offset - access.tag()), p1, | 122 p0, IsIntPtrConstant(access.offset - access.tag()), p1, |
123 graph()->start(), graph()->start())); | 123 graph()->start(), graph()->start())); |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 TARGET_TEST_P(ChangeLoweringCommonTest, StoreFieldTagged) { | 127 TARGET_TEST_P(ChangeLoweringCommonTest, StoreFieldTagged) { |
128 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 128 FieldAccess access = { |
129 Handle<Name>::null(), Type::Any(), | 129 kTaggedBase, FixedArrayBase::kHeaderSize, Handle<Name>::null(), |
130 MachineType::AnyTagged()}; | 130 Type::Any(), MachineType::AnyTagged(), kFullWriteBarrier}; |
131 Node* p0 = Parameter(Type::TaggedPointer()); | 131 Node* p0 = Parameter(Type::TaggedPointer()); |
132 Node* p1 = Parameter(Type::Tagged()); | 132 Node* p1 = Parameter(Type::Tagged()); |
133 Node* store = graph()->NewNode(simplified()->StoreField(access), p0, p1, | 133 Node* store = graph()->NewNode(simplified()->StoreField(access), p0, p1, |
134 graph()->start(), graph()->start()); | 134 graph()->start(), graph()->start()); |
135 Reduction r = Reduce(store); | 135 Reduction r = Reduce(store); |
136 | 136 |
137 ASSERT_TRUE(r.Changed()); | 137 ASSERT_TRUE(r.Changed()); |
138 EXPECT_THAT(r.replacement(), | 138 EXPECT_THAT(r.replacement(), |
139 IsStore(StoreRepresentation(MachineRepresentation::kTagged, | 139 IsStore(StoreRepresentation(MachineRepresentation::kTagged, |
140 kFullWriteBarrier), | 140 kFullWriteBarrier), |
141 p0, IsIntPtrConstant(access.offset - access.tag()), p1, | 141 p0, IsIntPtrConstant(access.offset - access.tag()), p1, |
142 graph()->start(), graph()->start())); | 142 graph()->start(), graph()->start())); |
143 } | 143 } |
144 | 144 |
145 | 145 |
146 TARGET_TEST_P(ChangeLoweringCommonTest, LoadField) { | 146 TARGET_TEST_P(ChangeLoweringCommonTest, LoadField) { |
147 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 147 FieldAccess access = { |
148 Handle<Name>::null(), Type::Any(), | 148 kTaggedBase, FixedArrayBase::kHeaderSize, Handle<Name>::null(), |
149 MachineType::AnyTagged()}; | 149 Type::Any(), MachineType::AnyTagged(), kNoWriteBarrier}; |
150 Node* p0 = Parameter(Type::TaggedPointer()); | 150 Node* p0 = Parameter(Type::TaggedPointer()); |
151 Node* load = graph()->NewNode(simplified()->LoadField(access), p0, | 151 Node* load = graph()->NewNode(simplified()->LoadField(access), p0, |
152 graph()->start(), graph()->start()); | 152 graph()->start(), graph()->start()); |
153 Reduction r = Reduce(load); | 153 Reduction r = Reduce(load); |
154 | 154 |
155 ASSERT_TRUE(r.Changed()); | 155 ASSERT_TRUE(r.Changed()); |
156 Matcher<Node*> index_match = IsIntPtrConstant(access.offset - access.tag()); | 156 Matcher<Node*> index_match = IsIntPtrConstant(access.offset - access.tag()); |
157 EXPECT_THAT(r.replacement(), | 157 EXPECT_THAT(r.replacement(), |
158 IsLoad(MachineType::AnyTagged(), p0, | 158 IsLoad(MachineType::AnyTagged(), p0, |
159 IsIntPtrConstant(access.offset - access.tag()), | 159 IsIntPtrConstant(access.offset - access.tag()), |
160 graph()->start(), graph()->start())); | 160 graph()->start(), graph()->start())); |
161 } | 161 } |
162 | 162 |
163 | 163 |
164 TARGET_TEST_P(ChangeLoweringCommonTest, StoreElementTagged) { | 164 TARGET_TEST_P(ChangeLoweringCommonTest, StoreElementTagged) { |
165 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 165 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
166 MachineType::AnyTagged()}; | 166 MachineType::AnyTagged(), kFullWriteBarrier}; |
167 Node* p0 = Parameter(Type::TaggedPointer()); | 167 Node* p0 = Parameter(Type::TaggedPointer()); |
168 Node* p1 = Parameter(Type::Signed32()); | 168 Node* p1 = Parameter(Type::Signed32()); |
169 Node* p2 = Parameter(Type::Tagged()); | 169 Node* p2 = Parameter(Type::Tagged()); |
170 Node* store = graph()->NewNode(simplified()->StoreElement(access), p0, p1, p2, | 170 Node* store = graph()->NewNode(simplified()->StoreElement(access), p0, p1, p2, |
171 graph()->start(), graph()->start()); | 171 graph()->start(), graph()->start()); |
172 Reduction r = Reduce(store); | 172 Reduction r = Reduce(store); |
173 | 173 |
174 const int element_size_shift = | 174 const int element_size_shift = |
175 ElementSizeLog2Of(access.machine_type.representation()); | 175 ElementSizeLog2Of(access.machine_type.representation()); |
176 ASSERT_TRUE(r.Changed()); | 176 ASSERT_TRUE(r.Changed()); |
177 Matcher<Node*> index_match = | 177 Matcher<Node*> index_match = |
178 IsInt32Add(IsWord32Shl(p1, IsInt32Constant(element_size_shift)), | 178 IsInt32Add(IsWord32Shl(p1, IsInt32Constant(element_size_shift)), |
179 IsInt32Constant(access.header_size - access.tag())); | 179 IsInt32Constant(access.header_size - access.tag())); |
180 if (!Is32()) { | 180 if (!Is32()) { |
181 index_match = IsChangeUint32ToUint64(index_match); | 181 index_match = IsChangeUint32ToUint64(index_match); |
182 } | 182 } |
183 | 183 |
184 EXPECT_THAT(r.replacement(), | 184 EXPECT_THAT(r.replacement(), |
185 IsStore(StoreRepresentation(MachineRepresentation::kTagged, | 185 IsStore(StoreRepresentation(MachineRepresentation::kTagged, |
186 kFullWriteBarrier), | 186 kFullWriteBarrier), |
187 p0, index_match, p2, graph()->start(), graph()->start())); | 187 p0, index_match, p2, graph()->start(), graph()->start())); |
188 } | 188 } |
189 | 189 |
190 | 190 |
191 TARGET_TEST_P(ChangeLoweringCommonTest, StoreElementUint8) { | 191 TARGET_TEST_P(ChangeLoweringCommonTest, StoreElementUint8) { |
192 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 192 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
193 Type::Signed32(), MachineType::Uint8()}; | 193 Type::Signed32(), MachineType::Uint8(), |
| 194 kNoWriteBarrier}; |
194 Node* p0 = Parameter(Type::TaggedPointer()); | 195 Node* p0 = Parameter(Type::TaggedPointer()); |
195 Node* p1 = Parameter(Type::Signed32()); | 196 Node* p1 = Parameter(Type::Signed32()); |
196 Node* p2 = Parameter(Type::Signed32()); | 197 Node* p2 = Parameter(Type::Signed32()); |
197 Node* store = graph()->NewNode(simplified()->StoreElement(access), p0, p1, p2, | 198 Node* store = graph()->NewNode(simplified()->StoreElement(access), p0, p1, p2, |
198 graph()->start(), graph()->start()); | 199 graph()->start(), graph()->start()); |
199 Reduction r = Reduce(store); | 200 Reduction r = Reduce(store); |
200 | 201 |
201 ASSERT_TRUE(r.Changed()); | 202 ASSERT_TRUE(r.Changed()); |
202 Matcher<Node*> index_match = | 203 Matcher<Node*> index_match = |
203 IsInt32Add(p1, IsInt32Constant(access.header_size - access.tag())); | 204 IsInt32Add(p1, IsInt32Constant(access.header_size - access.tag())); |
204 if (!Is32()) { | 205 if (!Is32()) { |
205 index_match = IsChangeUint32ToUint64(index_match); | 206 index_match = IsChangeUint32ToUint64(index_match); |
206 } | 207 } |
207 | 208 |
208 EXPECT_THAT(r.replacement(), | 209 EXPECT_THAT(r.replacement(), |
209 IsStore(StoreRepresentation(MachineRepresentation::kWord8, | 210 IsStore(StoreRepresentation(MachineRepresentation::kWord8, |
210 kNoWriteBarrier), | 211 kNoWriteBarrier), |
211 p0, index_match, p2, graph()->start(), graph()->start())); | 212 p0, index_match, p2, graph()->start(), graph()->start())); |
212 } | 213 } |
213 | 214 |
214 | 215 |
215 TARGET_TEST_P(ChangeLoweringCommonTest, LoadElementTagged) { | 216 TARGET_TEST_P(ChangeLoweringCommonTest, LoadElementTagged) { |
216 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 217 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
217 MachineType::AnyTagged()}; | 218 MachineType::AnyTagged(), kNoWriteBarrier}; |
218 Node* p0 = Parameter(Type::TaggedPointer()); | 219 Node* p0 = Parameter(Type::TaggedPointer()); |
219 Node* p1 = Parameter(Type::Signed32()); | 220 Node* p1 = Parameter(Type::Signed32()); |
220 Node* load = graph()->NewNode(simplified()->LoadElement(access), p0, p1, | 221 Node* load = graph()->NewNode(simplified()->LoadElement(access), p0, p1, |
221 graph()->start(), graph()->start()); | 222 graph()->start(), graph()->start()); |
222 Reduction r = Reduce(load); | 223 Reduction r = Reduce(load); |
223 | 224 |
224 const int element_size_shift = | 225 const int element_size_shift = |
225 ElementSizeLog2Of(access.machine_type.representation()); | 226 ElementSizeLog2Of(access.machine_type.representation()); |
226 ASSERT_TRUE(r.Changed()); | 227 ASSERT_TRUE(r.Changed()); |
227 Matcher<Node*> index_match = | 228 Matcher<Node*> index_match = |
228 IsInt32Add(IsWord32Shl(p1, IsInt32Constant(element_size_shift)), | 229 IsInt32Add(IsWord32Shl(p1, IsInt32Constant(element_size_shift)), |
229 IsInt32Constant(access.header_size - access.tag())); | 230 IsInt32Constant(access.header_size - access.tag())); |
230 if (!Is32()) { | 231 if (!Is32()) { |
231 index_match = IsChangeUint32ToUint64(index_match); | 232 index_match = IsChangeUint32ToUint64(index_match); |
232 } | 233 } |
233 | 234 |
234 EXPECT_THAT(r.replacement(), IsLoad(MachineType::AnyTagged(), p0, index_match, | 235 EXPECT_THAT(r.replacement(), IsLoad(MachineType::AnyTagged(), p0, index_match, |
235 graph()->start(), graph()->start())); | 236 graph()->start(), graph()->start())); |
236 } | 237 } |
237 | 238 |
238 | 239 |
239 TARGET_TEST_P(ChangeLoweringCommonTest, LoadElementInt8) { | 240 TARGET_TEST_P(ChangeLoweringCommonTest, LoadElementInt8) { |
240 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 241 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
241 Type::Signed32(), MachineType::Int8()}; | 242 Type::Signed32(), MachineType::Int8(), |
| 243 kNoWriteBarrier}; |
242 Node* p0 = Parameter(Type::TaggedPointer()); | 244 Node* p0 = Parameter(Type::TaggedPointer()); |
243 Node* p1 = Parameter(Type::Signed32()); | 245 Node* p1 = Parameter(Type::Signed32()); |
244 Node* load = graph()->NewNode(simplified()->LoadElement(access), p0, p1, | 246 Node* load = graph()->NewNode(simplified()->LoadElement(access), p0, p1, |
245 graph()->start(), graph()->start()); | 247 graph()->start(), graph()->start()); |
246 Reduction r = Reduce(load); | 248 Reduction r = Reduce(load); |
247 | 249 |
248 ASSERT_TRUE(r.Changed()); | 250 ASSERT_TRUE(r.Changed()); |
249 Matcher<Node*> index_match = | 251 Matcher<Node*> index_match = |
250 IsInt32Add(p1, IsInt32Constant(access.header_size - access.tag())); | 252 IsInt32Add(p1, IsInt32Constant(access.header_size - access.tag())); |
251 if (!Is32()) { | 253 if (!Is32()) { |
(...skipping 12 matching lines...) Expand all Loading... |
264 Reduction r = Reduce(alloc); | 266 Reduction r = Reduce(alloc); |
265 | 267 |
266 // Only check that we lowered, but do not specify the exact form since | 268 // Only check that we lowered, but do not specify the exact form since |
267 // this is subject to change. | 269 // this is subject to change. |
268 ASSERT_TRUE(r.Changed()); | 270 ASSERT_TRUE(r.Changed()); |
269 } | 271 } |
270 | 272 |
271 } // namespace compiler | 273 } // namespace compiler |
272 } // namespace internal | 274 } // namespace internal |
273 } // namespace v8 | 275 } // namespace v8 |
OLD | NEW |