Lines Matching defs:node
12 #include "src/compiler/node-matchers.h"
13 #include "src/compiler/node-properties.h"
14 #include "src/compiler/node.h"
23 bool CanAllocate(const Node* node) {
24 switch (node->opcode()) {
49 // We should introduce a special bump-pointer store node to
91 return !(CallDescriptorOf(node->op())->flags() &
145 void WriteBarrierAssertFailed(Node* node, Node* object, const char* name,
148 str << "MemoryOptimizer could not remove write barrier for node #"
149 << node->id() << "\n";
150 str << " Run mksnapshot with --csa-trap-on-node=" << name << ","
151 << node->id() << " to break in CSA code.\n";
158 allocating_node = SearchAllocatingNode(node, object_position, temp_zone);
161 str << "\n There is a potentially allocating node in between:\n";
163 str << " Run mksnapshot with --csa-trap-on-node=" << name << ","
174 str << " Run mksnapshot with --csa-trap-on-node=" << name << ","
201 VisitNode(token.node, token.state);
207 void MemoryOptimizer::VisitNode(Node* node, AllocationState const* state) {
209 DCHECK(!node->IsDead());
210 DCHECK_LT(0, node->op()->EffectInputCount());
211 switch (node->opcode()) {
217 return VisitAllocateRaw(node, state);
219 return VisitCall(node, state);
222 return VisitLoadFromObject(node, state);
224 return VisitLoadElement(node, state);
226 return VisitLoadField(node, state);
229 return VisitStoreToObject(node, state);
231 return VisitStoreElement(node, state);
233 return VisitStoreField(node, state);
235 return VisitStore(node, state);
237 if (!CanAllocate(node)) {
239 return VisitOtherEffect(node, state);
242 DCHECK_EQ(0, node->op()->EffectOutputCount());
245 bool MemoryOptimizer::AllocationTypeNeedsUpdateToOld(Node* const node,
248 if (node->opcode() == IrOpcode::kStoreField && edge.index() == 1) {
249 Node* parent = node->InputAt(0);
259 void MemoryOptimizer::ReplaceUsesAndKillNode(Node* node, Node* replacement) {
260 // Replace all uses of node and kill the node to make sure we don't leave
262 DCHECK_NE(replacement, node);
263 NodeProperties::ReplaceUses(node, replacement, graph_assembler_.effect(),
265 node->Kill();
268 void MemoryOptimizer::VisitAllocateRaw(Node* node,
270 DCHECK_EQ(IrOpcode::kAllocateRaw, node->opcode());
271 const AllocateParameters& allocation = AllocateParametersOf(node->op());
279 for (Edge const edge : node->use_edges()) {
285 NodeProperties::ChangeOp(child, node->op());
292 for (Edge const edge : node->use_edges()) {
302 node, allocation_type, allocation.allow_large_objects(), &state);
303 CHECK(reduction.Changed() && reduction.replacement() != node);
305 ReplaceUsesAndKillNode(node, reduction.replacement());
310 void MemoryOptimizer::VisitLoadFromObject(Node* node,
312 DCHECK(node->opcode() == IrOpcode::kLoadFromObject ||
313 node->opcode() == IrOpcode::kLoadImmutableFromObject);
314 Reduction reduction = memory_lowering()->ReduceLoadFromObject(node);
315 EnqueueUses(node, state);
316 if (V8_MAP_PACKING_BOOL && reduction.replacement() != node) {
317 ReplaceUsesAndKillNode(node, reduction.replacement());
321 void MemoryOptimizer::VisitStoreToObject(Node* node,
323 DCHECK(node->opcode() == IrOpcode::kStoreToObject ||
324 node->opcode() == IrOpcode::kInitializeImmutableInObject);
325 memory_lowering()->ReduceStoreToObject(node, state);
326 EnqueueUses(node, state);
329 void MemoryOptimizer::VisitLoadElement(Node* node,
331 DCHECK_EQ(IrOpcode::kLoadElement, node->opcode());
332 memory_lowering()->ReduceLoadElement(node);
333 EnqueueUses(node, state);
336 void MemoryOptimizer::VisitLoadField(Node* node, AllocationState const* state) {
337 DCHECK_EQ(IrOpcode::kLoadField, node->opcode());
338 Reduction reduction = memory_lowering()->ReduceLoadField(node);
341 // lowering, so we can proceed iterating the graph from the node uses.
342 EnqueueUses(node, state);
349 reduction.replacement() == node);
351 reduction.replacement() != node) {
352 ReplaceUsesAndKillNode(node, reduction.replacement());
356 void MemoryOptimizer::VisitStoreElement(Node* node,
358 DCHECK_EQ(IrOpcode::kStoreElement, node->opcode());
359 memory_lowering()->ReduceStoreElement(node, state);
360 EnqueueUses(node, state);
363 void MemoryOptimizer::VisitStoreField(Node* node,
365 DCHECK_EQ(IrOpcode::kStoreField, node->opcode());
366 memory_lowering()->ReduceStoreField(node, state);
367 EnqueueUses(node, state);
369 void MemoryOptimizer::VisitStore(Node* node, AllocationState const* state) {
370 DCHECK_EQ(IrOpcode::kStore, node->opcode());
371 memory_lowering()->ReduceStore(node, state);
372 EnqueueUses(node, state);
375 void MemoryOptimizer::VisitCall(Node* node, AllocationState const* state) {
376 DCHECK_EQ(IrOpcode::kCall, node->opcode());
378 if (!(CallDescriptorOf(node->op())->flags() & CallDescriptor::kNoAllocate)) {
381 EnqueueUses(node, state);
384 void MemoryOptimizer::VisitOtherEffect(Node* node,
386 EnqueueUses(node, state);
415 void MemoryOptimizer::EnqueueMerge(Node* node, int index,
417 DCHECK_EQ(IrOpcode::kEffectPhi, node->opcode());
418 int const input_count = node->InputCount() - 1;
420 Node* const control = node->InputAt(input_count);
423 if (CanLoopAllocate(node, zone())) {
426 EnqueueUses(node, empty_state());
430 EnqueueUses(node, state);
438 NodeId const id = node->id();
450 // EffectPhi {node}.
452 EnqueueUses(node, state);
458 void MemoryOptimizer::EnqueueUses(Node* node, AllocationState const* state) {
459 for (Edge const edge : node->use_edges()) {
466 void MemoryOptimizer::EnqueueUse(Node* node, int index,
468 if (node->opcode() == IrOpcode::kEffectPhi) {
472 EnqueueMerge(node, index, state);
474 Token token = {node, state};