OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/compiler/memory-optimizer.h" | 5 #include "src/compiler/memory-optimizer.h" |
6 | 6 |
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-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 // Update the allocation top with the new object allocation. | 139 // Update the allocation top with the new object allocation. |
140 // TODO(bmeurer): Defer writing back top as much as possible. | 140 // TODO(bmeurer): Defer writing back top as much as possible. |
141 Node* top = graph()->NewNode(machine()->IntAdd(), state->top(), | 141 Node* top = graph()->NewNode(machine()->IntAdd(), state->top(), |
142 jsgraph()->IntPtrConstant(object_size)); | 142 jsgraph()->IntPtrConstant(object_size)); |
143 effect = graph()->NewNode( | 143 effect = graph()->NewNode( |
144 machine()->Store(StoreRepresentation( | 144 machine()->Store(StoreRepresentation( |
145 MachineType::PointerRepresentation(), kNoWriteBarrier)), | 145 MachineType::PointerRepresentation(), kNoWriteBarrier)), |
146 top_address, jsgraph()->IntPtrConstant(0), top, effect, control); | 146 top_address, jsgraph()->IntPtrConstant(0), top, effect, control); |
147 | 147 |
148 // Compute the effective inner allocated address. | 148 // Compute the effective inner allocated address. |
149 value = graph()->NewNode(machine()->BitcastWordToTagged(), state->top()); | 149 value = graph()->NewNode( |
| 150 machine()->BitcastWordToTagged(), |
| 151 graph()->NewNode(machine()->IntAdd(), state->top(), |
| 152 jsgraph()->IntPtrConstant(kHeapObjectTag))); |
150 | 153 |
151 // Extend the allocation {group}. | 154 // Extend the allocation {group}. |
152 group->Add(value); | 155 group->Add(value); |
153 state = AllocationState::Open(group, state_size, top, zone()); | 156 state = AllocationState::Open(group, state_size, top, zone()); |
154 } else { | 157 } else { |
155 // Setup a mutable reservation size node; will be patched as we fold | 158 // Setup a mutable reservation size node; will be patched as we fold |
156 // additional allocations into this new group. | 159 // additional allocations into this new group. |
157 Node* size = graph()->NewNode(common()->Int32Constant(object_size)); | 160 Node* size = graph()->NewNode(common()->Int32Constant(object_size)); |
158 | 161 |
159 // Load allocation top and limit. | 162 // Load allocation top and limit. |
(...skipping 28 matching lines...) Expand all Loading... |
188 Node* target = pretenure == NOT_TENURED | 191 Node* target = pretenure == NOT_TENURED |
189 ? jsgraph()->AllocateInNewSpaceStubConstant() | 192 ? jsgraph()->AllocateInNewSpaceStubConstant() |
190 : jsgraph()->AllocateInOldSpaceStubConstant(); | 193 : jsgraph()->AllocateInOldSpaceStubConstant(); |
191 if (!allocate_operator_.is_set()) { | 194 if (!allocate_operator_.is_set()) { |
192 CallDescriptor* descriptor = | 195 CallDescriptor* descriptor = |
193 Linkage::GetAllocateCallDescriptor(graph()->zone()); | 196 Linkage::GetAllocateCallDescriptor(graph()->zone()); |
194 allocate_operator_.set(common()->Call(descriptor)); | 197 allocate_operator_.set(common()->Call(descriptor)); |
195 } | 198 } |
196 vfalse = efalse = graph()->NewNode(allocate_operator_.get(), target, | 199 vfalse = efalse = graph()->NewNode(allocate_operator_.get(), target, |
197 size, efalse, if_false); | 200 size, efalse, if_false); |
| 201 vfalse = graph()->NewNode(machine()->IntSub(), vfalse, |
| 202 jsgraph()->IntPtrConstant(kHeapObjectTag)); |
198 } | 203 } |
199 | 204 |
200 control = graph()->NewNode(common()->Merge(2), if_true, if_false); | 205 control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
201 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); | 206 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); |
202 value = graph()->NewNode( | 207 value = graph()->NewNode( |
203 common()->Phi(MachineType::PointerRepresentation(), 2), vtrue, vfalse, | 208 common()->Phi(MachineType::PointerRepresentation(), 2), vtrue, vfalse, |
204 control); | 209 control); |
205 | 210 |
206 // Compute the new top and write it back. | 211 // Compute the new top and write it back. |
207 top = graph()->NewNode(machine()->IntAdd(), value, | 212 top = graph()->NewNode(machine()->IntAdd(), value, |
208 jsgraph()->IntPtrConstant(object_size)); | 213 jsgraph()->IntPtrConstant(object_size)); |
209 effect = graph()->NewNode( | 214 effect = graph()->NewNode( |
210 machine()->Store(StoreRepresentation( | 215 machine()->Store(StoreRepresentation( |
211 MachineType::PointerRepresentation(), kNoWriteBarrier)), | 216 MachineType::PointerRepresentation(), kNoWriteBarrier)), |
212 top_address, jsgraph()->IntPtrConstant(0), top, effect, control); | 217 top_address, jsgraph()->IntPtrConstant(0), top, effect, control); |
213 | 218 |
214 // Compute the initial object address. | 219 // Compute the initial object address. |
215 value = graph()->NewNode(machine()->BitcastWordToTagged(), value); | 220 value = graph()->NewNode( |
| 221 machine()->BitcastWordToTagged(), |
| 222 graph()->NewNode(machine()->IntAdd(), value, |
| 223 jsgraph()->IntPtrConstant(kHeapObjectTag))); |
216 | 224 |
217 // Start a new allocation group. | 225 // Start a new allocation group. |
218 AllocationGroup* group = | 226 AllocationGroup* group = |
219 new (zone()) AllocationGroup(value, pretenure, size, zone()); | 227 new (zone()) AllocationGroup(value, pretenure, size, zone()); |
220 state = AllocationState::Open(group, object_size, top, zone()); | 228 state = AllocationState::Open(group, object_size, top, zone()); |
221 } | 229 } |
222 } else { | 230 } else { |
223 // Load allocation top and limit. | 231 // Load allocation top and limit. |
224 Node* top = effect = | 232 Node* top = effect = |
225 graph()->NewNode(machine()->Load(MachineType::Pointer()), top_address, | 233 graph()->NewNode(machine()->Load(MachineType::Pointer()), top_address, |
(...skipping 15 matching lines...) Expand all Loading... |
241 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 249 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
242 | 250 |
243 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 251 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
244 Node* etrue = effect; | 252 Node* etrue = effect; |
245 Node* vtrue; | 253 Node* vtrue; |
246 { | 254 { |
247 etrue = graph()->NewNode( | 255 etrue = graph()->NewNode( |
248 machine()->Store(StoreRepresentation( | 256 machine()->Store(StoreRepresentation( |
249 MachineType::PointerRepresentation(), kNoWriteBarrier)), | 257 MachineType::PointerRepresentation(), kNoWriteBarrier)), |
250 top_address, jsgraph()->IntPtrConstant(0), new_top, etrue, if_true); | 258 top_address, jsgraph()->IntPtrConstant(0), new_top, etrue, if_true); |
251 vtrue = graph()->NewNode(machine()->BitcastWordToTagged(), top); | 259 vtrue = graph()->NewNode( |
| 260 machine()->BitcastWordToTagged(), |
| 261 graph()->NewNode(machine()->IntAdd(), top, |
| 262 jsgraph()->IntPtrConstant(kHeapObjectTag))); |
252 } | 263 } |
253 | 264 |
254 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | 265 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
255 Node* efalse = effect; | 266 Node* efalse = effect; |
256 Node* vfalse; | 267 Node* vfalse; |
257 { | 268 { |
258 Node* target = pretenure == NOT_TENURED | 269 Node* target = pretenure == NOT_TENURED |
259 ? jsgraph()->AllocateInNewSpaceStubConstant() | 270 ? jsgraph()->AllocateInNewSpaceStubConstant() |
260 : jsgraph()->AllocateInOldSpaceStubConstant(); | 271 : jsgraph()->AllocateInOldSpaceStubConstant(); |
261 if (!allocate_operator_.is_set()) { | 272 if (!allocate_operator_.is_set()) { |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 return jsgraph()->common(); | 487 return jsgraph()->common(); |
477 } | 488 } |
478 | 489 |
479 MachineOperatorBuilder* MemoryOptimizer::machine() const { | 490 MachineOperatorBuilder* MemoryOptimizer::machine() const { |
480 return jsgraph()->machine(); | 491 return jsgraph()->machine(); |
481 } | 492 } |
482 | 493 |
483 } // namespace compiler | 494 } // namespace compiler |
484 } // namespace internal | 495 } // namespace internal |
485 } // namespace v8 | 496 } // namespace v8 |
OLD | NEW |