My Project
RegionGraphTraits.h
Go to the documentation of this file.
1 //===- RegionGraphTraits.h - llvm::GraphTraits for CFGs ---------*- C++ -*-===//
2 //
3 // Part of the MLIR Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements specializations of llvm::GraphTraits for various MLIR
10 // CFG data types. This allows the generic LLVM graph algorithms to be applied
11 // to CFGs.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef MLIR_IR_REGIONGRAPHTRAITS_H
16 #define MLIR_IR_REGIONGRAPHTRAITS_H
17 
18 #include "mlir/IR/Region.h"
19 #include "llvm/ADT/GraphTraits.h"
20 
21 namespace llvm {
22 template <> struct GraphTraits<mlir::Block *> {
24  using Node = mlir::Block;
25  using NodeRef = Node *;
26 
27  static NodeRef getEntryNode(NodeRef bb) { return bb; }
28 
30  return node->succ_begin();
31  }
32  static ChildIteratorType child_end(NodeRef node) { return node->succ_end(); }
33 };
34 
35 template <> struct GraphTraits<Inverse<mlir::Block *>> {
37  using Node = mlir::Block;
38  using NodeRef = Node *;
39  static NodeRef getEntryNode(Inverse<NodeRef> inverseGraph) {
40  return inverseGraph.Graph;
41  }
42  static inline ChildIteratorType child_begin(NodeRef node) {
43  return node->pred_begin();
44  }
45  static inline ChildIteratorType child_end(NodeRef node) {
46  return node->pred_end();
47  }
48 };
49 
50 template <>
51 struct GraphTraits<mlir::Region *> : public GraphTraits<mlir::Block *> {
53  using NodeRef = mlir::Block *;
54 
55  static NodeRef getEntryNode(GraphType fn) { return &fn->front(); }
56 
57  using nodes_iterator = pointer_iterator<mlir::Region::iterator>;
59  return nodes_iterator(fn->begin());
60  }
62  return nodes_iterator(fn->end());
63  }
64 };
65 
66 template <>
67 struct GraphTraits<Inverse<mlir::Region *>>
68  : public GraphTraits<Inverse<mlir::Block *>> {
69  using GraphType = Inverse<mlir::Region *>;
70  using NodeRef = NodeRef;
71 
72  static NodeRef getEntryNode(GraphType fn) { return &fn.Graph->front(); }
73 
74  using nodes_iterator = pointer_iterator<mlir::Region::iterator>;
76  return nodes_iterator(fn.Graph->begin());
77  }
79  return nodes_iterator(fn.Graph->end());
80  }
81 };
82 
83 } // namespace llvm
84 
85 #endif
static NodeRef getEntryNode(GraphType fn)
Definition: RegionGraphTraits.h:55
Definition: InferTypeOpInterface.cpp:20
Definition: Region.h:23
pointer_iterator< mlir::Region::iterator > nodes_iterator
Definition: RegionGraphTraits.h:57
static nodes_iterator nodes_begin(GraphType fn)
Definition: RegionGraphTraits.h:58
static nodes_iterator nodes_end(GraphType fn)
Definition: RegionGraphTraits.h:61
Definition: PassRegistry.cpp:413
Block represents an ordered list of Operations.
Definition: Block.h:21
Block & front()
Definition: Region.h:54
pred_iterator pred_end()
Definition: Block.h:228
static ChildIteratorType child_end(NodeRef node)
Definition: RegionGraphTraits.h:45
static NodeRef getEntryNode(Inverse< NodeRef > inverseGraph)
Definition: RegionGraphTraits.h:39
static NodeRef getEntryNode(GraphType fn)
Definition: RegionGraphTraits.h:72
static ChildIteratorType child_begin(NodeRef node)
Definition: RegionGraphTraits.h:42
iterator begin()
Definition: Region.h:44
SuccessorRange::iterator succ_iterator
Definition: Block.h:249
PredecessorIterator pred_iterator
Definition: Block.h:224
static NodeRef getEntryNode(NodeRef bb)
Definition: RegionGraphTraits.h:27
static nodes_iterator nodes_begin(GraphType fn)
Definition: RegionGraphTraits.h:75
Inverse< mlir::Region * > GraphType
Definition: RegionGraphTraits.h:69
static nodes_iterator nodes_end(GraphType fn)
Definition: RegionGraphTraits.h:78
static ChildIteratorType child_begin(NodeRef node)
Definition: RegionGraphTraits.h:29
iterator end()
Definition: Region.h:45
mlir::Block::succ_iterator ChildIteratorType
Definition: RegionGraphTraits.h:23
succ_iterator succ_end()
Definition: Block.h:251
Definition: BlockSupport.h:32
NodeRef NodeRef
Definition: RegionGraphTraits.h:70
static ChildIteratorType child_end(NodeRef node)
Definition: RegionGraphTraits.h:32
succ_iterator succ_begin()
Definition: Block.h:250
pointer_iterator< mlir::Region::iterator > nodes_iterator
Definition: RegionGraphTraits.h:74
pred_iterator pred_begin()
Definition: Block.h:225