15#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
16#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVMPass.h"
17#include "mlir/Dialect/Arith/IR/Arith.h"
18#include "mlir/Dialect/ControlFlow/IR/ControlFlow.h"
19#include "mlir/Dialect/DLTI/DLTI.h"
20#include "mlir/Dialect/Index/IR/IndexDialect.h"
21#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
22#include "mlir/Dialect/Math/IR/Math.h"
23#include "mlir/Dialect/Ptr/IR/PtrOps.h"
24#include "mlir/Dialect/UB/IR/UBOps.h"
25#include "mlir/Dialect/Vector/IR/VectorOps.h"
26#include "mlir/IR/Attributes.h"
27#include "mlir/IR/IRMapping.h"
28#include "mlir/IR/PatternMatch.h"
29#include "mlir/Pass/Pass.h"
30#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
31#include "mlir/Transforms/DialectConversion.h"
34#define GEN_PASS_DEF_AIECORETOSTANDARD
35#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
43static StringRef getArchIntrinsicString(
AIEArch arch) {
52 llvm::report_fatal_error(
"unsupported arch");
55typedef std::tuple<const char *, std::vector<Type>, std::vector<Type>>
59static auto getAIE1Intrinsics(OpBuilder &builder) {
60 Type int32Type = IntegerType::get(builder.getContext(), 32);
61 Type int128Type = IntegerType::get(builder.getContext(), 128);
62 Type int384Type = IntegerType::get(builder.getContext(), 384);
63 Type floatType = Float32Type::get(builder.getContext());
68 {
"debug_i32", {int32Type}, {}},
69 {
"llvm.aie.event0", {}, {}},
70 {
"llvm.aie.event1", {}, {}},
72 {int32Type, int32Type},
75 {int32Type, int128Type},
78 {int32Type, floatType},
80 {
"llvm.aie.get.ss", {int32Type}, {int32Type}},
84 {
"llvm.aie.get.fss", {int32Type}, {floatType}},
85 {
"llvm.aie.put.mcd", {int384Type}, {}},
86 {
"llvm.aie.get.scd", {}, {int384Type}},
87 {
"llvm.aie.lock.acquire.reg",
88 {int32Type, int32Type},
90 {
"llvm.aie.lock.release.reg",
91 {int32Type, int32Type},
97static auto getAIE2Intrinsics(OpBuilder &builder) {
98 Type int32Type = IntegerType::get(builder.getContext(), 32);
99 Type accType = VectorType::get({16}, int32Type);
101 {
"debug_i32", {int32Type}, {}},
102 {
"llvm.aie2.event", {int32Type}, {}},
103 {
"llvm.aie2.put.ms", {int32Type, int32Type}, {}},
104 {
"llvm.aie2.get.ss", {}, {int32Type, int32Type}},
105 {
"llvm.aie2.mcd.write.vec",
106 {accType, int32Type},
108 {
"llvm.aie2.scd.read.vec",
111 {
"llvm.aie2.acquire",
112 {int32Type, int32Type},
114 {
"llvm.aie2.release",
115 {int32Type, int32Type},
117 {
"llvm.aie2.set.ctrl.reg",
118 {int32Type, int32Type},
124static auto getAIE2pIntrinsics(OpBuilder &builder) {
125 Type int32Type = IntegerType::get(builder.getContext(), 32);
126 Type accType = VectorType::get({16}, int32Type);
128 {
"debug_i32", {int32Type}, {}},
129 {
"llvm.aie2p.event", {int32Type}, {}},
130 {
"llvm.aie2p.put.ms",
131 {int32Type, int32Type},
133 {
"llvm.aie2p.get.ss",
135 {int32Type, int32Type}},
136 {
"llvm.aie2p.mcd.write.vec",
137 {accType, int32Type},
139 {
"llvm.aie2p.scd.read.vec",
142 {
"llvm.aie2p.acquire",
143 {int32Type, int32Type},
145 {
"llvm.aie2p.release",
146 {int32Type, int32Type},
148 {
"llvm.aie2p.set.ctrl.reg",
149 {int32Type, int32Type},
155static void declareAIEIntrinsics(
AIEArch arch, OpBuilder &builder) {
157 for (
auto &i : functions) {
158 auto [name, argTypes, retTypes] = i;
159 func::FuncOp::create(
160 builder, builder.getUnknownLoc(), name,
161 FunctionType::get(builder.getContext(), argTypes, retTypes))
167 registerIntrinsics(getAIE1Intrinsics(builder));
170 registerIntrinsics(getAIE2Intrinsics(builder));
173 registerIntrinsics(getAIE2pIntrinsics(builder));
176 llvm::report_fatal_error(
"unsupported arch");
179template <
typename MyAIEOp>
185 AIEOpRemoval(MLIRContext *context, ModuleOp &m, PatternBenefit benefit = 1)
190 ConversionPatternRewriter &rewriter)
const override {
191 rewriter.eraseOp(op);
197 using OpConversionPattern::OpConversionPattern;
201 PatternBenefit benefit = 1)
206 ConversionPatternRewriter &rewriter)
const override {
207 std::string funcName =
"debug_i32";
208 auto func =
module.lookupSymbol<func::FuncOp>(funcName);
210 return op.emitOpError(
"Could not find the intrinsic function ")
212 SmallVector<Value, 1>
args;
213 args.push_back(op.getArg());
214 func::CallOp::create(rewriter, rewriter.getUnknownLoc(), func,
args);
215 rewriter.eraseOp(op);
221 using OpConversionPattern::OpConversionPattern;
225 PatternBenefit benefit = 1)
230 ConversionPatternRewriter &rewriter)
const override {
231 auto device = op->getParentOfType<DeviceOp>();
232 const auto &targetModel = device.getTargetModel();
233 std::string funcName;
234 if (targetModel.getTargetArch() == AIEArch::AIE1)
235 funcName =
"llvm.aie.put.";
236 else if (targetModel.getTargetArch() == AIEArch::AIE2)
237 funcName =
"llvm.aie2.put.";
239 funcName =
"llvm.aie2p.put.";
241 if (op.isWideStream())
243 else if (op.isFloatStream())
248 auto putMSFunc =
module.lookupSymbol<func::FuncOp>(funcName);
250 return op.emitOpError(
"Could not find the intrinsic function ")
252 SmallVector<Value, 2>
args;
253 if (targetModel.getTargetArch() == AIEArch::AIE1) {
254 args.push_back(op.getChannel());
255 args.push_back(op.getStreamValue());
257 args.push_back(op.getStreamValue());
258 args.push_back(arith::ConstantOp::create(
259 rewriter, op.getLoc(), IntegerType::get(rewriter.getContext(), 32),
260 rewriter.getI32IntegerAttr(0)));
262 func::CallOp::create(rewriter, rewriter.getUnknownLoc(), putMSFunc,
args);
263 rewriter.eraseOp(op);
269 using OpConversionPattern::OpConversionPattern;
273 PatternBenefit benefit = 1)
278 ConversionPatternRewriter &rewriter)
const override {
279 auto device = op->getParentOfType<DeviceOp>();
280 const auto &targetModel = device.getTargetModel();
281 std::string funcName;
282 if (targetModel.getTargetArch() == AIEArch::AIE1)
283 funcName =
"llvm.aie.get.";
284 else if (targetModel.getTargetArch() == AIEArch::AIE2)
285 funcName =
"llvm.aie2.get.";
287 funcName =
"llvm.aie2p.get.";
289 if (op.isWideStream())
291 else if (op.isFloatStream())
296 auto getSSFunc =
module.lookupSymbol<func::FuncOp>(funcName);
298 return op.emitOpError(
"Could not find the intrinsic function ")
300 SmallVector<Value, 2>
args;
301 if (targetModel.getTargetArch() == AIEArch::AIE1)
302 args.push_back(op.getChannel());
303 auto getSSCall = func::CallOp::create(rewriter, rewriter.getUnknownLoc(),
305 rewriter.replaceOp(op, getSSCall.getResult(0));
312 using OpConversionPattern::OpConversionPattern;
316 PatternBenefit benefit = 1)
321 ConversionPatternRewriter &rewriter)
const override {
322 auto device = op->getParentOfType<DeviceOp>();
323 const auto &targetModel = device.getTargetModel();
324 std::string funcName;
325 if (targetModel.getTargetArch() == AIEArch::AIE1)
326 funcName =
"llvm.aie.put.mcd";
327 else if (targetModel.getTargetArch() == AIEArch::AIE2)
328 funcName =
"llvm.aie2.mcd.write.vec";
330 funcName =
"llvm.aie2p.mcd.write.vec";
331 auto putMCDFunc =
module.lookupSymbol<func::FuncOp>(funcName);
333 return op.emitOpError(
"Could not find the intrinsic function ")
335 SmallVector<Value, 2>
args;
336 Value cascadeValue = op.getCascadeValue();
339 Type expectedInputType = putMCDFunc.getFunctionType().getInput(0);
340 Type actualInputType = cascadeValue.getType();
342 if (expectedInputType != actualInputType) {
345 cascadeValue = vector::BitCastOp::create(rewriter, op.getLoc(),
346 expectedInputType, cascadeValue);
349 args.push_back(cascadeValue);
350 if (isa<AIE2TargetModel>(targetModel))
351 args.push_back(arith::ConstantOp::create(
352 rewriter, op.getLoc(), IntegerType::get(rewriter.getContext(), 32),
353 rewriter.getI32IntegerAttr(1)));
355 func::CallOp::create(rewriter, rewriter.getUnknownLoc(), putMCDFunc,
args);
356 rewriter.eraseOp(op);
362 using OpConversionPattern::OpConversionPattern;
366 PatternBenefit benefit = 1)
371 ConversionPatternRewriter &rewriter)
const override {
372 auto device = op->getParentOfType<DeviceOp>();
373 const auto &targetModel = device.getTargetModel();
374 std::string funcName;
375 if (targetModel.getTargetArch() == AIEArch::AIE1)
376 funcName =
"llvm.aie.get.scd";
377 else if (targetModel.getTargetArch() == AIEArch::AIE2)
378 funcName =
"llvm.aie2.scd.read.vec";
380 funcName =
"llvm.aie2p.scd.read.vec";
381 auto getSCDFunc =
module.lookupSymbol<func::FuncOp>(funcName);
383 return op.emitOpError(
"Could not find the intrinsic function ")
385 SmallVector<Value, 2>
args;
386 if (isa<AIE2TargetModel>(targetModel))
387 args.push_back(arith::ConstantOp::create(
388 rewriter, op.getLoc(), IntegerType::get(rewriter.getContext(), 32),
389 rewriter.getI32IntegerAttr(1)));
391 auto getSCDCall = func::CallOp::create(rewriter, rewriter.getUnknownLoc(),
393 Value result = getSCDCall.getResult(0);
396 Type expectedType = op.getResult().getType();
397 Type intrinsicReturnType = result.getType();
399 if (expectedType != intrinsicReturnType) {
402 result = vector::BitCastOp::create(rewriter, op.getLoc(), expectedType,
406 rewriter.replaceOp(op, result);
412 using OpConversionPattern::OpConversionPattern;
416 PatternBenefit benefit = 1)
420 ConversionPatternRewriter &rewriter)
const override {
421 if (!isa<DeviceOp>(useLock->getParentOp())) {
422 auto device = useLock->getParentOfType<DeviceOp>();
424 return module.emitOpError("Device Not found!");
426 const auto &targetModel = device.getTargetModel();
429 std::string funcName;
430 if (targetModel.getTargetArch() == AIEArch::AIE1)
431 funcName =
"llvm.aie.lock.";
432 else if (targetModel.getTargetArch() == AIEArch::AIE2)
433 funcName =
"llvm.aie2.";
435 funcName =
"llvm.aie2p.";
436 if (useLock.acquire() || useLock.acquireGE())
437 funcName +=
"acquire";
438 else if (useLock.release())
439 funcName +=
"release";
440 if (targetModel.getTargetArch() == AIEArch::AIE1)
443 auto useLockFunc =
module.lookupSymbol<func::FuncOp>(funcName);
445 return useLock.emitOpError(
"Could not find the intrinsic function!");
447 SmallVector<Value, 2>
args;
448 auto lockValue = useLock.getLockValue();
451 if (useLock.acquireGE()) {
452 lockValue = -lockValue;
454 args.push_back(arith::IndexCastOp::create(
455 rewriter, useLock.getLoc(),
456 IntegerType::get(rewriter.getContext(), 32), useLock.getLock()));
458 arith::ConstantOp::create(rewriter, useLock.getLoc(),
459 IntegerType::get(rewriter.getContext(), 32),
460 rewriter.getI32IntegerAttr(lockValue)));
462 func::CallOp::create(rewriter, rewriter.getUnknownLoc(), useLockFunc,
465 rewriter.eraseOp(useLock);
471 using OpConversionPattern::OpConversionPattern;
476 PatternBenefit benefit = 1,
int tileCol = -1,
482 ConversionPatternRewriter &rewriter)
const override {
483 rewriter.setInsertionPointToStart(module.getBody());
484 auto t = llvm::cast<MemRefType>(buffer.getType());
485 int col = llvm::cast<TileOp>(buffer.getTile().getDefiningOp()).getCol();
486 int row = llvm::cast<TileOp>(buffer.getTile().getDefiningOp()).getRow();
487 auto symName = buffer.name().getValue();
488 mlir::ElementsAttr initValue = buffer.getInitialValueAttr();
493 memref::GlobalOp::create(rewriter, rewriter.getUnknownLoc(), symName,
494 rewriter.getStringAttr(
"public"), buffer.getType(),
498 for (
auto &use : make_early_inc_range(buffer.getResult().getUses())) {
499 Operation *user = use.getOwner();
500 rewriter.setInsertionPoint(user);
501 auto allocated = memref::GetGlobalOp::create(
502 rewriter, rewriter.getUnknownLoc(), t, symName);
504 memref::AssumeAlignmentOp::create(rewriter, rewriter.getUnknownLoc(),
507 use.set(allocated.getResult());
510 rewriter.eraseOp(buffer);
516 using OpConversionPattern::OpConversionPattern;
524 MLIRContext *context, ModuleOp &m, IRMapping &
mapper,
525 DenseMap<Operation *, SmallVector<BufferOp, 4>> &
tileToBuffers,
532 ConversionPatternRewriter &rewriter)
const override {
534 int col = op.colIndex();
535 int row = op.rowIndex();
540 rewriter.eraseOp(op);
545 rewriter.setInsertionPointAfter(op->getParentOp());
547 std::string coreName(
"core_" + std::to_string(
col) +
"_" +
548 std::to_string(
row));
550 func::FuncOp::create(rewriter, rewriter.getUnknownLoc(), coreName,
551 FunctionType::get(rewriter.getContext(), {}, {}));
553 rewriter.cloneRegionBefore(op.getBody(), coreFunc.getBody(),
554 coreFunc.getBody().begin(),
mapper);
561 bool hasIntegerSRS =
false;
562 bool hasBF16Matmul =
false;
563 coreFunc.walk([&](Operation *childOp) {
564 StringRef opName = childOp->getName().getStringRef();
565 if (opName ==
"aievec.srs") {
570 if (childOp->getNumResults() > 0) {
571 auto resultType = childOp->getResult(0).getType();
572 if (auto vecType = dyn_cast<VectorType>(resultType)) {
573 if (vecType.getElementType().isInteger())
574 hasIntegerSRS = true;
580 if (opName ==
"aievec.matmul" || opName ==
"aievec.matmul_aie2p") {
581 if (childOp->getNumOperands() > 0) {
582 auto lhsType = childOp->getOperand(0).getType();
583 if (auto vecType = dyn_cast<VectorType>(lhsType))
584 if (vecType.getElementType().isBF16())
585 hasBF16Matmul = true;
589 if (hasSRS || hasBF16Matmul) {
590 auto device = op->getParentOfType<DeviceOp>();
592 AIEArch arch = device.getTargetModel().getTargetArch();
593 if (arch == AIEArch::AIE2 || arch == AIEArch::AIE2p) {
594 std::string ctrlRegFuncName = (arch == AIEArch::AIE2p)
595 ?
"llvm.aie2p.set.ctrl.reg"
596 :
"llvm.aie2.set.ctrl.reg";
597 auto ctrlRegFunc =
module.lookupSymbol<func::FuncOp>(ctrlRegFuncName);
599 Block &entryBlock = coreFunc.getBody().front();
600 rewriter.setInsertionPointToStart(&entryBlock);
601 Location loc = op.getLoc();
611 int rndRegIdx = (arch == AIEArch::AIE2p) ? 1 : 6;
613 auto cSatIdx = arith::ConstantOp::create(
614 rewriter, loc, rewriter.getI32IntegerAttr(satRegIdx));
615 auto c1 = arith::ConstantOp::create(rewriter, loc,
616 rewriter.getI32IntegerAttr(1));
617 func::CallOp::create(rewriter, loc, ctrlRegFunc,
618 ValueRange{cSatIdx, c1});
627 int roundingMode = hasBF16Matmul ? 12 : hasIntegerSRS ? 9 : 0;
628 auto cRndIdx = arith::ConstantOp::create(
629 rewriter, loc, rewriter.getI32IntegerAttr(rndRegIdx));
630 auto cRoundingMode = arith::ConstantOp::create(
631 rewriter, loc, rewriter.getI32IntegerAttr(roundingMode));
632 func::CallOp::create(rewriter, loc, ctrlRegFunc,
633 ValueRange{cRndIdx, cRoundingMode});
640 coreFunc.getBody().walk([&](Operation *childOp) {
641 rewriter.setInsertionPointAfter(childOp);
643 if (isa<EndOp>(childOp)) {
644 func::ReturnOp::create(rewriter, rewriter.getUnknownLoc(),
646 rewriter.eraseOp(childOp);
650 rewriter.eraseOp(op);
656template <
typename OpTy>
658 SmallVector<OpTy, 16> ops;
659 for (
const auto &op : device.getOps<OpTy>())
662 for (
const auto &op : ops)
663 op->moveBefore(device);
668 using OpConversionPattern::OpConversionPattern;
672 PatternBenefit benefit = 1)
677 ConversionPatternRewriter &rewriter)
const override {
678 auto device = op->getParentOfType<DeviceOp>();
679 std::string funcName;
680 SmallVector<Value, 1>
args;
681 switch (device.getTargetModel().getTargetArch()) {
683 funcName =
"llvm.aie.event" + std::to_string(op.getVal());
686 funcName =
"llvm.aie2.event";
687 args.push_back(arith::ConstantOp::create(
688 rewriter, op.getLoc(), rewriter.getI32Type(),
689 rewriter.getI32IntegerAttr(op.getVal())));
692 funcName =
"llvm.aie2p.event";
693 args.push_back(arith::ConstantOp::create(
694 rewriter, op.getLoc(), rewriter.getI32Type(),
695 rewriter.getI32IntegerAttr(op.getVal())));
698 return op->emitOpError(
"Unsupported AIEArch for EventOp lowering");
700 auto eventFunc =
module.lookupSymbol<func::FuncOp>(funcName);
702 return op.emitOpError(
"Could not find the intrinsic function ")
704 func::CallOp::create(rewriter, rewriter.getUnknownLoc(), eventFunc,
args);
705 rewriter.eraseOp(op);
714 deviceName = options.deviceName;
715 tileCol = options.tileCol;
716 tileRow = options.tileRow;
721 ModuleOp m = getOperation();
722 OpBuilder builder = OpBuilder::atBlockEnd(m.getBody());
724 DeviceOp deviceOp = DeviceOp::getForSymbolInModuleOrError(m, deviceName);
726 return signalPassFailure();
728 const auto &targetModel = deviceOp.getTargetModel();
731 if (
auto dlAttr = deviceOp->getAttr(DLTIDialect::kDataLayoutAttrName)) {
732 m->setAttr(DLTIDialect::kDataLayoutAttrName, dlAttr);
737 m->setAttr(LLVM::LLVMDialect::getTargetTripleAttrName(),
738 builder.getStringAttr(
739 getArchIntrinsicString(targetModel.getTargetArch())));
741 DenseMap<Operation *, SmallVector<BufferOp, 4>> tileToBuffers;
747 builder.setInsertionPointToStart(m.getBody());
748 declareAIEIntrinsics(targetModel.getTargetArch(), builder);
751 ConversionTarget target(getContext());
752 target.addLegalDialect<func::FuncDialect>();
753 target.addLegalDialect<cf::ControlFlowDialect>();
754 target.addLegalDialect<memref::MemRefDialect>();
755 target.addLegalDialect<VectorDialect>();
756 target.addLegalDialect<aievec::AIEVecDialect>();
757 target.addLegalDialect<arith::ArithDialect>();
758 target.addLegalDialect<ub::UBDialect>();
759 target.addLegalDialect<math::MathDialect>();
760 target.addLegalDialect<index::IndexDialect>();
761 target.addLegalDialect<ptr::PtrDialect>();
762 target.addLegalOp<func::FuncOp, ModuleOp, UnrealizedConversionCastOp>();
764 RewritePatternSet patterns(&getContext());
772 if (failed(applyPartialConversion(deviceOp, target, std::move(patterns))))
773 return signalPassFailure();
775 RewritePatternSet outlinePatterns(&getContext());
779 if (failed(applyPartialConversion(deviceOp, target,
780 std::move(outlinePatterns))))
781 return signalPassFailure();
785 outlineOps<memref::GlobalOp>(deviceOp);
786 outlineOps<func::FuncOp>(deviceOp);
788 RewritePatternSet removepatterns(&getContext());
797 if (failed(applyPartialConversion(m, target, std::move(removepatterns))))
798 return signalPassFailure();
803 return std::make_unique<AIECoreToStandardPass>();
806std::unique_ptr<OperationPass<ModuleOp>>
808 return std::make_unique<AIECoreToStandardPass>(options);
std::vector< IntrinsicDecl > IntrinsicDecls
void outlineOps(DeviceOp device)
std::tuple< const char *, std::vector< Type >, std::vector< Type > > IntrinsicDecl
Include the generated interface declarations.
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECoreToStandardPass()
LogicalResult matchAndRewrite(BufferOp buffer, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
AIEBufferToStandard(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1, int tileCol=-1, int tileRow=-1)
ModuleOp &IRMapping & mapper
LogicalResult matchAndRewrite(CoreOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
AIECoreToStandardFunc(MLIRContext *context, ModuleOp &m, IRMapping &mapper, DenseMap< Operation *, SmallVector< BufferOp, 4 > > &tileToBuffers, PatternBenefit benefit=1, int tileCol=1, int tileRow=1)
DenseMap< Operation *, SmallVector< BufferOp, 4 > > & tileToBuffers
AIECoreToStandardPass()=default
AIECoreToStandardPass(const AIECoreToStandardOptions &options)
void runOnOperation() override
ModuleOp & AIEDebugOpToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
LogicalResult matchAndRewrite(DebugOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
ModuleOp & AIEEventOpToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
LogicalResult matchAndRewrite(EventOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
LogicalResult matchAndRewrite(GetCascadeOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
ModuleOp & AIEGetCascadeToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
LogicalResult matchAndRewrite(GetStreamOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
ModuleOp & AIEGetStreamToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
ModuleOp & AIEOpRemoval(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
typename MyAIEOp::Adaptor OpAdaptor
LogicalResult matchAndRewrite(MyAIEOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
LogicalResult matchAndRewrite(PutCascadeOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
ModuleOp & AIEPutCascadeToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
LogicalResult matchAndRewrite(PutStreamOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
ModuleOp & AIEPutStreamToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
ModuleOp & AIEUseLockToStdLowering(MLIRContext *context, ModuleOp &m, PatternBenefit benefit=1)
LogicalResult matchAndRewrite(UseLockOp useLock, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override