CIRCT 22.0.0git
Loading...
Searching...
No Matches
Passes.h
Go to the documentation of this file.
1//===- Passes.h - Pass Entrypoints ------------------------------*- C++ -*-===//
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// This header file defines prototypes for CIRCT transformation passes.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef CIRCT_TRANSFORMS_PASSES_H
14#define CIRCT_TRANSFORMS_PASSES_H
15
17#include "mlir/Dialect/Affine/IR/AffineOps.h"
18#include "mlir/IR/BuiltinOps.h"
19#include "mlir/Pass/Pass.h"
20#include <limits>
21
22namespace circt {
23
24//===----------------------------------------------------------------------===//
25// Passes
26//===----------------------------------------------------------------------===//
27
28#define GEN_PASS_DECL
29
31 // Specify the format for op count data emission
34 JSON
35};
36
37#include "circt/Transforms/Passes.h.inc"
38
39void populateArithToCombPatterns(mlir::RewritePatternSet &patterns,
40 TypeConverter &typeConverter);
41
42std::unique_ptr<mlir::Pass>
43createMapArithToCombPass(bool enableBestEffortLowering = false);
44std::unique_ptr<mlir::Pass> createConvertIndexToUIntPass();
45std::unique_ptr<mlir::Pass> createFlattenMemRefPass();
46std::unique_ptr<mlir::Pass> createFlattenMemRefCallsPass();
47std::unique_ptr<mlir::Pass> createStripDebugInfoWithPredPass(
48 const std::function<bool(mlir::Location)> &pred);
49std::unique_ptr<mlir::Pass> createMaximizeSSAPass();
50std::unique_ptr<mlir::Pass> createInsertMergeBlocksPass();
51std::unique_ptr<mlir::Pass> createPrintOpCountPass();
52std::unique_ptr<mlir::Pass>
53createMemoryBankingPass(ArrayRef<unsigned> bankingFactors = {},
54 ArrayRef<unsigned> bankingDimensions = {});
55std::unique_ptr<mlir::Pass> createIndexSwitchToIfPass();
56std::unique_ptr<mlir::Pass> createHierarchicalRunner(
57 const std::string &topName,
58 llvm::function_ref<void(mlir::OpPassManager &)> pipeline,
59 bool includeBoundInstances = false);
60
61//===----------------------------------------------------------------------===//
62// Utility functions.
63//===----------------------------------------------------------------------===//
64
65// Returns true if the provided memref is considered unidimensional (having a
66// shape of size 1).
67bool isUniDimensional(mlir::MemRefType memref);
68
69// Returns true if the region is into maximal SSA form i.e., if all the values
70// within the region are in maximal SSA form.
71bool isRegionSSAMaximized(Region &region);
72
73/// Strategy class to control the behavior of SSA maximization. The class
74/// exposes overridable filter functions to dynamically select which blocks,
75/// block arguments, operations, and operation results should be put into
76/// maximal SSA form. All filter functions should return true whenever the
77/// entity they operate on should be considered for SSA maximization. By
78/// default, all filter functions always return true.
80public:
81 /// Determines whether a block should have the values it defines (i.e., block
82 /// arguments and operation results within the block) SSA maximized.
83 virtual bool maximizeBlock(Block *block);
84 /// Determines whether a block argument should be SSA maximized.
85 virtual bool maximizeArgument(BlockArgument arg);
86 /// Determines whether an operation should have its results SSA maximized.
87 virtual bool maximizeOp(Operation *op);
88 /// Determines whether an operation's result should be SSA maximized.
89 virtual bool maximizeResult(OpResult res);
90
91 virtual ~SSAMaximizationStrategy() = default;
92};
93
94/// Converts a single value within a function into maximal SSA form. This
95/// removes any implicit dataflow of this specific value within the enclosing
96/// function. The function adds new block arguments wherever necessary to carry
97/// the value explicitly between blocks.
98/// Succeeds when it was possible to convert the value into maximal SSA form.
99LogicalResult maximizeSSA(Value value, PatternRewriter &rewriter);
100
101/// Considers all of an operation's results for SSA maximization, following a
102/// provided strategy. This removes any implicit dataflow of the selected
103/// operation's results within the enclosing function. The function adds new
104/// block arguments wherever necessary to carry the results explicitly between
105/// blocks. Succeeds when it was possible to convert the selected operation's
106/// results into maximal SSA form.
107LogicalResult maximizeSSA(Operation *op, SSAMaximizationStrategy &strategy,
108 PatternRewriter &rewriter);
109
110/// Considers all values defined by a block (i.e., block arguments and operation
111/// results within the block) for SSA maximization, following a provided
112/// strategy. This removes any implicit dataflow of the selected values within
113/// the enclosing function. The function adds new block arguments wherever
114/// necessary to carry the values explicitly between blocks. Succeeds when it
115/// was possible to convert the selected values defined by the block into
116/// maximal SSA form.
117LogicalResult maximizeSSA(Block *block, SSAMaximizationStrategy &strategy,
118 PatternRewriter &rewriter);
119
120/// Considers all blocks within a region for SSA maximization, following a
121/// provided strategy. This removes any implicit dataflow of the values defined
122/// by selected blocks within the region. The function adds new block arguments
123/// wherever necessary to carry the region's values explicitly between blocks.
124/// Succeeds when it was possible to convert all of the values defined by
125/// selected blocks into maximal SSA form.
126LogicalResult maximizeSSA(Region &region, SSAMaximizationStrategy &strategy,
127 PatternRewriter &rewriter);
128
129/// Manually run merge block insertion on a region.
130///
131/// This transformation does treat loops like a single block and thus does not
132/// affect them.
133LogicalResult insertMergeBlocks(mlir::Region &r,
134 mlir::ConversionPatternRewriter &rewriter);
135
136//===----------------------------------------------------------------------===//
137// Registration
138//===----------------------------------------------------------------------===//
139
140/// Generate the code for registering passes.
141#define GEN_PASS_REGISTRATION
142#include "circt/Transforms/Passes.h.inc"
143
144} // namespace circt
145
146#endif // CIRCT_TRANSFORMS_PASSES_H
Strategy strategy
Strategy class to control the behavior of SSA maximization.
Definition Passes.h:79
virtual bool maximizeResult(OpResult res)
Determines whether an operation's result should be SSA maximized.
virtual ~SSAMaximizationStrategy()=default
virtual bool maximizeArgument(BlockArgument arg)
Determines whether a block argument should be SSA maximized.
virtual bool maximizeBlock(Block *block)
Determines whether a block should have the values it defines (i.e., block arguments and operation res...
virtual bool maximizeOp(Operation *op)
Determines whether an operation should have its results SSA maximized.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< mlir::Pass > createMaximizeSSAPass()
std::unique_ptr< mlir::Pass > createPrintOpCountPass()
std::unique_ptr< mlir::Pass > createHierarchicalRunner(const std::string &topName, llvm::function_ref< void(mlir::OpPassManager &)> pipeline, bool includeBoundInstances=false)
std::unique_ptr< mlir::Pass > createMapArithToCombPass(bool enableBestEffortLowering=false)
std::unique_ptr< mlir::Pass > createInsertMergeBlocksPass()
std::unique_ptr< mlir::Pass > createIndexSwitchToIfPass()
std::unique_ptr< mlir::Pass > createMemoryBankingPass(ArrayRef< unsigned > bankingFactors={}, ArrayRef< unsigned > bankingDimensions={})
void populateArithToCombPatterns(mlir::RewritePatternSet &patterns, TypeConverter &typeConverter)
mlir::LogicalResult insertMergeBlocks(mlir::Region &r, mlir::ConversionPatternRewriter &rewriter)
Insert additional blocks that serve as counterparts to the blocks that diverged the control flow.
LogicalResult maximizeSSA(Value value, PatternRewriter &rewriter)
Converts a single value within a function into maximal SSA form.
std::unique_ptr< mlir::Pass > createFlattenMemRefPass()
OpCountEmissionFormat
Definition Passes.h:30
bool isUniDimensional(mlir::MemRefType memref)
std::unique_ptr< mlir::Pass > createConvertIndexToUIntPass()
bool isRegionSSAMaximized(Region &region)
std::unique_ptr< mlir::Pass > createFlattenMemRefCallsPass()
std::unique_ptr< mlir::Pass > createStripDebugInfoWithPredPass(const std::function< bool(mlir::Location)> &pred)
Creates a pass to strip debug information from a function.