MLIR-AIE 1.4.6.dev
AIEPasses.h
Go to the documentation of this file.
1//===- AIEPasses.h ----------------------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2021-2022 Xilinx, Inc.
4// Copyright (C) 2022-2026 Advanced Micro Devices, Inc.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef AIE_PASSES_H
10#define AIE_PASSES_H
11
14
15#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
16#include "mlir/Dialect/SCF/IR/SCF.h"
17#include "mlir/Pass/Pass.h"
18
19namespace xilinx::AIE {
20std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
22
23/// Discardable attribute set by `--aie-objectfifo-lower-cores` on `scf.for`
24/// and forever `scf.while` loops containing ObjectFifo accesses -- the loop
25/// unroll factor (the least common multiple of the depths of the objectFifos
26/// accessed within the loop) consumed by the `AIEObjectFifoUnroll` pass.
27inline constexpr llvm::StringLiteral kObjectFifoUnrollHintAttrName =
28 "aie.unroll_hint";
29
30/// Discardable attribute set by `--aie-objectfifo-lower-cores` on the rank-0
31/// `memref.alloca`s that hold a core's objects of an objectFifo in rotation
32/// order. The `AIEObjectFifoUnroll` pass promotes them to SSA on each core
33/// where every object then folds to its buffer. Otherwise they stay in memory,
34/// so that LLVM's SROA carries only the buffer pointer around the loop rather
35/// than the whole memref descriptor.
36inline constexpr llvm::StringLiteral kObjectFifoObjectSlotAttrName =
37 "aie.objectfifo.object_slot";
38
39/// Whether `whileOp` repeats forever: its condition is a constant true, and its
40/// condition region does nothing but forward its arguments to the body. This is
41/// how IRON's `Worker` writes a core that runs until reconfiguration. Such a
42/// loop can be unrolled by repeating its body.
43bool isForeverLoop(mlir::scf::WhileOp whileOp);
44
45/// Whether `forOp` counts from 0 to INT64_MAX in steps of 1 and never reads its
46/// induction variable. INT64_MAX iterations never finish, so the loop repeats
47/// forever; a smaller bound such as 2^32-1 can be reached.
48bool isForeverForLoop(mlir::scf::ForOp forOp);
49
50/// Replace `forOp`, which `isForeverForLoop` accepts, with an `scf.while` that
51/// `isForeverLoop` accepts and that carries the same values.
52mlir::scf::WhileOp replaceWithForeverLoop(mlir::scf::ForOp forOp);
53
54/// Whether `op` is a loop that objectFifo lowering unrolls by the rotation
55/// period of the objectFifos accessed in it: an `scf.for`, or an `scf.while`
56/// that repeats forever.
57bool isObjectFifoLoop(mlir::Operation *op);
58
59/// The innermost loop around `op` that `isObjectFifoLoop` accepts, or null.
60mlir::Operation *getObjectFifoLoopParent(mlir::Operation *op);
61
62#define GEN_PASS_DECL
63#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
64
65std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPlaceTilesPass();
66std::unique_ptr<mlir::OperationPass<DeviceOp>>
67createAIEPlaceTilesPass(const AIEPlaceTilesOptions &options);
68std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPrepareBuffersPass();
69std::unique_ptr<mlir::OperationPass<DeviceOp>>
71std::unique_ptr<mlir::OperationPass<DeviceOp>>
73 const AIEAssignBufferAddressesOptions &options);
74std::unique_ptr<mlir::OperationPass<DeviceOp>>
76std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignLockIDsPass();
77std::unique_ptr<mlir::OperationPass<DeviceOp>>
79std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
81std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
83std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
84createAIECoreToStandardPass(const AIECoreToStandardOptions &options);
85std::unique_ptr<mlir::OperationPass<DeviceOp>>
87std::unique_ptr<mlir::OperationPass<DeviceOp>>
89std::unique_ptr<mlir::OperationPass<DeviceOp>>
91 const AIEObjectFifoInsertCoreQueuePushesOptions &options);
92std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEFindFlowsPass();
93std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIESplitFlowViasPass();
94std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIELocalizeLocksPass();
95std::unique_ptr<mlir::OperationPass<DeviceOp>>
97std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createAIERouteFlowsPass();
98std::unique_ptr<mlir::OperationPass<DeviceOp>>
100std::unique_ptr<mlir::OperationPass<DeviceOp>>
102std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
104std::unique_ptr<mlir::OperationPass<DeviceOp>>
106std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPathfinderPass();
107std::unique_ptr<mlir::OperationPass<DeviceOp>>
108createAIEPathfinderPass(const AIERoutePathfinderFlowsOptions &options);
109std::unique_ptr<mlir::OperationPass<DeviceOp>>
110createAIEPathfinderPass(const AIERoutePathfinderFlowsOptions &options,
111 llvm::ArrayRef<std::pair<TileID, Port>> avoidedPorts);
112std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoUnrollPass();
113std::unique_ptr<mlir::OperationPass<DeviceOp>>
114createAIEObjectFifoUnrollPass(const AIEObjectFifoUnrollOptions &options);
115std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoSplitPass();
116std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoVerifyPass();
117std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignPacketIdsPass();
118std::unique_ptr<mlir::OperationPass<DeviceOp>>
119createAIEAssignPacketIdsPass(bool packetSwitched,
120 bool reserveControllerPacketIds = false);
121std::unique_ptr<mlir::OperationPass<DeviceOp>>
123std::unique_ptr<mlir::OperationPass<DeviceOp>>
125std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
127std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
128createAIECheckAgainstImagePass(const AIECheckAgainstImageOptions &options);
129std::unique_ptr<mlir::OperationPass<DeviceOp>>
131std::unique_ptr<mlir::OperationPass<DeviceOp>>
133std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIELowerCascadeFlowsPass();
134std::unique_ptr<mlir::OperationPass<DeviceOp>>
136std::unique_ptr<mlir::OperationPass<DeviceOp>>
138std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
140std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
142std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
144 const AIEGenerateColumnControlOverlayOptions &options);
145std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignTileCtrlIDsPass();
146std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIETraceToConfigPass();
147std::unique_ptr<mlir::OperationPass<DeviceOp>>
149std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEInsertTraceFlowsPass();
150
151/// Generate the code for registering passes.
152#define GEN_PASS_REGISTRATION
153#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
154
155/// Adds the passes of `aie-objectFifo-stateful-transform` to `pm`, which
156/// anchors on DeviceOp.
157void addObjectFifoLoweringPasses(mlir::OpPassManager &pm, bool packetSwitched,
158 bool skipVerify,
159 bool reserveControllerPacketIds = false,
160 bool checkQueueSpace = true);
161
162/// Register `aie-objectFifo-stateful-transform` as a pipeline over the passes
163/// that lower `aie.objectfifo`.
165
166} // namespace xilinx::AIE
167
168#endif // AIE_PASSES_H
bool isForeverForLoop(mlir::scf::ForOp forOp)
Whether forOp counts from 0 to INT64_MAX in steps of 1 and never reads its induction variable.
void addObjectFifoLoweringPasses(mlir::OpPassManager &pm, bool packetSwitched, bool skipVerify, bool reserveControllerPacketIds=false, bool checkQueueSpace=true)
Adds the passes of aie-objectFifo-stateful-transform to pm, which anchors on DeviceOp.
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEInsertTraceFlowsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEHoistVectorTransferPointersPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIETraceRegPackWritesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPrepareBuffersPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIECoreIntRangeNarrowingPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLowerCoresPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELowerCoreIssuedConfigurationPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoInsertCoreQueuePushesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignTileCtrlIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELowerCascadeFlowsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoAllocatePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeDmaBdDimsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEFindFlowsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECoreToStandardPass()
constexpr llvm::StringLiteral kObjectFifoObjectSlotAttrName
Discardable attribute set by --aie-objectfifo-lower-cores on the rank-0 memref.allocas that hold a co...
Definition AIEPasses.h:36
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECheckAgainstImagePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLivenessPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEVectorToPointerLoopsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEGenerateColumnControlOverlayPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignLockIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPlaceTilesPass()
mlir::scf::WhileOp replaceWithForeverLoop(mlir::scf::ForOp forOp)
Replace forOp, which isForeverForLoop accepts, with an scf.while that isForeverLoop accepts and that ...
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoUnrollPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeAddressSpacesPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIERouteFlowsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignPacketIdsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEAnnotateShimSharingPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIESplitFlowViasPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignCoreLinkFilesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoErasePoolsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECanonicalizeDevicePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferAddressesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoVerifyPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELocalizeLocksPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIETraceToConfigPass()
constexpr llvm::StringLiteral kObjectFifoUnrollHintAttrName
Discardable attribute set by --aie-objectfifo-lower-cores on scf.for and forever scf....
Definition AIEPasses.h:27
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferDescriptorIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLowerDMAsPass()
bool isForeverLoop(mlir::scf::WhileOp whileOp)
Whether whileOp repeats forever: its condition is a constant true, and its condition region does noth...
void registerAIEObjectFifoPipeline()
Register aie-objectFifo-stateful-transform as a pipeline over the passes that lower aie....
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPathfinderPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEVectorTransferLoweringPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoSplitPass()
mlir::Operation * getObjectFifoLoopParent(mlir::Operation *op)
The innermost loop around op that isObjectFifoLoop accepts, or null.
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEImportOverlayPass()
bool isObjectFifoLoop(mlir::Operation *op)
Whether op is a loop that objectFifo lowering unrolls by the rotation period of the objectFifos acces...