My Project
Block.h
Go to the documentation of this file.
1 //===- Block.h - MLIR Block Class -------------------------------*- 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 defines the Block class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_IR_BLOCK_H
14 #define MLIR_IR_BLOCK_H
15 
16 #include "mlir/IR/BlockSupport.h"
17 #include "mlir/IR/Visitors.h"
18 
19 namespace mlir {
21 class Block : public IRObjectWithUseList<BlockOperand>,
22  public llvm::ilist_node_with_parent<Block, Region> {
23 public:
24  explicit Block() {}
25  ~Block();
26 
27  void clear() {
28  // Drop all references from within this block.
30 
31  // Clear operations in the reverse order so that uses are destroyed
32  // before their defs.
33  while (!empty())
34  operations.pop_back();
35  }
36 
42  Region *getParent() const;
43 
46 
48  bool isEntryBlock();
49 
52  void insertBefore(Block *block);
53 
56  void moveBefore(Block *block);
57 
59  void erase();
60 
61  //===--------------------------------------------------------------------===//
62  // Block argument management
63  //===--------------------------------------------------------------------===//
64 
65  // This is the list of arguments to the block.
67 
68  BlockArgListType getArguments() { return arguments; }
69 
70  using args_iterator = BlockArgListType::iterator;
71  using reverse_args_iterator = BlockArgListType::reverse_iterator;
72  args_iterator args_begin() { return getArguments().begin(); }
73  args_iterator args_end() { return getArguments().end(); }
76 
77  bool args_empty() { return arguments.empty(); }
78 
81 
86 
89 
93  void eraseArgument(unsigned index, bool updatePredTerms = true);
94 
95  unsigned getNumArguments() { return arguments.size(); }
96  BlockArgument getArgument(unsigned i) { return arguments[i]; }
97 
98  //===--------------------------------------------------------------------===//
99  // Operation list management
100  //===--------------------------------------------------------------------===//
101 
103  using OpListType = llvm::iplist<Operation>;
104  OpListType &getOperations() { return operations; }
105 
106  // Iteration over the operations in the block.
107  using iterator = OpListType::iterator;
108  using reverse_iterator = OpListType::reverse_iterator;
109 
110  iterator begin() { return operations.begin(); }
111  iterator end() { return operations.end(); }
112  reverse_iterator rbegin() { return operations.rbegin(); }
113  reverse_iterator rend() { return operations.rend(); }
114 
115  bool empty() { return operations.empty(); }
116  void push_back(Operation *op) { operations.push_back(op); }
117  void push_front(Operation *op) { operations.push_front(op); }
118 
119  Operation &back() { return operations.back(); }
120  Operation &front() { return operations.front(); }
121 
128 
132  void dropAllReferences();
133 
137 
140  bool isOpOrderValid();
141 
143  void invalidateOpOrder();
144 
147  bool verifyOpOrder();
148 
150  void recomputeOpOrder();
151 
152 private:
154  template <typename OpT>
155  class op_filter_iterator
156  : public llvm::filter_iterator<Block::iterator, bool (*)(Operation &)> {
157  static bool filter(Operation &op) { return llvm::isa<OpT>(op); }
158 
159  public:
160  op_filter_iterator(Block::iterator it, Block::iterator end)
161  : llvm::filter_iterator<Block::iterator, bool (*)(Operation &)>(
162  it, end, &filter) {}
163 
165  operator Block::iterator() const { return this->wrapped(); }
166  };
167 
168 public:
171  template <typename OpT>
172  class op_iterator : public llvm::mapped_iterator<op_filter_iterator<OpT>,
173  OpT (*)(Operation &)> {
174  static OpT unwrap(Operation &op) { return cast<OpT>(op); }
175 
176  public:
177  using reference = OpT;
178 
180  op_iterator(op_filter_iterator<OpT> it)
181  : llvm::mapped_iterator<op_filter_iterator<OpT>, OpT (*)(Operation &)>(
182  it, &unwrap) {}
183 
185  operator Block::iterator() const { return this->wrapped(); }
186  };
187 
190  template <typename OpT> iterator_range<op_iterator<OpT>> getOps() {
191  auto endIt = end();
192  return {op_filter_iterator<OpT>(begin(), endIt),
193  op_filter_iterator<OpT>(endIt, endIt)};
194  }
195  template <typename OpT> op_iterator<OpT> op_begin() {
196  return op_filter_iterator<OpT>(begin(), end());
197  }
198  template <typename OpT> op_iterator<OpT> op_end() {
199  return op_filter_iterator<OpT>(end(), end());
200  }
201 
205  if (begin() == end())
206  return {begin(), end()};
207  auto endIt = --end();
208  return {begin(), endIt};
209  }
210 
211  //===--------------------------------------------------------------------===//
212  // Terminator management
213  //===--------------------------------------------------------------------===//
214 
218 
219  //===--------------------------------------------------------------------===//
220  // Predecessors and successors.
221  //===--------------------------------------------------------------------===//
222 
223  // Predecessor iteration.
227  }
228  pred_iterator pred_end() { return pred_iterator(nullptr); }
230  return {pred_begin(), pred_end()};
231  }
232 
234  bool hasNoPredecessors();
235 
243 
244  // Indexed successor access.
245  unsigned getNumSuccessors();
246  Block *getSuccessor(unsigned i);
247 
248  // Successor iteration.
249  using succ_iterator = SuccessorRange::iterator;
253 
254  //===--------------------------------------------------------------------===//
255  // Operation Walkers
256  //===--------------------------------------------------------------------===//
257 
261  template <typename FnT, typename RetT = detail::walkResultType<FnT>>
262  RetT walk(FnT &&callback) {
263  return walk(begin(), end(), std::forward<FnT>(callback));
264  }
265 
270  template <typename FnT, typename RetT = detail::walkResultType<FnT>>
271  typename std::enable_if<std::is_same<RetT, void>::value, RetT>::type
273  for (auto &op : llvm::make_early_inc_range(llvm::make_range(begin, end)))
274  detail::walkOperations(&op, callback);
275  }
276 
281  template <typename FnT, typename RetT = detail::walkResultType<FnT>>
282  typename std::enable_if<std::is_same<RetT, WalkResult>::value, RetT>::type
284  for (auto &op : llvm::make_early_inc_range(llvm::make_range(begin, end)))
285  if (detail::walkOperations(&op, callback).wasInterrupted())
286  return WalkResult::interrupt();
287  return WalkResult::advance();
288  }
289 
290  //===--------------------------------------------------------------------===//
291  // Other
292  //===--------------------------------------------------------------------===//
293 
304  Block *splitBlock(iterator splitBefore);
305  Block *splitBlock(Operation *splitBeforeOp) {
306  return splitBlock(iterator(splitBeforeOp));
307  }
308 
311  return &Block::operations;
312  }
313 
314  void print(raw_ostream &os);
315  void dump();
316 
320  void printAsOperand(raw_ostream &os, bool printType = true);
321 
322 private:
325  llvm::PointerIntPair<Region *, /*IntBits=*/1, bool> parentValidOpOrderPair;
326 
328  OpListType operations;
329 
331  std::vector<BlockArgument> arguments;
332 
333  Block(Block &) = delete;
334  void operator=(Block &) = delete;
335 
336  friend struct llvm::ilist_traits<Block>;
337 };
338 } // end namespace mlir
339 
340 #endif // MLIR_IR_BLOCK_H
Definition: InferTypeOpInterface.cpp:20
std::enable_if< std::is_same< RetT, void >::value, RetT >::type walk(Block::iterator begin, Block::iterator end, FnT &&callback)
Definition: Block.h:272
Block * getSuccessor(unsigned i)
Definition: Block.cpp:215
Definition: Region.h:23
iterator begin()
Definition: Block.h:110
void clear()
Definition: Block.h:27
std::enable_if< std::is_same< RetT, WalkResult >::value, RetT >::type walk(Block::iterator begin, Block::iterator end, FnT &&callback)
Definition: Block.h:283
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
void eraseArgument(unsigned index, bool updatePredTerms=true)
Definition: Block.cpp:163
Operation & back()
Definition: Block.h:119
Operation * getParentOp()
Returns the closest surrounding operation that contains this block.
Definition: Block.cpp:40
Block represents an ordered list of Operations.
Definition: Block.h:21
OpListType::reverse_iterator reverse_iterator
Definition: Block.h:108
pred_iterator pred_end()
Definition: Block.h:228
void moveBefore(Block *block)
Definition: Block.cpp:57
OpListType & getOperations()
Definition: Block.h:104
void invalidateOpOrder()
Invalidates the current ordering of operations.
Definition: Block.cpp:105
Terminator operations can have Block operands to represent successors.
Definition: UseDefLists.h:288
iterator_range< pred_iterator > getPredecessors()
Definition: Block.h:229
args_iterator args_begin()
Definition: Block.h:72
BlockArgument insertArgument(args_iterator it, Type type)
Definition: Block.cpp:184
void printAsOperand(raw_ostream &os, bool printType=true)
Print out the name of the block without printing its body.
Definition: AsmPrinter.cpp:2170
Operation & front()
Definition: Block.h:120
void push_front(Operation *op)
Definition: Block.h:117
iterator_range< iterator > without_terminator()
Definition: Block.h:204
bool args_empty()
Definition: Block.h:77
reverse_args_iterator args_rend()
Definition: Block.h:75
BlockArgument getArgument(unsigned i)
Definition: Block.h:96
Region * getParent() const
Definition: Block.cpp:36
BlockOperand * getFirstUse() const
Definition: UseDefLists.h:95
BlockArgListType::iterator args_iterator
Definition: Block.h:70
~Block()
Definition: Block.cpp:29
This class represents a single IR object that contains a use list.
Definition: UseDefLists.h:34
void erase()
Unlink this Block from its parent region and delete it.
Definition: Block.cpp:64
Block * splitBlock(Operation *splitBeforeOp)
Definition: Block.h:305
Definition: LLVM.h:37
OpListType::iterator iterator
Definition: Block.h:107
SuccessorRange::iterator succ_iterator
Definition: Block.h:249
PredecessorIterator pred_iterator
Definition: Block.h:224
reverse_iterator rbegin()
Definition: Block.h:112
iterator end()
Definition: Block.h:111
unsigned getNumArguments()
Definition: Block.h:95
Definition: LLVM.h:38
BlockArgument addArgument(Type type)
Add one value to the argument list.
Definition: Block.cpp:146
static WalkResult advance()
Definition: Visitors.h:44
iterator begin() const
Definition: STLExtras.h:228
void walkOperations(Operation *op, function_ref< void(Operation *op)> callback)
Walk all of the operations nested under and including the given operation.
Definition: Visitors.cpp:15
bool isEntryBlock()
Return if this block is the entry block in the parent region.
Definition: Block.cpp:45
Definition: Block.h:172
static WalkResult interrupt()
Definition: Visitors.h:43
BlockArgListType getArguments()
Definition: Block.h:68
Block arguments are values.
Definition: Value.h:235
reverse_args_iterator args_rbegin()
Definition: Block.h:74
op_iterator(op_filter_iterator< OpT > it)
Initializes the iterator to the specified filter iterator.
Definition: Block.h:180
void dropAllDefinedValueUses()
Definition: Block.cpp:92
BlockArgListType::reverse_iterator reverse_args_iterator
Definition: Block.h:71
bool empty()
Definition: Block.h:115
This class implements the successor iterators for Block.
Definition: BlockSupport.h:56
Definition: Types.h:84
bool isOpOrderValid()
Definition: Block.cpp:102
args_iterator args_end()
Definition: Block.h:73
iterator_range< args_iterator > addArguments(ArrayRef< Type > types)
Add one argument to the argument list for each type specified in the list.
Definition: Block.cpp:153
static OpListType Block::* getSublistAccess(Operation *)
Returns pointer to member of operation list.
Definition: Block.h:310
Operation * getTerminator()
Definition: Block.cpp:202
void dropAllReferences()
Definition: Block.cpp:87
void push_back(Operation *op)
Definition: Block.h:116
void dump()
Definition: AsmPrinter.cpp:2167
RetT walk(FnT &&callback)
Definition: Block.h:262
iterator end() const
Definition: STLExtras.h:229
Definition: LLVM.h:50
op_iterator< OpT > op_begin()
Definition: Block.h:195
llvm::iplist< Operation > OpListType
This is the list of operations in the block.
Definition: Block.h:103
unsigned getNumSuccessors()
Definition: Block.cpp:211
reverse_iterator rend()
Definition: Block.h:113
bool hasNoPredecessors()
Return true if this block has no predecessors.
Definition: Block.cpp:208
iterator_range< op_iterator< OpT > > getOps()
Definition: Block.h:190
succ_iterator succ_end()
Definition: Block.h:251
void recomputeOpOrder()
Recomputes the ordering of child operations within the block.
Definition: Block.cpp:134
Definition: BlockSupport.h:32
Block * getSinglePredecessor()
Definition: Block.cpp:226
void insertBefore(Block *block)
Definition: Block.cpp:49
op_iterator< OpT > op_end()
Definition: Block.h:198
SuccessorRange getSuccessors()
Definition: Block.h:252
Block()
Definition: Block.h:24
void print(raw_ostream &os)
Definition: AsmPrinter.cpp:2151
OpT reference
Definition: Block.h:177
Operation * findAncestorOpInBlock(Operation &op)
Definition: Block.cpp:72
succ_iterator succ_begin()
Definition: Block.h:250
bool verifyOpOrder()
Definition: Block.cpp:113
Block * splitBlock(iterator splitBefore)
Definition: Block.cpp:249
pred_iterator pred_begin()
Definition: Block.h:225