MLIR  20.0.0git
Unit.cpp
Go to the documentation of this file.
1 //===- Unit.cpp - Support for manipulating IR Unit ------------------------===//
2 //
3 // Part of the LLVM 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 #include "mlir/IR/Unit.h"
10 #include "mlir/IR/Operation.h"
12 #include "mlir/IR/Region.h"
13 #include "llvm/Support/raw_ostream.h"
14 #include <iterator>
15 #include <sstream>
16 
17 using namespace mlir;
18 
19 static void printOp(llvm::raw_ostream &os, Operation *op,
20  OpPrintingFlags &flags) {
21  if (!op) {
22  os << "<Operation:nullptr>";
23  return;
24  }
25  op->print(os, flags);
26 }
27 
28 static void printRegion(llvm::raw_ostream &os, Region *region,
29  OpPrintingFlags &flags) {
30  if (!region) {
31  os << "<Region:nullptr>";
32  return;
33  }
34  os << "Region #" << region->getRegionNumber() << " for op ";
35  printOp(os, region->getParentOp(), flags);
36 }
37 
38 static void printBlock(llvm::raw_ostream &os, Block *block,
39  OpPrintingFlags &flags) {
40  Region *region = block->getParent();
41  Block *entry = &region->front();
42  int blockId = std::distance(entry->getIterator(), block->getIterator());
43  os << "Block #" << blockId << " for ";
44  bool shouldSkipRegions = flags.shouldSkipRegions();
45  printRegion(os, region, flags.skipRegions());
46  if (!shouldSkipRegions)
47  block->print(os);
48 }
49 
50 void mlir::IRUnit::print(llvm::raw_ostream &os, OpPrintingFlags flags) const {
51  if (auto *op = llvm::dyn_cast_if_present<Operation *>(*this))
52  return printOp(os, op, flags);
53  if (auto *region = llvm::dyn_cast_if_present<Region *>(*this))
54  return printRegion(os, region, flags);
55  if (auto *block = llvm::dyn_cast_if_present<Block *>(*this))
56  return printBlock(os, block, flags);
57  llvm_unreachable("unknown IRUnit");
58 }
59 
60 llvm::raw_ostream &mlir::operator<<(llvm::raw_ostream &os, const IRUnit &unit) {
61  unit.print(os);
62  return os;
63 }
static void printOp(llvm::raw_ostream &os, Operation *op, OpPrintingFlags &flags)
Definition: Unit.cpp:19
static void printRegion(llvm::raw_ostream &os, Region *region, OpPrintingFlags &flags)
Definition: Unit.cpp:28
static void printBlock(llvm::raw_ostream &os, Block *block, OpPrintingFlags &flags)
Definition: Unit.cpp:38
Block represents an ordered list of Operations.
Definition: Block.h:33
Region * getParent() const
Provide a 'getParent' method for ilist_node_with_parent methods.
Definition: Block.cpp:29
void print(raw_ostream &os)
IRUnit is a union of the different types of IR objects that consistute the IR structure (other than T...
Definition: Unit.h:28
void print(raw_ostream &os, OpPrintingFlags flags=OpPrintingFlags().skipRegions().useLocalScope()) const
Print the IRUnit to the given stream.
Definition: Unit.cpp:50
Set of flags used to control the behavior of the various IR print methods (e.g.
bool shouldSkipRegions() const
Return if regions should be skipped.
Definition: AsmPrinter.cpp:352
OpPrintingFlags & skipRegions(bool skip=true)
Skip printing regions.
Definition: AsmPrinter.cpp:281
Operation is the basic unit of execution within MLIR.
Definition: Operation.h:88
void print(raw_ostream &os, const OpPrintingFlags &flags=std::nullopt)
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition: Region.h:26
unsigned getRegionNumber()
Return the number of this region in the parent operation.
Definition: Region.cpp:62
Operation * getParentOp()
Return the parent operation this region is attached to.
Definition: Region.h:200
Block & front()
Definition: Region.h:65
Include the generated interface declarations.
raw_ostream & operator<<(raw_ostream &os, const AliasResult &result)
Definition: AliasAnalysis.h:78