14#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
15#include "mlir/IR/PatternMatch.h"
16#include "mlir/IR/TypeUtilities.h"
17#include "mlir/Pass/PassManager.h"
18#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
19#include "mlir/Transforms/Passes.h"
22#define GEN_PASS_DEF_LOWERVECTORTOAIEVEC
23#define GEN_PASS_DEF_CANONICALIZEFORAIEVEC
24#define GEN_PASS_DEF_REDUNDANTLOADSTOREOPTIMIZATION
25#define GEN_PASS_DEF_AIEVECTRANSFORMATION
26#define GEN_PASS_DEF_AIEVECCONVOPTRANSFORMATION
28#include "aie/Dialect/AIEVec/Transforms/Passes.h.inc"
37#define DEBUG_TYPE "vector-to-aievec-conversion"
43template <
typename OpTy>
46 : RewritePattern(OpTy::getOperationName(), 1, context) {}
49 PatternRewriter &rewriter)
const override {
50 OpTy writeOrReadOp = cast<OpTy>(op);
56 writeOrReadOp.getInBounds().template getAsValueRange<BoolAttr>();
57 if (std::all_of(inBounds.begin(), inBounds.end(),
58 [](
bool v) { return v; }) ||
59 writeOrReadOp.getTransferRank() == 0)
62 SmallVector<bool, 4> bools(writeOrReadOp.getTransferRank(),
true);
63 auto inBoundsAttr = rewriter.getBoolArrayAttr(bools);
64 rewriter.modifyOpInPlace(writeOrReadOp, [&]() {
65 writeOrReadOp->setAttr(writeOrReadOp.getInBoundsAttrName(), inBoundsAttr);
79 :
public PassWrapper<RedundantLoadStoreOptimizationPass, OperationPass<>> {
82 auto *op = getOperation();
83 MLIRContext *context = &getContext();
84 RewritePatternSet patterns(context);
87 patterns.getContext());
89 (void)applyPatternsGreedily(op, std::move(patterns));
90 IRRewriter rewriter(&getContext());
91 vector::transferOpflowOpt(rewriter, op);
95static std::unique_ptr<::mlir::Pass>
96createRedundantLoadStoreOptimizationPass() {
97 return std::make_unique<RedundantLoadStoreOptimizationPass>();
107 pm.addPass(createCanonicalizerPass());
108 pm.addPass(createRedundantLoadStoreOptimizationPass());
137 pm.addPass(createLoopInvariantCodeMotionPass());
138 pm.addPass(createCanonicalizerPass());
145 PassPipelineRegistration<ConvertVectorToAIEVecOptions>(
146 "convert-vector-to-aievec",
147 "This pass pipeline takes standard \"Vector\" code and converts it to "
148 "\"AIEVec\" code targeting the selected Xilinx AIE vector "
152 PassPipelineRegistration<CanonicalizeVectorForAIEVecOptions>(
153 "canonicalize-vector-for-aievec",
154 "This pass pipeline takes standard \"Vector\" code and converts it to "
155 "\"Vector\" code compatible with the selected AIE vector architecture.",
158 PassPipelineRegistration<LowerVectorToAIEVecOptions>(
159 "lower-vector-to-aievec",
160 "This pass pipeline takes AIE-compatible \"Vector\" code and lowers it "
161 "to \"AIE\" vector code targeting the selected AIE vector "
165 PassPipelineRegistration<OptimizeAIEVecOptions>(
167 "This pass pipeline takes AIE vector code and applies target-specific "
171 PassPipelineRegistration<>(
172 "dynamic-size-no-implicit-broadcast",
173 "This pass pipeline rewrites arith operations when assuming no implict "
174 "broadcast of dynamic sizes",
SetInboundsToReadStoreOpPattern< TransferWriteOp > SetInboundsToWriteOp
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