Lines Matching refs:node

10 #include "src/compiler/node-marker.h"
11 #include "src/compiler/node-properties.h"
12 #include "src/compiler/node.h"
30 // Temporary information for each node during marking.
32 Node* node;
53 // either a {Loop} node or a phi. The {Loop} node itself and its accompanying
58 // 1 bit per loop per node per direction are required during the marking phase.
90 if (ni.node == nullptr) continue;
92 int index = ni.node->id() * width_ + INDEX(i);
105 PrintF(" #%d:%s\n", ni.node->id(), ni.node->op()->mnemonic());
188 bool IsInLoop(Node* node, int loop_num) {
189 int offset = node->id() * width_ + INDEX(loop_num);
201 Node* node = queue_.front();
202 info(node).backwards_visited = true;
204 queued_.Set(node, false);
208 if (node->opcode() == IrOpcode::kLoop) {
209 // found the loop node first.
210 loop_num = CreateLoopInfo(node);
211 } else if (NodeProperties::IsPhi(node)) {
213 Node* merge = node->InputAt(node->InputCount() - 1);
217 } else if (node->opcode() == IrOpcode::kLoopExit) {
218 // Intentionally ignore return value. Loop exit node marks
220 CreateLoopInfo(node->InputAt(1));
221 } else if (node->opcode() == IrOpcode::kLoopExitValue ||
222 node->opcode() == IrOpcode::kLoopExitEffect) {
223 Node* loop_exit = NodeProperties::GetControlInput(node);
224 // Intentionally ignore return value. Loop exit node marks
229 // Propagate marks backwards from this node.
230 for (int i = 0; i < node->InputCount(); i++) {
231 Node* input = node->InputAt(i);
232 if (IsBackedge(node, i)) {
242 if (PropagateBackwardMarks(node, input, loop_num) ||
251 // Make a new loop if necessary for the given node.
252 int CreateLoopInfo(Node* node) {
253 DCHECK_EQ(IrOpcode::kLoop, node->opcode());
254 int loop_num = LoopNum(node);
261 loops_.push_back({node, nullptr, nullptr, nullptr, nullptr});
263 SetLoopMarkForLoopHeader(node, loop_num);
267 void SetLoopMark(Node* node, int loop_num) {
268 info(node); // create the NodeInfo
269 SetBackwardMark(node, loop_num);
270 loop_tree_->node_to_loop_num_[node->id()] = loop_num;
273 void SetLoopMarkForLoopHeader(Node* node, int loop_num) {
274 DCHECK_EQ(IrOpcode::kLoop, node->opcode());
275 SetLoopMark(node, loop_num);
276 for (Node* use : node->uses()) {
282 if (node->InputCount() <= 1) continue;
328 Node* node = queue_.front();
330 queued_.Set(node, false);
331 for (Edge edge : node->use_edges()) {
334 if (PropagateForwardMarks(node, use)) Queue(use);
340 bool IsLoopHeaderNode(Node* node) {
341 return node->opcode() == IrOpcode::kLoop || NodeProperties::IsPhi(node);
344 bool IsLoopExitNode(Node* node) {
345 return node->opcode() == IrOpcode::kLoopExit ||
346 node->opcode() == IrOpcode::kLoopExitValue ||
347 node->opcode() == IrOpcode::kLoopExitEffect;
362 int LoopNum(Node* node) { return loop_tree_->node_to_loop_num_[node->id()]; }
364 NodeInfo& info(Node* node) {
365 NodeInfo& i = info_[node->id()];
366 if (i.node == nullptr) i.node = node;
370 void Queue(Node* node) {
371 if (!queued_.Get(node)) {
372 queue_.push_back(node);
373 queued_.Set(node, true);
378 if (LoopNum(node_info->node) == loop_num) {
379 if (IsLoopHeaderNode(node_info->node)) {
383 DCHECK(IsLoopExitNode(node_info->node));
404 // Place the node into the innermost nested loop of which it is a member.
406 if (ni.node == nullptr) continue;
410 int pos = ni.node->id() * width_;
431 CHECK(ni.node->opcode() != IrOpcode::kReturn);
437 // Serialize the node lists for loops into the loop tree.
452 if (ni.node == nullptr || !IsInLoop(ni.node, 1)) continue;
455 CHECK(ni.node->opcode() != IrOpcode::kReturn);
461 // Serialize the node lists for the loop into the loop tree.
475 loop_tree_->loop_nodes_.push_back(ni->node);
476 loop_tree_->node_to_loop_num_[ni->node->id()] = loop_num;
482 loop_tree_->loop_nodes_.push_back(ni->node);
483 loop_tree_->node_to_loop_num_[ni->node->id()] = loop_num;
492 loop_tree_->loop_nodes_.push_back(ni->node);
493 loop_tree_->node_to_loop_num_[ni->node->id()] = loop_num;
508 if (IsInLoop(ni.node, i)) {
563 for (Node * use_name : node->uses()) { \
568 Node* node = queue.back();
570 if (node->opcode() == IrOpcode::kEnd) {
571 // We reached the end of the graph. The end node is not part of the loop.
574 visited->insert(node);
576 switch (node->opcode()) {
579 if (node != loop_header) return nullptr;
584 if (node->InputAt(1) != loop_header) return nullptr;
591 if (NodeProperties::GetControlInput(node)->InputAt(1) != loop_header) {
610 Node* callee = node->InputAt(0);
653 for (Node* node : *visited) {
655 if (node == loop_header) continue;
657 for (Edge edge : node->input_edges()) {
665 node->id(), node->op()->mnemonic(), loop_header->id(), input->id(),
680 for (Node* node : loop_tree->LoopNodes(loop)) {
681 for (Node* use : node->uses()) {
684 switch (node->opcode()) {
686 unmarked_exit = (node->InputAt(1) != loop_node);
690 unmarked_exit = (node->InputAt(1)->InputAt(1) != loop_node);
700 loop_node->id(), node->id(), node->op()->mnemonic(), use->id(),
720 Node* NodeCopier::map(Node* node, uint32_t copy_index) {
722 if (node_map_.Get(node) == 0) return node;
723 return copies_->at(node_map_.Get(node) + copy_index);