MLIR-AIE 1.4.5.dev
AIENormalizeDmaBdDims.cpp
Go to the documentation of this file.
1//===- AIENormalizeDmaBdDims.cpp --------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2026 Advanced Micro Devices, Inc.
4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5//
6//===----------------------------------------------------------------------===//
7
10
11#include "mlir/Pass/Pass.h"
12
13namespace xilinx::AIE {
14#define GEN_PASS_DEF_AIENORMALIZEDMABDDIMS
15#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
16} // namespace xilinx::AIE
17
18#define DEBUG_TYPE "aie-normalize-dma-bd-dims"
19
20using namespace mlir;
21using namespace xilinx;
22using namespace xilinx::AIE;
23
25 : xilinx::AIE::impl::AIENormalizeDmaBdDimsBase<AIENormalizeDmaBdDimsPass> {
26
27 void getDependentDialects(DialectRegistry &registry) const override {
28 registry.insert<AIEDialect>();
29 }
30
31 void runOnOperation() override {
32 DeviceOp device = getOperation();
33
34 device.walk([&](DMABDOp op) {
35 if (op.getMixedSizes().empty())
36 return;
37
38 for (OpFoldResult s : op.getMixedSizes())
39 if (!getConstantIntValue(s))
40 return;
41 for (OpFoldResult s : op.getMixedStrides())
42 if (!getConstantIntValue(s))
43 return;
44
45 if (op.getPadDimensions() && !op.getPadDimensions()->empty())
46 return;
47
48 std::optional<SmallVector<BDDimLayoutAttr>> maybeDims =
49 op.getConstantDimensions();
50 if (!maybeDims || maybeDims->empty())
51 return;
52
53 int64_t product = 1;
54 for (BDDimLayoutAttr dim : *maybeDims)
55 product *= dim.getSize();
56
57 if (!op.hasLen() && !op.getBuffer().getType().hasStaticShape())
58 return;
59 std::optional<int32_t> lenVal = op.getConstantLen();
60 if (op.getLen() && !lenVal)
61 return;
62 std::optional<SmallVector<BDDimLayoutAttr>> newDims =
63 normalizedBDDims(*maybeDims, lenVal ? *lenVal : product);
64 if (!newDims)
65 return;
66
67 if (newDims->empty()) {
68 int32_t len = static_cast<int32_t>(product);
69 op.getLenMutable().clear();
70 op.setStaticLen(len);
71 op.getSizesMutable().clear();
72 op.getStridesMutable().clear();
73 op.setStaticSizes(std::nullopt);
74 op.setStaticStrides(std::nullopt);
75 return;
76 }
77
78 SmallVector<int64_t> sizes, strides;
79 sizes.reserve(newDims->size());
80 strides.reserve(newDims->size());
81 for (BDDimLayoutAttr dim : *newDims) {
82 sizes.push_back(static_cast<int64_t>(dim.getSize()));
83 strides.push_back(static_cast<int64_t>(dim.getStride()));
84 }
85
86 op.getSizesMutable().clear();
87 op.getStridesMutable().clear();
88 op.setStaticSizes(sizes);
89 op.setStaticStrides(strides);
90 });
91 }
92};
93
94std::unique_ptr<OperationPass<DeviceOp>>
96 return std::make_unique<AIENormalizeDmaBdDimsPass>();
97}
std::optional< llvm::SmallVector< BDDimLayoutAttr > > normalizedBDDims(llvm::ArrayRef< BDDimLayoutAttr > dims, int64_t len)
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeDmaBdDimsPass()
void getDependentDialects(DialectRegistry &registry) const override