xref: /llvm-project/mlir/lib/CAPI/Transforms/Rewrite.cpp (revision 09dfc5713d7e2342bea4c8447d1ed76c85eb8225)
118cf1cd9SJacques Pienaar //===- Rewrite.cpp - C API for Rewrite Patterns ---------------------------===//
218cf1cd9SJacques Pienaar //
318cf1cd9SJacques Pienaar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
418cf1cd9SJacques Pienaar // See https://llvm.org/LICENSE.txt for license information.
518cf1cd9SJacques Pienaar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
618cf1cd9SJacques Pienaar //
718cf1cd9SJacques Pienaar //===----------------------------------------------------------------------===//
818cf1cd9SJacques Pienaar 
918cf1cd9SJacques Pienaar #include "mlir-c/Rewrite.h"
105f8c46b8SFehr Mathieu 
1118cf1cd9SJacques Pienaar #include "mlir-c/Transforms.h"
1218cf1cd9SJacques Pienaar #include "mlir/CAPI/IR.h"
135f8c46b8SFehr Mathieu #include "mlir/CAPI/Rewrite.h"
1418cf1cd9SJacques Pienaar #include "mlir/CAPI/Support.h"
155f8c46b8SFehr Mathieu #include "mlir/CAPI/Wrap.h"
1618cf1cd9SJacques Pienaar #include "mlir/IR/PatternMatch.h"
1718cf1cd9SJacques Pienaar #include "mlir/Rewrite/FrozenRewritePatternSet.h"
1818cf1cd9SJacques Pienaar #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
1918cf1cd9SJacques Pienaar 
2018cf1cd9SJacques Pienaar using namespace mlir;
2118cf1cd9SJacques Pienaar 
225f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
235f8c46b8SFehr Mathieu /// RewriterBase API inherited from OpBuilder
245f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
255f8c46b8SFehr Mathieu 
265f8c46b8SFehr Mathieu MlirContext mlirRewriterBaseGetContext(MlirRewriterBase rewriter) {
275f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->getContext());
285f8c46b8SFehr Mathieu }
295f8c46b8SFehr Mathieu 
305f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
315f8c46b8SFehr Mathieu /// Insertion points methods
325f8c46b8SFehr Mathieu 
335f8c46b8SFehr Mathieu void mlirRewriterBaseClearInsertionPoint(MlirRewriterBase rewriter) {
345f8c46b8SFehr Mathieu   unwrap(rewriter)->clearInsertionPoint();
355f8c46b8SFehr Mathieu }
365f8c46b8SFehr Mathieu 
375f8c46b8SFehr Mathieu void mlirRewriterBaseSetInsertionPointBefore(MlirRewriterBase rewriter,
385f8c46b8SFehr Mathieu                                              MlirOperation op) {
395f8c46b8SFehr Mathieu   unwrap(rewriter)->setInsertionPoint(unwrap(op));
405f8c46b8SFehr Mathieu }
415f8c46b8SFehr Mathieu 
425f8c46b8SFehr Mathieu void mlirRewriterBaseSetInsertionPointAfter(MlirRewriterBase rewriter,
435f8c46b8SFehr Mathieu                                             MlirOperation op) {
445f8c46b8SFehr Mathieu   unwrap(rewriter)->setInsertionPointAfter(unwrap(op));
455f8c46b8SFehr Mathieu }
465f8c46b8SFehr Mathieu 
475f8c46b8SFehr Mathieu void mlirRewriterBaseSetInsertionPointAfterValue(MlirRewriterBase rewriter,
485f8c46b8SFehr Mathieu                                                  MlirValue value) {
495f8c46b8SFehr Mathieu   unwrap(rewriter)->setInsertionPointAfterValue(unwrap(value));
505f8c46b8SFehr Mathieu }
515f8c46b8SFehr Mathieu 
525f8c46b8SFehr Mathieu void mlirRewriterBaseSetInsertionPointToStart(MlirRewriterBase rewriter,
535f8c46b8SFehr Mathieu                                               MlirBlock block) {
545f8c46b8SFehr Mathieu   unwrap(rewriter)->setInsertionPointToStart(unwrap(block));
555f8c46b8SFehr Mathieu }
565f8c46b8SFehr Mathieu 
575f8c46b8SFehr Mathieu void mlirRewriterBaseSetInsertionPointToEnd(MlirRewriterBase rewriter,
585f8c46b8SFehr Mathieu                                             MlirBlock block) {
595f8c46b8SFehr Mathieu   unwrap(rewriter)->setInsertionPointToEnd(unwrap(block));
605f8c46b8SFehr Mathieu }
615f8c46b8SFehr Mathieu 
625f8c46b8SFehr Mathieu MlirBlock mlirRewriterBaseGetInsertionBlock(MlirRewriterBase rewriter) {
635f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->getInsertionBlock());
645f8c46b8SFehr Mathieu }
655f8c46b8SFehr Mathieu 
665f8c46b8SFehr Mathieu MlirBlock mlirRewriterBaseGetBlock(MlirRewriterBase rewriter) {
675f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->getBlock());
685f8c46b8SFehr Mathieu }
695f8c46b8SFehr Mathieu 
705f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
715f8c46b8SFehr Mathieu /// Block and operation creation/insertion/cloning
725f8c46b8SFehr Mathieu 
735f8c46b8SFehr Mathieu MlirBlock mlirRewriterBaseCreateBlockBefore(MlirRewriterBase rewriter,
745f8c46b8SFehr Mathieu                                             MlirBlock insertBefore,
755f8c46b8SFehr Mathieu                                             intptr_t nArgTypes,
765f8c46b8SFehr Mathieu                                             MlirType const *argTypes,
775f8c46b8SFehr Mathieu                                             MlirLocation const *locations) {
785f8c46b8SFehr Mathieu   SmallVector<Type, 4> args;
795f8c46b8SFehr Mathieu   ArrayRef<Type> unwrappedArgs = unwrapList(nArgTypes, argTypes, args);
805f8c46b8SFehr Mathieu   SmallVector<Location, 4> locs;
815f8c46b8SFehr Mathieu   ArrayRef<Location> unwrappedLocs = unwrapList(nArgTypes, locations, locs);
825f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->createBlock(unwrap(insertBefore), unwrappedArgs,
835f8c46b8SFehr Mathieu                                             unwrappedLocs));
845f8c46b8SFehr Mathieu }
855f8c46b8SFehr Mathieu 
865f8c46b8SFehr Mathieu MlirOperation mlirRewriterBaseInsert(MlirRewriterBase rewriter,
875f8c46b8SFehr Mathieu                                      MlirOperation op) {
885f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->insert(unwrap(op)));
895f8c46b8SFehr Mathieu }
905f8c46b8SFehr Mathieu 
915f8c46b8SFehr Mathieu // Other methods of OpBuilder
925f8c46b8SFehr Mathieu 
935f8c46b8SFehr Mathieu MlirOperation mlirRewriterBaseClone(MlirRewriterBase rewriter,
945f8c46b8SFehr Mathieu                                     MlirOperation op) {
955f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->clone(*unwrap(op)));
965f8c46b8SFehr Mathieu }
975f8c46b8SFehr Mathieu 
985f8c46b8SFehr Mathieu MlirOperation mlirRewriterBaseCloneWithoutRegions(MlirRewriterBase rewriter,
995f8c46b8SFehr Mathieu                                                   MlirOperation op) {
1005f8c46b8SFehr Mathieu   return wrap(unwrap(rewriter)->cloneWithoutRegions(*unwrap(op)));
1015f8c46b8SFehr Mathieu }
1025f8c46b8SFehr Mathieu 
1035f8c46b8SFehr Mathieu void mlirRewriterBaseCloneRegionBefore(MlirRewriterBase rewriter,
1045f8c46b8SFehr Mathieu                                        MlirRegion region, MlirBlock before) {
1055f8c46b8SFehr Mathieu 
1065f8c46b8SFehr Mathieu   unwrap(rewriter)->cloneRegionBefore(*unwrap(region), unwrap(before));
1075f8c46b8SFehr Mathieu }
1085f8c46b8SFehr Mathieu 
1095f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
1105f8c46b8SFehr Mathieu /// RewriterBase API
1115f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
1125f8c46b8SFehr Mathieu 
1135f8c46b8SFehr Mathieu void mlirRewriterBaseInlineRegionBefore(MlirRewriterBase rewriter,
1145f8c46b8SFehr Mathieu                                         MlirRegion region, MlirBlock before) {
1155f8c46b8SFehr Mathieu   unwrap(rewriter)->inlineRegionBefore(*unwrap(region), unwrap(before));
1165f8c46b8SFehr Mathieu }
1175f8c46b8SFehr Mathieu 
1185f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceOpWithValues(MlirRewriterBase rewriter,
1195f8c46b8SFehr Mathieu                                          MlirOperation op, intptr_t nValues,
1205f8c46b8SFehr Mathieu                                          MlirValue const *values) {
1215f8c46b8SFehr Mathieu   SmallVector<Value, 4> vals;
1225f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedVals = unwrapList(nValues, values, vals);
1235f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceOp(unwrap(op), unwrappedVals);
1245f8c46b8SFehr Mathieu }
1255f8c46b8SFehr Mathieu 
1265f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceOpWithOperation(MlirRewriterBase rewriter,
1275f8c46b8SFehr Mathieu                                             MlirOperation op,
1285f8c46b8SFehr Mathieu                                             MlirOperation newOp) {
1295f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceOp(unwrap(op), unwrap(newOp));
1305f8c46b8SFehr Mathieu }
1315f8c46b8SFehr Mathieu 
1325f8c46b8SFehr Mathieu void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op) {
1335f8c46b8SFehr Mathieu   unwrap(rewriter)->eraseOp(unwrap(op));
1345f8c46b8SFehr Mathieu }
1355f8c46b8SFehr Mathieu 
1365f8c46b8SFehr Mathieu void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block) {
1375f8c46b8SFehr Mathieu   unwrap(rewriter)->eraseBlock(unwrap(block));
1385f8c46b8SFehr Mathieu }
1395f8c46b8SFehr Mathieu 
1405f8c46b8SFehr Mathieu void mlirRewriterBaseInlineBlockBefore(MlirRewriterBase rewriter,
1415f8c46b8SFehr Mathieu                                        MlirBlock source, MlirOperation op,
1425f8c46b8SFehr Mathieu                                        intptr_t nArgValues,
1435f8c46b8SFehr Mathieu                                        MlirValue const *argValues) {
1445f8c46b8SFehr Mathieu   SmallVector<Value, 4> vals;
1455f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedVals = unwrapList(nArgValues, argValues, vals);
1465f8c46b8SFehr Mathieu 
1475f8c46b8SFehr Mathieu   unwrap(rewriter)->inlineBlockBefore(unwrap(source), unwrap(op),
1485f8c46b8SFehr Mathieu                                       unwrappedVals);
1495f8c46b8SFehr Mathieu }
1505f8c46b8SFehr Mathieu 
1515f8c46b8SFehr Mathieu void mlirRewriterBaseMergeBlocks(MlirRewriterBase rewriter, MlirBlock source,
1525f8c46b8SFehr Mathieu                                  MlirBlock dest, intptr_t nArgValues,
1535f8c46b8SFehr Mathieu                                  MlirValue const *argValues) {
1545f8c46b8SFehr Mathieu   SmallVector<Value, 4> args;
1555f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedArgs = unwrapList(nArgValues, argValues, args);
1565f8c46b8SFehr Mathieu   unwrap(rewriter)->mergeBlocks(unwrap(source), unwrap(dest), unwrappedArgs);
1575f8c46b8SFehr Mathieu }
1585f8c46b8SFehr Mathieu 
1595f8c46b8SFehr Mathieu void mlirRewriterBaseMoveOpBefore(MlirRewriterBase rewriter, MlirOperation op,
1605f8c46b8SFehr Mathieu                                   MlirOperation existingOp) {
1615f8c46b8SFehr Mathieu   unwrap(rewriter)->moveOpBefore(unwrap(op), unwrap(existingOp));
1625f8c46b8SFehr Mathieu }
1635f8c46b8SFehr Mathieu 
1645f8c46b8SFehr Mathieu void mlirRewriterBaseMoveOpAfter(MlirRewriterBase rewriter, MlirOperation op,
1655f8c46b8SFehr Mathieu                                  MlirOperation existingOp) {
1665f8c46b8SFehr Mathieu   unwrap(rewriter)->moveOpAfter(unwrap(op), unwrap(existingOp));
1675f8c46b8SFehr Mathieu }
1685f8c46b8SFehr Mathieu 
1695f8c46b8SFehr Mathieu void mlirRewriterBaseMoveBlockBefore(MlirRewriterBase rewriter, MlirBlock block,
1705f8c46b8SFehr Mathieu                                      MlirBlock existingBlock) {
1715f8c46b8SFehr Mathieu   unwrap(rewriter)->moveBlockBefore(unwrap(block), unwrap(existingBlock));
1725f8c46b8SFehr Mathieu }
1735f8c46b8SFehr Mathieu 
1745f8c46b8SFehr Mathieu void mlirRewriterBaseStartOpModification(MlirRewriterBase rewriter,
1755f8c46b8SFehr Mathieu                                          MlirOperation op) {
1765f8c46b8SFehr Mathieu   unwrap(rewriter)->startOpModification(unwrap(op));
1775f8c46b8SFehr Mathieu }
1785f8c46b8SFehr Mathieu 
1795f8c46b8SFehr Mathieu void mlirRewriterBaseFinalizeOpModification(MlirRewriterBase rewriter,
1805f8c46b8SFehr Mathieu                                             MlirOperation op) {
1815f8c46b8SFehr Mathieu   unwrap(rewriter)->finalizeOpModification(unwrap(op));
1825f8c46b8SFehr Mathieu }
1835f8c46b8SFehr Mathieu 
1845f8c46b8SFehr Mathieu void mlirRewriterBaseCancelOpModification(MlirRewriterBase rewriter,
1855f8c46b8SFehr Mathieu                                           MlirOperation op) {
1865f8c46b8SFehr Mathieu   unwrap(rewriter)->cancelOpModification(unwrap(op));
1875f8c46b8SFehr Mathieu }
1885f8c46b8SFehr Mathieu 
1895f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceAllUsesWith(MlirRewriterBase rewriter,
1905f8c46b8SFehr Mathieu                                         MlirValue from, MlirValue to) {
1915f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceAllUsesWith(unwrap(from), unwrap(to));
1925f8c46b8SFehr Mathieu }
1935f8c46b8SFehr Mathieu 
1945f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceAllValueRangeUsesWith(MlirRewriterBase rewriter,
1955f8c46b8SFehr Mathieu                                                   intptr_t nValues,
1965f8c46b8SFehr Mathieu                                                   MlirValue const *from,
1975f8c46b8SFehr Mathieu                                                   MlirValue const *to) {
1985f8c46b8SFehr Mathieu   SmallVector<Value, 4> fromVals;
1995f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedFromVals = unwrapList(nValues, from, fromVals);
2005f8c46b8SFehr Mathieu   SmallVector<Value, 4> toVals;
2015f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedToVals = unwrapList(nValues, to, toVals);
2025f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
2035f8c46b8SFehr Mathieu }
2045f8c46b8SFehr Mathieu 
2055f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceAllOpUsesWithValueRange(MlirRewriterBase rewriter,
2065f8c46b8SFehr Mathieu                                                     MlirOperation from,
2075f8c46b8SFehr Mathieu                                                     intptr_t nTo,
2085f8c46b8SFehr Mathieu                                                     MlirValue const *to) {
2095f8c46b8SFehr Mathieu   SmallVector<Value, 4> toVals;
2105f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedToVals = unwrapList(nTo, to, toVals);
2115f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrappedToVals);
2125f8c46b8SFehr Mathieu }
2135f8c46b8SFehr Mathieu 
2145f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceAllOpUsesWithOperation(MlirRewriterBase rewriter,
2155f8c46b8SFehr Mathieu                                                    MlirOperation from,
2165f8c46b8SFehr Mathieu                                                    MlirOperation to) {
2175f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrap(to));
2185f8c46b8SFehr Mathieu }
2195f8c46b8SFehr Mathieu 
2205f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceOpUsesWithinBlock(MlirRewriterBase rewriter,
2215f8c46b8SFehr Mathieu                                               MlirOperation op,
2225f8c46b8SFehr Mathieu                                               intptr_t nNewValues,
2235f8c46b8SFehr Mathieu                                               MlirValue const *newValues,
2245f8c46b8SFehr Mathieu                                               MlirBlock block) {
2255f8c46b8SFehr Mathieu   SmallVector<Value, 4> vals;
2265f8c46b8SFehr Mathieu   ArrayRef<Value> unwrappedVals = unwrapList(nNewValues, newValues, vals);
2275f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceOpUsesWithinBlock(unwrap(op), unwrappedVals,
2285f8c46b8SFehr Mathieu                                              unwrap(block));
2295f8c46b8SFehr Mathieu }
2305f8c46b8SFehr Mathieu 
2315f8c46b8SFehr Mathieu void mlirRewriterBaseReplaceAllUsesExcept(MlirRewriterBase rewriter,
2325f8c46b8SFehr Mathieu                                           MlirValue from, MlirValue to,
2335f8c46b8SFehr Mathieu                                           MlirOperation exceptedUser) {
2345f8c46b8SFehr Mathieu   unwrap(rewriter)->replaceAllUsesExcept(unwrap(from), unwrap(to),
2355f8c46b8SFehr Mathieu                                          unwrap(exceptedUser));
2365f8c46b8SFehr Mathieu }
2375f8c46b8SFehr Mathieu 
2385f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2395f8c46b8SFehr Mathieu /// IRRewriter API
2405f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2415f8c46b8SFehr Mathieu 
2425f8c46b8SFehr Mathieu MlirRewriterBase mlirIRRewriterCreate(MlirContext context) {
2435f8c46b8SFehr Mathieu   return wrap(new IRRewriter(unwrap(context)));
2445f8c46b8SFehr Mathieu }
2455f8c46b8SFehr Mathieu 
2465f8c46b8SFehr Mathieu MlirRewriterBase mlirIRRewriterCreateFromOp(MlirOperation op) {
2475f8c46b8SFehr Mathieu   return wrap(new IRRewriter(unwrap(op)));
2485f8c46b8SFehr Mathieu }
2495f8c46b8SFehr Mathieu 
2505f8c46b8SFehr Mathieu void mlirIRRewriterDestroy(MlirRewriterBase rewriter) {
2515f8c46b8SFehr Mathieu   delete static_cast<IRRewriter *>(unwrap(rewriter));
2525f8c46b8SFehr Mathieu }
2535f8c46b8SFehr Mathieu 
2545f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2555f8c46b8SFehr Mathieu /// RewritePatternSet and FrozenRewritePatternSet API
2565f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2575f8c46b8SFehr Mathieu 
25818cf1cd9SJacques Pienaar inline mlir::RewritePatternSet &unwrap(MlirRewritePatternSet module) {
25918cf1cd9SJacques Pienaar   assert(module.ptr && "unexpected null module");
26018cf1cd9SJacques Pienaar   return *(static_cast<mlir::RewritePatternSet *>(module.ptr));
26118cf1cd9SJacques Pienaar }
26218cf1cd9SJacques Pienaar 
26318cf1cd9SJacques Pienaar inline MlirRewritePatternSet wrap(mlir::RewritePatternSet *module) {
26418cf1cd9SJacques Pienaar   return {module};
26518cf1cd9SJacques Pienaar }
26618cf1cd9SJacques Pienaar 
26718cf1cd9SJacques Pienaar inline mlir::FrozenRewritePatternSet *
26818cf1cd9SJacques Pienaar unwrap(MlirFrozenRewritePatternSet module) {
26918cf1cd9SJacques Pienaar   assert(module.ptr && "unexpected null module");
27018cf1cd9SJacques Pienaar   return static_cast<mlir::FrozenRewritePatternSet *>(module.ptr);
27118cf1cd9SJacques Pienaar }
27218cf1cd9SJacques Pienaar 
27318cf1cd9SJacques Pienaar inline MlirFrozenRewritePatternSet wrap(mlir::FrozenRewritePatternSet *module) {
27418cf1cd9SJacques Pienaar   return {module};
27518cf1cd9SJacques Pienaar }
27618cf1cd9SJacques Pienaar 
27718cf1cd9SJacques Pienaar MlirFrozenRewritePatternSet mlirFreezeRewritePattern(MlirRewritePatternSet op) {
27818cf1cd9SJacques Pienaar   auto *m = new mlir::FrozenRewritePatternSet(std::move(unwrap(op)));
27918cf1cd9SJacques Pienaar   op.ptr = nullptr;
28018cf1cd9SJacques Pienaar   return wrap(m);
28118cf1cd9SJacques Pienaar }
28218cf1cd9SJacques Pienaar 
28318cf1cd9SJacques Pienaar void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet op) {
28418cf1cd9SJacques Pienaar   delete unwrap(op);
28518cf1cd9SJacques Pienaar   op.ptr = nullptr;
28618cf1cd9SJacques Pienaar }
28718cf1cd9SJacques Pienaar 
28818cf1cd9SJacques Pienaar MlirLogicalResult
28918cf1cd9SJacques Pienaar mlirApplyPatternsAndFoldGreedily(MlirModule op,
29018cf1cd9SJacques Pienaar                                  MlirFrozenRewritePatternSet patterns,
29118cf1cd9SJacques Pienaar                                  MlirGreedyRewriteDriverConfig) {
292*09dfc571SJacques Pienaar   return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns)));
29318cf1cd9SJacques Pienaar }
29418cf1cd9SJacques Pienaar 
2955f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2965f8c46b8SFehr Mathieu /// PDLPatternModule API
2975f8c46b8SFehr Mathieu //===----------------------------------------------------------------------===//
2985f8c46b8SFehr Mathieu 
29918cf1cd9SJacques Pienaar #if MLIR_ENABLE_PDL_IN_PATTERNMATCH
30018cf1cd9SJacques Pienaar inline mlir::PDLPatternModule *unwrap(MlirPDLPatternModule module) {
30118cf1cd9SJacques Pienaar   assert(module.ptr && "unexpected null module");
30218cf1cd9SJacques Pienaar   return static_cast<mlir::PDLPatternModule *>(module.ptr);
30318cf1cd9SJacques Pienaar }
30418cf1cd9SJacques Pienaar 
30518cf1cd9SJacques Pienaar inline MlirPDLPatternModule wrap(mlir::PDLPatternModule *module) {
30618cf1cd9SJacques Pienaar   return {module};
30718cf1cd9SJacques Pienaar }
30818cf1cd9SJacques Pienaar 
30918cf1cd9SJacques Pienaar MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
31018cf1cd9SJacques Pienaar   return wrap(new mlir::PDLPatternModule(
31118cf1cd9SJacques Pienaar       mlir::OwningOpRef<mlir::ModuleOp>(unwrap(op))));
31218cf1cd9SJacques Pienaar }
31318cf1cd9SJacques Pienaar 
31418cf1cd9SJacques Pienaar void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
31518cf1cd9SJacques Pienaar   delete unwrap(op);
31618cf1cd9SJacques Pienaar   op.ptr = nullptr;
31718cf1cd9SJacques Pienaar }
31818cf1cd9SJacques Pienaar 
31918cf1cd9SJacques Pienaar MlirRewritePatternSet
32018cf1cd9SJacques Pienaar mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
32118cf1cd9SJacques Pienaar   auto *m = new mlir::RewritePatternSet(std::move(*unwrap(op)));
32218cf1cd9SJacques Pienaar   op.ptr = nullptr;
32318cf1cd9SJacques Pienaar   return wrap(m);
32418cf1cd9SJacques Pienaar }
32518cf1cd9SJacques Pienaar #endif // MLIR_ENABLE_PDL_IN_PATTERNMATCH
326