16#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
17#include "mlir/IR/PatternMatch.h"
18#include "mlir/IR/TypeUtilities.h"
19#include "mlir/Pass/PassManager.h"
20#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
21#include "mlir/Transforms/Passes.h"
24#define GEN_PASS_DEF_LOWERVECTORTOAIEVEC
25#define GEN_PASS_DEF_CANONICALIZEFORAIEVEC
26#define GEN_PASS_DEF_REDUNDANTLOADSTOREOPTIMIZATION
27#define GEN_PASS_DEF_AIEVECTRANSFORMATION
28#define GEN_PASS_DEF_AIEVECCONVOPTRANSFORMATION
30#include "aie/Dialect/AIEVec/Transforms/Passes.h.inc"
35using namespace vector;
39#define DEBUG_TYPE "vector-to-aievec-conversion"
45template <
typename OpTy>
51 PatternRewriter &rewriter)
const override {
52 OpTy writeOrReadOp = cast<OpTy>(op);
58 writeOrReadOp.getInBounds().template getAsValueRange<BoolAttr>();
59 if (std::all_of(inBounds.begin(), inBounds.end(),
60 [](
bool v) { return v; }) ||
61 writeOrReadOp.getTransferRank() == 0)
64 SmallVector<bool, 4> bools(writeOrReadOp.getTransferRank(),
true);
65 auto inBoundsAttr = rewriter.getBoolArrayAttr(bools);
66 rewriter.modifyOpInPlace(writeOrReadOp, [&]() {
67 writeOrReadOp->setAttr(writeOrReadOp.getInBoundsAttrName(), inBoundsAttr);
81 :
public PassWrapper<RedundantLoadStoreOptimizationPass, OperationPass<>> {
84 auto op = getOperation();
85 MLIRContext *context = &getContext();
86 RewritePatternSet patterns(context);
89 patterns.getContext());
91 (void)applyPatternsGreedily(op, std::move(patterns));
92 IRRewriter rewriter(&getContext());
93 vector::transferOpflowOpt(rewriter, op);
97static std::unique_ptr<::mlir::Pass>
98createRedundantLoadStoreOptimizationPass() {
99 return std::make_unique<RedundantLoadStoreOptimizationPass>();
109 pm.addPass(createCanonicalizerPass());
110 pm.addPass(createRedundantLoadStoreOptimizationPass());
139 pm.addPass(createLoopInvariantCodeMotionPass());
140 pm.addPass(createCanonicalizerPass());
147 PassPipelineRegistration<ConvertVectorToAIEVecOptions>(
148 "convert-vector-to-aievec",
149 "This pass pipeline takes standard \"Vector\" code and converts it to "
150 "\"AIEVec\" code targeting the selected Xilinx AIE vector "
154 PassPipelineRegistration<CanonicalizeVectorForAIEVecOptions>(
155 "canonicalize-vector-for-aievec",
156 "This pass pipeline takes standard \"Vector\" code and converts it to "
157 "\"Vector\" code compatible with the selected AIE vector architecture.",
160 PassPipelineRegistration<LowerVectorToAIEVecOptions>(
161 "lower-vector-to-aievec",
162 "This pass pipeline takes AIE-compatible \"Vector\" code and lowers it "
163 "to \"AIE\" vector code targeting the selected AIE vector "
167 PassPipelineRegistration<OptimizeAIEVecOptions>(
169 "This pass pipeline takes AIE vector code and applies target-specific "
173 PassPipelineRegistration<>(
174 "dynamic-size-no-implicit-broadcast",
175 "This pass pipeline rewrites arith operations when assuming no implict "
176 "broadcast of dynamic sizes",
SetInboundsToReadStoreOpPattern< TransferReadOp > SetInboundsToReadOp
void registerAIEVecPipelines()
Register all pipelines for the AIE Vector dialect.
void buildLowerVectorToAIEVec(mlir::OpPassManager &pm, const LowerVectorToAIEVecOptions &options)
void buildCanonicalizeVectorForAIEVec(mlir::OpPassManager &pm, const CanonicalizeVectorForAIEVecOptions &options)
void buildConvertVectorToAIEVec(mlir::OpPassManager &pm, const ConvertVectorToAIEVecOptions &options)
Adds the "convert-vector-to-aievec" pipeline to the OpPassManager.
void buildDynamicSizeNoImplicitBroadcastPass(mlir::OpPassManager &pm)
void buildOptimizeAIEVec(mlir::OpPassManager &pm, const OptimizeAIEVecOptions &options)
void runOnOperation() override
LogicalResult matchAndRewrite(Operation *op, PatternRewriter &rewriter) const override
SetInboundsToReadStoreOpPattern(MLIRContext *context)
Options for the "convert-vector-to-aievec" pipeline.
const LowerVectorToAIEVecOptions & getLowerVectorToAIEVecOptions() const
const CanonicalizeVectorForAIEVecOptions & getCanonicalizeVectorForAIEVecOptions() const
const OptimizeAIEVecOptions & getOptimizeAIEVecOptions() const