Lines Matching defs:sibNode
679 // *) Find a candidate sibling node 'sibNode' to fuse with 'dstNode' which
687 // *) Update graph state to reflect the fusion of 'sibNode' into 'dstNode'.
1103 // stores to the same memref in 'sibNode' loop nest.
1104 auto *sibNode = mdg->getNode(sibId);
1107 assert(sibNode->op->getBlock() == dstNode->op->getBlock());
1109 sibNode->op->isBeforeInBlock(dstNode->op)
1110 ? mdg->getFusedLoopNestInsertionPoint(sibNode->id, dstNode->id)
1111 : mdg->getFusedLoopNestInsertionPoint(dstNode->id, sibNode->id);
1117 // Get unique 'sibNode' load op to 'memref'.
1119 sibNode->getLoadOpsForMemref(memref, &sibLoadOpInsts);
1140 auto sibAffineForOp = cast<AffineForOp>(sibNode->op);
1194 updateStateAfterSiblingFusion(sibNode, dstNode);
1205 // Returns true if 'sibNode' can be fused with 'dstNode' for input reuse
1207 auto canFuseWithSibNode = [&](Node *sibNode, Value memref) {
1210 if (sibNode->getLoadOpCount(memref) != 1)
1213 // 'sibNode' and 'dstNode'.
1214 if (mdg->hasDependencePath(sibNode->id, dstNode->id) ||
1215 mdg->hasDependencePath(dstNode->id, sibNode->id))
1220 sibNode->getLoadAndStoreMemrefSet(&loadAndStoreMemrefSet);
1222 return mdg->getIncomingMemRefAccesses(sibNode->id, memref) > 0;
1228 for (auto *storeOpInst : sibNode->stores) {
1236 // access that lies between 'dstNode' and 'sibNode'.
1237 if (hasNonAffineUsersOnPath(dstNode->op, sibNode->op) ||
1238 hasNonAffineUsersOnPath(sibNode->op, dstNode->op))
1262 Node *sibNode = mdg->getForOpNode(*it);
1263 assert(sibNode != nullptr);
1265 if (sibNode->id == dstNode->id)
1268 if (visitedSibNodeIds->count(sibNode->id) > 0)
1274 // Check if 'sibNode/dstNode' can be input-reuse fused on 'memref'.
1275 if (canFuseWithSibNode(sibNode, memref)) {
1276 visitedSibNodeIds->insert(sibNode->id);
1277 idAndMemrefToFuse->first = sibNode->id;
1308 auto *sibNode = mdg->getNode(sibNodeId);
1309 if (!isa<AffineForOp>(sibNode->op))
1311 // Check if 'sibNode/dstNode' can be input-reuse fused on 'memref'.
1312 if (canFuseWithSibNode(sibNode, outEdge.value)) {
1329 /// Update data dependence graph state to reflect sibling fusion of 'sibNode'
1331 void updateStateAfterSiblingFusion(Node *sibNode, Node *dstNode) {
1332 // Update 'sibNode' and 'dstNode' input/output edges to reflect fusion.
1333 mdg->updateEdges(sibNode->id, dstNode->id);
1345 if (mdg->getOutEdgeCount(sibNode->id) == 0) {
1346 Operation *op = sibNode->op;
1347 mdg->removeNode(sibNode->id);