@@ -188,8 +188,9 @@ static void getEffectedValues(Operation *op, SmallVectorImpl<Value> &values) {
188188
189189// / Add `op` to MDG creating a new node and adding its memory accesses (affine
190190// / or non-affine to memrefAccesses (memref -> list of nodes with accesses) map.
191- Node *addNodeToMDG (Operation *nodeOp, MemRefDependenceGraph &mdg,
192- DenseMap<Value, SetVector<unsigned >> &memrefAccesses) {
191+ static Node *
192+ addNodeToMDG (Operation *nodeOp, MemRefDependenceGraph &mdg,
193+ DenseMap<Value, SetVector<unsigned >> &memrefAccesses) {
193194 auto &nodes = mdg.nodes ;
194195 // Create graph node 'id' to represent top-level 'forOp' and record
195196 // all loads and store accesses it contains.
@@ -359,14 +360,14 @@ bool MemRefDependenceGraph::init() {
359360}
360361
361362// Returns the graph node for 'id'.
362- Node *MemRefDependenceGraph::getNode (unsigned id) {
363+ const Node *MemRefDependenceGraph::getNode (unsigned id) const {
363364 auto it = nodes.find (id);
364365 assert (it != nodes.end ());
365366 return &it->second ;
366367}
367368
368369// Returns the graph node for 'forOp'.
369- Node *MemRefDependenceGraph::getForOpNode (AffineForOp forOp) {
370+ const Node *MemRefDependenceGraph::getForOpNode (AffineForOp forOp) const {
370371 for (auto &idAndNode : nodes)
371372 if (idAndNode.second .op == forOp)
372373 return &idAndNode.second ;
@@ -390,7 +391,7 @@ void MemRefDependenceGraph::removeNode(unsigned id) {
390391 }
391392 }
392393 // Remove each edge in 'outEdges[id]'.
393- if (outEdges.count (id) > 0 ) {
394+ if (outEdges.contains (id)) {
394395 SmallVector<Edge, 2 > oldOutEdges = outEdges[id];
395396 for (auto &outEdge : oldOutEdges) {
396397 removeEdge (id, outEdge.id , outEdge.value );
@@ -404,8 +405,8 @@ void MemRefDependenceGraph::removeNode(unsigned id) {
404405
405406// Returns true if node 'id' writes to any memref which escapes (or is an
406407// argument to) the block. Returns false otherwise.
407- bool MemRefDependenceGraph::writesToLiveInOrEscapingMemrefs (unsigned id) {
408- Node *node = getNode (id);
408+ bool MemRefDependenceGraph::writesToLiveInOrEscapingMemrefs (unsigned id) const {
409+ const Node *node = getNode (id);
409410 for (auto *storeOpInst : node->stores ) {
410411 auto memref = cast<AffineWriteOpInterface>(storeOpInst).getMemRef ();
411412 auto *op = memref.getDefiningOp ();
@@ -425,14 +426,14 @@ bool MemRefDependenceGraph::writesToLiveInOrEscapingMemrefs(unsigned id) {
425426// is for 'value' if non-null, or for any value otherwise. Returns false
426427// otherwise.
427428bool MemRefDependenceGraph::hasEdge (unsigned srcId, unsigned dstId,
428- Value value) {
429- if (outEdges.count (srcId) == 0 || inEdges.count (dstId) == 0 ) {
429+ Value value) const {
430+ if (! outEdges.contains (srcId) || ! inEdges.contains (dstId)) {
430431 return false ;
431432 }
432- bool hasOutEdge = llvm::any_of (outEdges[ srcId] , [=](Edge &edge) {
433+ bool hasOutEdge = llvm::any_of (outEdges. lookup ( srcId) , [=](const Edge &edge) {
433434 return edge.id == dstId && (!value || edge.value == value);
434435 });
435- bool hasInEdge = llvm::any_of (inEdges[ dstId] , [=](Edge &edge) {
436+ bool hasInEdge = llvm::any_of (inEdges. lookup ( dstId) , [=](const Edge &edge) {
436437 return edge.id == srcId && (!value || edge.value == value);
437438 });
438439 return hasOutEdge && hasInEdge;
@@ -477,7 +478,8 @@ void MemRefDependenceGraph::removeEdge(unsigned srcId, unsigned dstId,
477478// Returns true if there is a path in the dependence graph from node 'srcId'
478479// to node 'dstId'. Returns false otherwise. `srcId`, `dstId`, and the
479480// operations that the edges connected are expected to be from the same block.
480- bool MemRefDependenceGraph::hasDependencePath (unsigned srcId, unsigned dstId) {
481+ bool MemRefDependenceGraph::hasDependencePath (unsigned srcId,
482+ unsigned dstId) const {
481483 // Worklist state is: <node-id, next-output-edge-index-to-visit>
482484 SmallVector<std::pair<unsigned , unsigned >, 4 > worklist;
483485 worklist.push_back ({srcId, 0 });
@@ -490,13 +492,13 @@ bool MemRefDependenceGraph::hasDependencePath(unsigned srcId, unsigned dstId) {
490492 return true ;
491493 // Pop and continue if node has no out edges, or if all out edges have
492494 // already been visited.
493- if (outEdges.count (idAndIndex.first ) == 0 ||
494- idAndIndex.second == outEdges[ idAndIndex.first ] .size ()) {
495+ if (! outEdges.contains (idAndIndex.first ) ||
496+ idAndIndex.second == outEdges. lookup ( idAndIndex.first ) .size ()) {
495497 worklist.pop_back ();
496498 continue ;
497499 }
498500 // Get graph edge to traverse.
499- Edge edge = outEdges[ idAndIndex.first ] [idAndIndex.second ];
501+ const Edge edge = outEdges. lookup ( idAndIndex.first ) [idAndIndex.second ];
500502 // Increment next output edge index for 'idAndIndex'.
501503 ++idAndIndex.second ;
502504 // Add node at 'edge.id' to the worklist. We don't need to consider
@@ -512,34 +514,34 @@ bool MemRefDependenceGraph::hasDependencePath(unsigned srcId, unsigned dstId) {
512514// Returns the input edge count for node 'id' and 'memref' from src nodes
513515// which access 'memref' with a store operation.
514516unsigned MemRefDependenceGraph::getIncomingMemRefAccesses (unsigned id,
515- Value memref) {
517+ Value memref) const {
516518 unsigned inEdgeCount = 0 ;
517- if ( inEdges.count (id) > 0 )
518- for ( auto & inEdge : inEdges[id])
519- if (inEdge. value == memref) {
520- Node * srcNode = getNode (inEdge. id );
521- // Only count in edges from 'srcNode' if ' srcNode' accesses 'memref'
522- if (srcNode-> getStoreOpCount (memref) > 0 )
523- ++inEdgeCount;
524- }
519+ for ( const Edge &inEdge : inEdges.lookup (id)) {
520+ if ( inEdge. value == memref) {
521+ const Node *srcNode = getNode (inEdge. id );
522+ // Only count in edges from ' srcNode' if 'srcNode' accesses 'memref'
523+ if ( srcNode-> getStoreOpCount (memref) > 0 )
524+ ++inEdgeCount;
525+ }
526+ }
525527 return inEdgeCount;
526528}
527529
528530// Returns the output edge count for node 'id' and 'memref' (if non-null),
529531// otherwise returns the total output edge count from node 'id'.
530- unsigned MemRefDependenceGraph::getOutEdgeCount (unsigned id, Value memref) {
532+ unsigned MemRefDependenceGraph::getOutEdgeCount (unsigned id,
533+ Value memref) const {
531534 unsigned outEdgeCount = 0 ;
532- if (outEdges.count (id) > 0 )
533- for (auto &outEdge : outEdges[id])
534- if (!memref || outEdge.value == memref)
535- ++outEdgeCount;
535+ for (const auto &outEdge : outEdges.lookup (id))
536+ if (!memref || outEdge.value == memref)
537+ ++outEdgeCount;
536538 return outEdgeCount;
537539}
538540
539541// / Return all nodes which define SSA values used in node 'id'.
540542void MemRefDependenceGraph::gatherDefiningNodes (
541- unsigned id, DenseSet<unsigned > &definingNodes) {
542- for (MemRefDependenceGraph:: Edge edge : inEdges[id] )
543+ unsigned id, DenseSet<unsigned > &definingNodes) const {
544+ for (const Edge & edge : inEdges. lookup (id) )
543545 // By definition of edge, if the edge value is a non-memref value,
544546 // then the dependence is between a graph node which defines an SSA value
545547 // and another graph node which uses the SSA value.
@@ -552,8 +554,8 @@ void MemRefDependenceGraph::gatherDefiningNodes(
552554// dependences. Returns nullptr if no such insertion point is found.
553555Operation *
554556MemRefDependenceGraph::getFusedLoopNestInsertionPoint (unsigned srcId,
555- unsigned dstId) {
556- if (outEdges.count (srcId) == 0 )
557+ unsigned dstId) const {
558+ if (! outEdges.contains (srcId))
557559 return getNode (dstId)->op ;
558560
559561 // Skip if there is any defining node of 'dstId' that depends on 'srcId'.
@@ -569,13 +571,13 @@ MemRefDependenceGraph::getFusedLoopNestInsertionPoint(unsigned srcId,
569571
570572 // Build set of insts in range (srcId, dstId) which depend on 'srcId'.
571573 SmallPtrSet<Operation *, 2 > srcDepInsts;
572- for (auto &outEdge : outEdges[ srcId] )
574+ for (auto &outEdge : outEdges. lookup ( srcId) )
573575 if (outEdge.id != dstId)
574576 srcDepInsts.insert (getNode (outEdge.id )->op );
575577
576578 // Build set of insts in range (srcId, dstId) on which 'dstId' depends.
577579 SmallPtrSet<Operation *, 2 > dstDepInsts;
578- for (auto &inEdge : inEdges[ dstId] )
580+ for (auto &inEdge : inEdges. lookup ( dstId) )
579581 if (inEdge.id != srcId)
580582 dstDepInsts.insert (getNode (inEdge.id )->op );
581583
@@ -635,7 +637,7 @@ void MemRefDependenceGraph::updateEdges(unsigned srcId, unsigned dstId,
635637 SmallVector<Edge, 2 > oldInEdges = inEdges[srcId];
636638 for (auto &inEdge : oldInEdges) {
637639 // Add edge from 'inEdge.id' to 'dstId' if it's not a private memref.
638- if (privateMemRefs.count (inEdge.value ) == 0 )
640+ if (! privateMemRefs.contains (inEdge.value ))
639641 addEdge (inEdge.id , dstId, inEdge.value );
640642 }
641643 }
0 commit comments