MLIR 24.0.0git
Rewrite.cpp
Go to the documentation of this file.
1//===- Rewrite.cpp - C API for Rewrite Patterns ---------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "mlir-c/Rewrite.h"
10
11#include "mlir-c/Support.h"
12#include "mlir-c/Transforms.h"
13#include "mlir/CAPI/IR.h"
14#include "mlir/CAPI/IRMapping.h"
15#include "mlir/CAPI/Rewrite.h"
16#include "mlir/CAPI/Support.h"
17#include "mlir/CAPI/Wrap.h"
18#include "mlir/IR/Attributes.h"
25
26#include <cassert>
27
28using namespace mlir;
29
30//===----------------------------------------------------------------------===//
31/// RewriterBase API inherited from OpBuilder
32//===----------------------------------------------------------------------===//
33
35 return wrap(unwrap(rewriter)->getContext());
36}
37
38//===----------------------------------------------------------------------===//
39/// Insertion points methods
40//===----------------------------------------------------------------------===//
41
43 unwrap(rewriter)->clearInsertionPoint();
44}
45
47 MlirOperation op) {
48 unwrap(rewriter)->setInsertionPoint(unwrap(op));
49}
50
52 MlirOperation op) {
53 unwrap(rewriter)->setInsertionPointAfter(unwrap(op));
54}
55
57 MlirValue value) {
58 unwrap(rewriter)->setInsertionPointAfterValue(unwrap(value));
59}
60
62 MlirBlock block) {
63 unwrap(rewriter)->setInsertionPointToStart(unwrap(block));
64}
65
67 MlirBlock block) {
68 unwrap(rewriter)->setInsertionPointToEnd(unwrap(block));
69}
70
72 return wrap(unwrap(rewriter)->getInsertionBlock());
73}
74
76 return wrap(unwrap(rewriter)->getBlock());
77}
78
79MlirOperation
81 mlir::RewriterBase *base = unwrap(rewriter);
82 mlir::Block *block = base->getInsertionBlock();
84 if (it == block->end())
85 return {nullptr};
86
87 return wrap(std::addressof(*it));
88}
89
92 OpBuilder::InsertPoint ip = unwrap(rewriter)->saveInsertionPoint();
93 if (!ip.isSet())
94 return {{nullptr}, {nullptr}};
95 Block *block = ip.getBlock();
96 MlirOperation operationAfter = ip.getPoint() == block->end()
97 ? MlirOperation{nullptr}
98 : wrap(&*ip.getPoint());
99 return {wrap(block), operationAfter};
100}
101
103 MlirRewriterBase rewriter, MlirRewriterBaseInsertPoint insertPoint) {
104 if (mlirBlockIsNull(insertPoint.block)) {
105 unwrap(rewriter)->clearInsertionPoint();
106 return;
107 }
108 Block *block = unwrap(insertPoint.block);
109 if (mlirOperationIsNull(insertPoint.operationAfter))
110 unwrap(rewriter)->setInsertionPointToEnd(block);
111 else
112 unwrap(rewriter)->setInsertionPoint(
113 block, Block::iterator(unwrap(insertPoint.operationAfter)));
114}
115
116//===----------------------------------------------------------------------===//
117/// Block and operation creation/insertion/cloning
118//===----------------------------------------------------------------------===//
119
121 MlirBlock insertBefore,
122 intptr_t nArgTypes,
123 MlirType const *argTypes,
124 MlirLocation const *locations) {
126 ArrayRef<Type> unwrappedArgs = unwrapList(nArgTypes, argTypes, args);
128 ArrayRef<Location> unwrappedLocs = unwrapList(nArgTypes, locations, locs);
129 return wrap(unwrap(rewriter)->createBlock(unwrap(insertBefore), unwrappedArgs,
130 unwrappedLocs));
131}
132
134 MlirOperation op) {
135 return wrap(unwrap(rewriter)->insert(unwrap(op)));
136}
137
138// Other methods of OpBuilder
139
141 MlirOperation op) {
142 return wrap(unwrap(rewriter)->clone(*unwrap(op)));
143}
144
146 MlirOperation op) {
147 return wrap(unwrap(rewriter)->cloneWithoutRegions(*unwrap(op)));
148}
149
151 MlirOperation op,
152 MlirIRMapping mapping) {
153 return wrap(unwrap(rewriter)->clone(*unwrap(op), *unwrap(mapping)));
154}
155
157 MlirRegion region, MlirBlock before) {
158
159 unwrap(rewriter)->cloneRegionBefore(*unwrap(region), unwrap(before));
160}
161
162//===----------------------------------------------------------------------===//
163/// RewriterBase API
164//===----------------------------------------------------------------------===//
165
167 MlirRegion region, MlirBlock before) {
168 unwrap(rewriter)->inlineRegionBefore(*unwrap(region), unwrap(before));
169}
170
172 MlirOperation op, intptr_t nValues,
173 MlirValue const *values) {
175 ArrayRef<Value> unwrappedVals = unwrapList(nValues, values, vals);
176 unwrap(rewriter)->replaceOp(unwrap(op), unwrappedVals);
177}
178
180 MlirOperation op,
181 MlirOperation newOp) {
182 unwrap(rewriter)->replaceOp(unwrap(op), unwrap(newOp));
183}
184
185void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op) {
186 unwrap(rewriter)->eraseOp(unwrap(op));
187}
188
189void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block) {
190 unwrap(rewriter)->eraseBlock(unwrap(block));
191}
192
194 MlirBlock source, MlirOperation op,
195 intptr_t nArgValues,
196 MlirValue const *argValues) {
198 ArrayRef<Value> unwrappedVals = unwrapList(nArgValues, argValues, vals);
199
200 unwrap(rewriter)->inlineBlockBefore(unwrap(source), unwrap(op),
201 unwrappedVals);
202}
203
204void mlirRewriterBaseMergeBlocks(MlirRewriterBase rewriter, MlirBlock source,
205 MlirBlock dest, intptr_t nArgValues,
206 MlirValue const *argValues) {
208 ArrayRef<Value> unwrappedArgs = unwrapList(nArgValues, argValues, args);
209 unwrap(rewriter)->mergeBlocks(unwrap(source), unwrap(dest), unwrappedArgs);
210}
211
212void mlirRewriterBaseMoveOpBefore(MlirRewriterBase rewriter, MlirOperation op,
213 MlirOperation existingOp) {
214 unwrap(rewriter)->moveOpBefore(unwrap(op), unwrap(existingOp));
215}
216
217void mlirRewriterBaseMoveOpAfter(MlirRewriterBase rewriter, MlirOperation op,
218 MlirOperation existingOp) {
219 unwrap(rewriter)->moveOpAfter(unwrap(op), unwrap(existingOp));
220}
221
223 MlirBlock existingBlock) {
224 unwrap(rewriter)->moveBlockBefore(unwrap(block), unwrap(existingBlock));
225}
226
228 MlirOperation op) {
229 unwrap(rewriter)->startOpModification(unwrap(op));
230}
231
233 MlirOperation op) {
234 unwrap(rewriter)->finalizeOpModification(unwrap(op));
235}
236
238 MlirOperation op) {
239 unwrap(rewriter)->cancelOpModification(unwrap(op));
240}
241
243 MlirValue from, MlirValue to) {
244 unwrap(rewriter)->replaceAllUsesWith(unwrap(from), unwrap(to));
245}
246
248 intptr_t nValues,
249 MlirValue const *from,
250 MlirValue const *to) {
251 SmallVector<Value, 4> fromVals;
252 ArrayRef<Value> unwrappedFromVals = unwrapList(nValues, from, fromVals);
254 ArrayRef<Value> unwrappedToVals = unwrapList(nValues, to, toVals);
255 unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
256}
257
259 MlirOperation from,
260 intptr_t nTo,
261 MlirValue const *to) {
263 ArrayRef<Value> unwrappedToVals = unwrapList(nTo, to, toVals);
264 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrappedToVals);
265}
266
268 MlirOperation from,
269 MlirOperation to) {
270 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrap(to));
271}
272
274 MlirOperation op,
275 intptr_t nNewValues,
276 MlirValue const *newValues,
277 MlirBlock block) {
279 ArrayRef<Value> unwrappedVals = unwrapList(nNewValues, newValues, vals);
280 unwrap(rewriter)->replaceOpUsesWithinBlock(unwrap(op), unwrappedVals,
281 unwrap(block));
282}
283
285 MlirValue from, MlirValue to,
286 MlirOperation exceptedUser) {
287 unwrap(rewriter)->replaceAllUsesExcept(unwrap(from), unwrap(to),
288 unwrap(exceptedUser));
289}
290
291//===----------------------------------------------------------------------===//
292/// IRRewriter API
293//===----------------------------------------------------------------------===//
294
296 return wrap(new IRRewriter(unwrap(context)));
297}
298
300 return wrap(new IRRewriter(unwrap(op)));
301}
302
304 delete static_cast<IRRewriter *>(unwrap(rewriter));
305}
306
307//===----------------------------------------------------------------------===//
308/// Dialect constant materialization API
309//===----------------------------------------------------------------------===//
310
311MlirOperation mlirDialectMaterializeConstant(MlirDialect dialect,
312 MlirRewriterBase rewriter,
313 MlirAttribute value, MlirType type,
314 MlirLocation loc) {
315 return wrap(unwrap(dialect)->materializeConstant(
316 *unwrap(rewriter), unwrap(value), unwrap(type), unwrap(loc)));
317}
318
319//===----------------------------------------------------------------------===//
320/// RewritePatternSet and FrozenRewritePatternSet API
321//===----------------------------------------------------------------------===//
322
323MlirFrozenRewritePatternSet
324mlirFreezeRewritePattern(MlirRewritePatternSet set) {
325 auto *m = new mlir::FrozenRewritePatternSet(std::move(*unwrap(set)));
326 set.ptr = nullptr;
327 return wrap(m);
328}
329
330void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set) {
331 delete unwrap(set);
332 set.ptr = nullptr;
333}
334
335//===----------------------------------------------------------------------===//
336/// GreedyRewriteDriverConfig API
337//===----------------------------------------------------------------------===//
338
339inline mlir::GreedyRewriteConfig *unwrap(MlirGreedyRewriteDriverConfig config) {
340 assert(config.ptr && "unexpected null config");
341 return static_cast<mlir::GreedyRewriteConfig *>(config.ptr);
342}
343
344inline MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config) {
345 return {config};
346}
347
348MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate() {
349 return wrap(new mlir::GreedyRewriteConfig());
350}
351
353 MlirGreedyRewriteDriverConfig config) {
354 delete unwrap(config);
355}
356
358 MlirGreedyRewriteDriverConfig config, int64_t maxIterations) {
359 unwrap(config)->setMaxIterations(maxIterations);
360}
361
363 MlirGreedyRewriteDriverConfig config, int64_t maxNumRewrites) {
364 unwrap(config)->setMaxNumRewrites(maxNumRewrites);
365}
366
368 MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal) {
369 unwrap(config)->setUseTopDownTraversal(useTopDownTraversal);
370}
371
373 MlirGreedyRewriteDriverConfig config, bool enable) {
374 unwrap(config)->enableFolding(enable);
375}
376
378 MlirGreedyRewriteDriverConfig config,
379 MlirGreedyRewriteStrictness strictness) {
380 mlir::GreedyRewriteStrictness cppStrictness;
381 switch (strictness) {
384 break;
387 break;
390 break;
391 }
392 unwrap(config)->setStrictness(cppStrictness);
393}
394
411
413 MlirGreedyRewriteDriverConfig config, bool enable) {
414 unwrap(config)->enableConstantCSE(enable);
415}
416
418 MlirGreedyRewriteDriverConfig config) {
419 return unwrap(config)->getMaxIterations();
420}
421
423 MlirGreedyRewriteDriverConfig config) {
424 return unwrap(config)->getMaxNumRewrites();
425}
426
428 MlirGreedyRewriteDriverConfig config) {
429 return unwrap(config)->getUseTopDownTraversal();
430}
431
433 MlirGreedyRewriteDriverConfig config) {
434 return unwrap(config)->isFoldingEnabled();
435}
436
450
466
468 MlirGreedyRewriteDriverConfig config) {
469 return unwrap(config)->isConstantCSEEnabled();
470}
471
474 MlirFrozenRewritePatternSet patterns,
475 MlirGreedyRewriteDriverConfig config) {
476 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
477 *unwrap(config)));
478}
479
482 MlirFrozenRewritePatternSet patterns,
483 MlirGreedyRewriteDriverConfig config) {
484 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
485 *unwrap(config)));
486}
487
488void mlirWalkAndApplyPatterns(MlirOperation op,
489 MlirFrozenRewritePatternSet patterns) {
491}
492
494mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target,
495 MlirFrozenRewritePatternSet patterns,
496 MlirConversionConfig config) {
497 return wrap(mlir::applyPartialConversion(unwrap(op), *unwrap(target),
498 *unwrap(patterns), *unwrap(config)));
499}
500
502 MlirConversionTarget target,
503 MlirFrozenRewritePatternSet patterns,
504 MlirConversionConfig config) {
505 return wrap(mlir::applyFullConversion(unwrap(op), *unwrap(target),
506 *unwrap(patterns), *unwrap(config)));
507}
508
509//===----------------------------------------------------------------------===//
510/// ConversionConfig API
511//===----------------------------------------------------------------------===//
512
513MlirConversionConfig mlirConversionConfigCreate(void) {
514 return wrap(new mlir::ConversionConfig());
515}
516
517void mlirConversionConfigDestroy(MlirConversionConfig config) {
518 delete unwrap(config);
519}
520
521void mlirConversionConfigSetFoldingMode(MlirConversionConfig config,
523 mlir::DialectConversionFoldingMode cppMode;
524 switch (mode) {
526 cppMode = mlir::DialectConversionFoldingMode::Never;
527 break;
529 cppMode = mlir::DialectConversionFoldingMode::BeforePatterns;
530 break;
532 cppMode = mlir::DialectConversionFoldingMode::AfterPatterns;
533 break;
534 }
535 unwrap(config)->foldingMode = cppMode;
536}
537
539mlirConversionConfigGetFoldingMode(MlirConversionConfig config) {
540 switch (unwrap(config)->foldingMode) {
541 case mlir::DialectConversionFoldingMode::Never:
543 case mlir::DialectConversionFoldingMode::BeforePatterns:
545 case mlir::DialectConversionFoldingMode::AfterPatterns:
547 }
548}
549
551 MlirConversionConfig config, bool enable) {
552 unwrap(config)->buildMaterializations = enable;
553}
554
556 MlirConversionConfig config) {
557 return unwrap(config)->buildMaterializations;
558}
559
560//===----------------------------------------------------------------------===//
561/// PatternRewriter API
562//===----------------------------------------------------------------------===//
563
564MlirRewriterBase mlirPatternRewriterAsBase(MlirPatternRewriter rewriter) {
565 return wrap(static_cast<mlir::RewriterBase *>(unwrap(rewriter)));
566}
567
568//===----------------------------------------------------------------------===//
569/// ConversionPatternRewriter API
570//===----------------------------------------------------------------------===//
571
573 MlirConversionPatternRewriter rewriter) {
574 return wrap(static_cast<mlir::PatternRewriter *>(unwrap(rewriter)));
575}
576
578 MlirConversionPatternRewriter rewriter, MlirRegion region,
579 MlirTypeConverter typeConverter) {
580 return wrap(unwrap(rewriter)->convertRegionTypes(unwrap(region),
581 *unwrap(typeConverter)));
582}
583
585 MlirConversionPatternRewriter rewriter, MlirOperation op, intptr_t nRanges,
586 intptr_t *rangeSizes, MlirValue *values) {
588 ranges.reserve(nRanges);
589 MlirValue *cur = values;
590 for (intptr_t i = 0; i < nRanges; ++i) {
591 intptr_t rangeSize = rangeSizes[i];
592 SmallVector<Value> range;
593 range.reserve(rangeSize);
594 for (intptr_t j = 0; j < rangeSize; ++j, ++cur)
595 range.push_back(unwrap(*cur));
596 ranges.push_back(std::move(range));
597 }
598 unwrap(rewriter)->replaceOpWithMultiple(unwrap(op), std::move(ranges));
599}
600
601//===----------------------------------------------------------------------===//
602/// ConversionTarget API
603//===----------------------------------------------------------------------===//
604
605MlirConversionTarget mlirConversionTargetCreate(MlirContext context) {
606 return wrap(new mlir::ConversionTarget(*unwrap(context)));
607}
608
609void mlirConversionTargetDestroy(MlirConversionTarget target) {
610 delete unwrap(target);
611}
612
613void mlirConversionTargetAddLegalOp(MlirConversionTarget target,
614 MlirStringRef opName) {
615 unwrap(target)->addLegalOp(
617}
618
619void mlirConversionTargetAddIllegalOp(MlirConversionTarget target,
620 MlirStringRef opName) {
621 unwrap(target)->addIllegalOp(
623}
624
626 MlirStringRef dialectName) {
627 unwrap(target)->addLegalDialect(unwrap(dialectName));
628}
629
631 MlirStringRef dialectName) {
632 unwrap(target)->addIllegalDialect(unwrap(dialectName));
633}
634
635namespace {
636/// Wraps a C dynamic-legality callback as a C++ DynamicLegalityCallbackFn,
637/// translating the tri-state MlirConversionTargetLegality result into the
638/// std::optional<bool> expected by ConversionTarget (NO_OPINION -> nullopt).
639ConversionTarget::DynamicLegalityCallbackFn
640wrapLegalityCallback(MlirConversionTargetDynamicLegalityCallback callback,
641 void *userData) {
642 return [callback, userData](Operation *op) -> std::optional<bool> {
643 switch (callback(wrap(op), userData)) {
645 return true;
647 return false;
649 return std::nullopt;
650 }
651 llvm_unreachable("unknown MlirConversionTargetLegality");
652 };
653}
654} // namespace
655
657 MlirConversionTarget target, MlirStringRef opName,
658 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
659 assert(callback && "expected non-null legality callback");
660 MLIRContext *ctx = &unwrap(target)->getContext();
661 OperationName name(unwrap(opName), ctx);
662 unwrap(target)->addDynamicallyLegalOp(
663 name, wrapLegalityCallback(callback, userData));
664}
665
667 MlirConversionTarget target, MlirStringRef dialectName,
668 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
669 assert(callback && "expected non-null legality callback");
670 unwrap(target)->addDynamicallyLegalDialect(
671 wrapLegalityCallback(callback, userData), unwrap(dialectName));
672}
673
675 MlirConversionTarget target, MlirStringRef opName,
676 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
677 MLIRContext *ctx = &unwrap(target)->getContext();
678 OperationName name(unwrap(opName), ctx);
679 ConversionTarget::DynamicLegalityCallbackFn fn;
680 if (callback)
681 fn = wrapLegalityCallback(callback, userData);
682 unwrap(target)->markOpRecursivelyLegal(name, fn);
683}
684
686 MlirConversionTarget target,
687 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
688 assert(callback && "expected non-null legality callback");
689 unwrap(target)->markUnknownOpDynamicallyLegal(
690 wrapLegalityCallback(callback, userData));
691}
692
693//===----------------------------------------------------------------------===//
694/// TypeConverter API
695//===----------------------------------------------------------------------===//
696
697MlirTypeConverter mlirTypeConverterCreate() {
698 return wrap(new mlir::TypeConverter());
699}
700
701void mlirTypeConverterDestroy(MlirTypeConverter typeConverter) {
702 delete unwrap(typeConverter);
703}
704
706 MlirTypeConverter typeConverter,
707 MlirTypeConverterConversionCallback convertType, void *userData) {
708 unwrap(typeConverter)
709 ->addConversion(
710 [convertType, userData](Type type, SmallVectorImpl<Type> &results)
711 -> std::optional<LogicalResult> {
712 MlirType converted{nullptr};
714 convertType(wrap(type), &converted, userData);
715 switch (status) {
717 results.push_back(unwrap(converted));
718 return success();
720 // Failure: fail the conversion without trying another
721 // registered conversion function.
722 return failure();
724 // Declined: allow the driver to try another conversion function.
725 return std::nullopt;
726 }
727 llvm_unreachable("unknown MlirTypeConverterConversionStatus");
728 });
729}
730
732 MlirTypeConverterConversionResults results, MlirType type) {
733 static_cast<SmallVectorImpl<Type> *>(results.ptr)->push_back(unwrap(type));
734}
735
737 MlirTypeConverter typeConverter,
738 MlirTypeConverter1ToNConversionCallback convertType, void *userData) {
739 unwrap(typeConverter)
740 ->addConversion(
741 [convertType, userData](Type type, SmallVectorImpl<Type> &results)
742 -> std::optional<LogicalResult> {
743 size_t numPriorResults = results.size();
744 MlirTypeConverterConversionResults wrappedResults{&results};
746 convertType(wrap(type), wrappedResults, userData);
747 switch (status) {
749 return success();
751 // Failure. Restore any types the callback appended (a
752 // non-succeeding conversion function must not mutate `results`)
753 // and fail the conversion without trying another function.
754 results.truncate(numPriorResults);
755 return failure();
757 // The callback declined. Restore any types it appended so the
758 // driver's "try the next conversion" invariant holds (a declining
759 // conversion function must not mutate `results`).
760 results.truncate(numPriorResults);
761 return std::nullopt;
762 }
763 llvm_unreachable("unknown MlirTypeConverterConversionStatus");
764 });
765}
766
767MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter,
768 MlirType type) {
769 return wrap(unwrap(typeConverter)->convertType(unwrap(type)));
770}
771
772namespace {
773SmallVector<MlirValue> wrapInputs(ValueRange inputs) {
774 SmallVector<MlirValue> wrappedInputs;
775 wrappedInputs.reserve(inputs.size());
776 for (Value v : inputs)
777 wrappedInputs.push_back(wrap(v));
778 return wrappedInputs;
779}
780
781std::function<Value(OpBuilder &, Type, ValueRange, Location)>
782wrapSourceMaterializationCallback(
783 MlirTypeConverterSourceMaterializationCallback callback, void *userData) {
784 return [callback, userData](OpBuilder &builder, Type type, ValueRange inputs,
785 Location loc) -> Value {
786 SmallVector<MlirValue> wrappedInputs = wrapInputs(inputs);
787 MlirValue result =
788 callback(wrap(static_cast<RewriterBase *>(&builder)), wrap(type),
789 static_cast<intptr_t>(wrappedInputs.size()),
790 wrappedInputs.data(), wrap(loc), userData);
791 return mlirValueIsNull(result) ? Value() : unwrap(result);
792 };
793}
794
795std::function<Value(OpBuilder &, Type, ValueRange, Location, Type)>
796wrapTargetMaterializationCallback(
797 MlirTypeConverterTargetMaterializationCallback callback, void *userData) {
798 return [callback, userData](OpBuilder &builder, Type type, ValueRange inputs,
799 Location loc, Type originalType) -> Value {
800 SmallVector<MlirValue> wrappedInputs = wrapInputs(inputs);
801 MlirValue result =
802 callback(wrap(static_cast<RewriterBase *>(&builder)), wrap(type),
803 static_cast<intptr_t>(wrappedInputs.size()),
804 wrappedInputs.data(), wrap(loc), wrap(originalType), userData);
805 return mlirValueIsNull(result) ? Value() : unwrap(result);
806 };
807}
808
809std::function<SmallVector<Value>(OpBuilder &, TypeRange, ValueRange, Location,
810 Type)>
811wrap1ToNTargetMaterializationCallback(
813 void *userData) {
814 return [callback, userData](OpBuilder &builder, TypeRange outputTypes,
815 ValueRange inputs, Location loc,
816 Type originalType) -> SmallVector<Value> {
817 SmallVector<MlirType> wrappedOutputTypes;
818 wrappedOutputTypes.reserve(outputTypes.size());
819 for (Type t : outputTypes)
820 wrappedOutputTypes.push_back(wrap(t));
821 SmallVector<MlirValue> wrappedInputs = wrapInputs(inputs);
822 SmallVector<MlirValue> wrappedOutputs(outputTypes.size(),
823 MlirValue{nullptr});
824 MlirLogicalResult result = callback(
825 wrap(static_cast<RewriterBase *>(&builder)),
826 static_cast<intptr_t>(wrappedOutputTypes.size()),
827 wrappedOutputTypes.data(), static_cast<intptr_t>(wrappedInputs.size()),
828 wrappedInputs.data(), wrap(loc), wrap(originalType),
829 wrappedOutputs.data(), userData);
831 return {}; // declined; another materialization may be attempted
832 SmallVector<Value> outputs;
833 outputs.reserve(wrappedOutputs.size());
834 for (MlirValue v : wrappedOutputs) {
835 // On success the callback must fill every output; a null entry is a
836 // contract violation (to decline, the callback returns failure instead).
837 assert(!mlirValueIsNull(v) &&
838 "1:N target materialization succeeded but left one of the outputs "
839 "null");
840 outputs.push_back(unwrap(v));
841 }
842 return outputs;
843 };
844}
845} // namespace
846
848 MlirTypeConverter typeConverter,
849 MlirTypeConverterSourceMaterializationCallback callback, void *userData) {
850 assert(callback && "expected non-null materialization callback");
851 unwrap(typeConverter)
852 ->addSourceMaterialization(
853 wrapSourceMaterializationCallback(callback, userData));
854}
855
857 MlirTypeConverter typeConverter,
858 MlirTypeConverterTargetMaterializationCallback callback, void *userData) {
859 assert(callback && "expected non-null materialization callback");
860 unwrap(typeConverter)
861 ->addTargetMaterialization(
862 wrapTargetMaterializationCallback(callback, userData));
863}
864
866 MlirTypeConverter typeConverter,
868 void *userData) {
869 assert(callback && "expected non-null materialization callback");
870 unwrap(typeConverter)
871 ->addTargetMaterialization(
872 wrap1ToNTargetMaterializationCallback(callback, userData));
873}
874
875//===----------------------------------------------------------------------===//
876/// ConversionPattern API
877//===----------------------------------------------------------------------===//
878
879namespace mlir {
880
881class ExternalConversionPattern : public mlir::ConversionPattern {
882public:
884 void *userData, StringRef rootName,
885 PatternBenefit benefit, MLIRContext *context,
886 TypeConverter *typeConverter,
887 ArrayRef<StringRef> generatedNames)
888 : ConversionPattern(*typeConverter, rootName, benefit, context,
889 generatedNames),
890 callbacks(callbacks), userData(userData) {
891 if (callbacks.construct)
892 callbacks.construct(userData);
893 }
894
896 if (callbacks.destruct)
897 callbacks.destruct(userData);
898 }
899
900 LogicalResult
902 ConversionPatternRewriter &rewriter) const override {
903 std::vector<MlirValue> wrappedOperands;
904 for (Value val : operands)
905 wrappedOperands.push_back(wrap(val));
906 return unwrap(callbacks.matchAndRewrite(
907 wrap(static_cast<const mlir::ConversionPattern *>(this)), wrap(op),
908 wrappedOperands.size(), wrappedOperands.data(), wrap(&rewriter),
909 userData));
910 }
911
912 LogicalResult
914 ConversionPatternRewriter &rewriter) const override {
915 // Without a 1:N callback, defer to the default behavior, which dispatches
916 // to the 1:1 matchAndRewrite above or fails to match on a 1:N mapping.
917 if (!callbacks.matchAndRewrite1ToN)
918 return dispatchTo1To1(*this, op, operands, rewriter);
919 SmallVector<intptr_t> rangeSizes;
920 rangeSizes.reserve(operands.size());
921 std::vector<MlirValue> wrappedOperands;
922 for (ValueRange range : operands) {
923 rangeSizes.push_back(static_cast<intptr_t>(range.size()));
924 for (Value val : range)
925 wrappedOperands.push_back(wrap(val));
926 }
927 return unwrap(callbacks.matchAndRewrite1ToN(
928 wrap(static_cast<const mlir::ConversionPattern *>(this)), wrap(op),
929 static_cast<intptr_t>(rangeSizes.size()), rangeSizes.data(),
930 static_cast<intptr_t>(wrappedOperands.size()), wrappedOperands.data(),
931 wrap(&rewriter), userData));
932 }
933
934private:
936 void *userData;
937};
938
939} // namespace mlir
940
941MlirConversionPattern mlirOpConversionPatternCreate(
942 MlirStringRef rootName, unsigned benefit, MlirContext context,
943 MlirTypeConverter typeConverter, MlirConversionPatternCallbacks callbacks,
944 void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames) {
945 std::vector<mlir::StringRef> generatedNamesVec;
946 generatedNamesVec.reserve(nGeneratedNames);
947 for (size_t i = 0; i < nGeneratedNames; ++i)
948 generatedNamesVec.push_back(unwrap(generatedNames[i]));
950 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
951 unwrap(context), unwrap(typeConverter), generatedNamesVec));
952}
953
954MlirTypeConverter
955mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern) {
956 return wrap(const_cast<TypeConverter *>(unwrap(pattern)->getTypeConverter()));
957}
958
959MlirRewritePattern
960mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern) {
961 return wrap(static_cast<const RewritePattern *>(unwrap(pattern)));
962}
963
964//===----------------------------------------------------------------------===//
965/// RewritePattern API
966//===----------------------------------------------------------------------===//
967
968namespace mlir {
969
971public:
973 StringRef rootName, PatternBenefit benefit,
974 MLIRContext *context,
975 ArrayRef<StringRef> generatedNames)
976 : RewritePattern(rootName, benefit, context, generatedNames),
977 callbacks(callbacks), userData(userData) {
978 if (callbacks.construct)
979 callbacks.construct(userData);
980 }
981
983 if (callbacks.destruct)
984 callbacks.destruct(userData);
985 }
986
987 LogicalResult matchAndRewrite(Operation *op,
988 PatternRewriter &rewriter) const override {
989 return unwrap(callbacks.matchAndRewrite(
990 wrap(static_cast<const mlir::RewritePattern *>(this)), wrap(op),
991 wrap(&rewriter), userData));
992 }
993
994private:
996 void *userData;
997};
998
999} // namespace mlir
1000
1002 MlirStringRef rootName, unsigned benefit, MlirContext context,
1003 MlirRewritePatternCallbacks callbacks, void *userData,
1004 size_t nGeneratedNames, MlirStringRef *generatedNames) {
1005 std::vector<mlir::StringRef> generatedNamesVec;
1006 generatedNamesVec.reserve(nGeneratedNames);
1007 for (size_t i = 0; i < nGeneratedNames; ++i) {
1008 generatedNamesVec.push_back(unwrap(generatedNames[i]));
1009 }
1011 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
1012 unwrap(context), generatedNamesVec));
1013}
1014
1015//===----------------------------------------------------------------------===//
1016/// RewritePatternSet API
1017//===----------------------------------------------------------------------===//
1018
1019MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context) {
1020 return wrap(new mlir::RewritePatternSet(unwrap(context)));
1021}
1022
1023MlirContext mlirRewritePatternSetGetContext(MlirRewritePatternSet set) {
1024 return wrap(unwrap(set)->getContext());
1025}
1026
1027void mlirRewritePatternSetDestroy(MlirRewritePatternSet set) {
1028 delete unwrap(set);
1029}
1030
1031void mlirRewritePatternSetAdd(MlirRewritePatternSet set,
1032 MlirRewritePattern pattern) {
1033 std::unique_ptr<mlir::RewritePattern> patternPtr(
1034 const_cast<mlir::RewritePattern *>(unwrap(pattern)));
1035 pattern.ptr = nullptr;
1036 unwrap(set)->add(std::move(patternPtr));
1037}
1038
1039//===----------------------------------------------------------------------===//
1040/// PDLPatternModule API
1041//===----------------------------------------------------------------------===//
1042
1043#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
1044MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
1045 return wrap(new mlir::PDLPatternModule(
1047}
1048
1049void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
1050 delete unwrap(op);
1051 op.ptr = nullptr;
1052}
1053
1054MlirRewritePatternSet
1055mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
1056 auto *m = new mlir::RewritePatternSet(std::move(*unwrap(op)));
1057 op.ptr = nullptr;
1058 return wrap(m);
1059}
1060
1061MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
1062 return wrap(unwrap(value)->dyn_cast<mlir::Value>());
1063}
1064
1065MlirType mlirPDLValueAsType(MlirPDLValue value) {
1066 return wrap(unwrap(value)->dyn_cast<mlir::Type>());
1067}
1068
1069MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
1070 return wrap(unwrap(value)->dyn_cast<mlir::Operation *>());
1071}
1072
1073MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
1074 return wrap(unwrap(value)->dyn_cast<mlir::Attribute>());
1075}
1076
1077void mlirPDLResultListPushBackValue(MlirPDLResultList results,
1078 MlirValue value) {
1079 unwrap(results)->push_back(unwrap(value));
1080}
1081
1082void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
1083 unwrap(results)->push_back(unwrap(value));
1084}
1085
1086void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
1087 MlirOperation value) {
1088 unwrap(results)->push_back(unwrap(value));
1089}
1090
1091void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
1092 MlirAttribute value) {
1093 unwrap(results)->push_back(unwrap(value));
1094}
1095
1096inline std::vector<MlirPDLValue> wrap(ArrayRef<PDLValue> values) {
1097 std::vector<MlirPDLValue> mlirValues;
1098 mlirValues.reserve(values.size());
1099 for (auto &value : values) {
1100 mlirValues.push_back(wrap(&value));
1101 }
1102 return mlirValues;
1103}
1104
1105void mlirPDLPatternModuleRegisterRewriteFunction(
1106 MlirPDLPatternModule pdlModule, MlirStringRef name,
1107 MlirPDLRewriteFunction rewriteFn, void *userData) {
1108 unwrap(pdlModule)->registerRewriteFunction(
1109 unwrap(name),
1110 [userData, rewriteFn](PatternRewriter &rewriter, PDLResultList &results,
1111 ArrayRef<PDLValue> values) -> LogicalResult {
1112 std::vector<MlirPDLValue> mlirValues = wrap(values);
1113 return unwrap(rewriteFn(wrap(&rewriter), wrap(&results),
1114 mlirValues.size(), mlirValues.data(),
1115 userData));
1116 });
1117}
1118
1119void mlirPDLPatternModuleRegisterConstraintFunction(
1120 MlirPDLPatternModule pdlModule, MlirStringRef name,
1121 MlirPDLConstraintFunction constraintFn, void *userData) {
1122 unwrap(pdlModule)->registerConstraintFunction(
1123 unwrap(name),
1124 [userData, constraintFn](PatternRewriter &rewriter,
1125 PDLResultList &results,
1126 ArrayRef<PDLValue> values) -> LogicalResult {
1127 std::vector<MlirPDLValue> mlirValues = wrap(values);
1128 return unwrap(constraintFn(wrap(&rewriter), wrap(&results),
1129 mlirValues.size(), mlirValues.data(),
1130 userData));
1131 });
1132}
1133#endif // MLIR_ENABLE_PDL_IN_PATTERNMATCH
return success()
void mlirGreedyRewriteDriverConfigSetMaxNumRewrites(MlirGreedyRewriteDriverConfig config, int64_t maxNumRewrites)
Sets the maximum number of rewrites within an iteration.
Definition Rewrite.cpp:362
void mlirRewriterBaseReplaceOpUsesWithinBlock(MlirRewriterBase rewriter, MlirOperation op, intptr_t nNewValues, MlirValue const *newValues, MlirBlock block)
Find uses of from within block and replace them with to.
Definition Rewrite.cpp:273
void mlirTypeConverterConversionResultsAppend(MlirTypeConverterConversionResults results, MlirType type)
Append a converted result type to the given 1:N conversion result accumulator.
Definition Rewrite.cpp:731
MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context)
RewritePatternSet API.
Definition Rewrite.cpp:1019
void mlirConversionTargetMarkOpRecursivelyLegal(MlirConversionTarget target, MlirStringRef opName, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Mark the given operation as recursively legal.
Definition Rewrite.cpp:674
void mlirRewriterBaseMergeBlocks(MlirRewriterBase rewriter, MlirBlock source, MlirBlock dest, intptr_t nArgValues, MlirValue const *argValues)
Inline the operations of block 'source' into the end of block 'dest'.
Definition Rewrite.cpp:204
void mlirIRRewriterDestroy(MlirRewriterBase rewriter)
Takes an IRRewriter owned by the caller and destroys it.
Definition Rewrite.cpp:303
void mlirRewriterBaseStartOpModification(MlirRewriterBase rewriter, MlirOperation op)
This method is used to notify the rewriter that an in-place operation modification is about to happen...
Definition Rewrite.cpp:227
MlirOperation mlirRewriterBaseInsert(MlirRewriterBase rewriter, MlirOperation op)
Insert the given operation at the current insertion point and return it.
Definition Rewrite.cpp:133
MlirRewriterBase mlirIRRewriterCreate(MlirContext context)
IRRewriter API.
Definition Rewrite.cpp:295
bool mlirConversionConfigIsBuildMaterializationsEnabled(MlirConversionConfig config)
Check if building materializations during conversion is enabled.
Definition Rewrite.cpp:555
void mlirTypeConverterAddSourceMaterialization(MlirTypeConverter typeConverter, MlirTypeConverterSourceMaterializationCallback callback, void *userData)
Register a source materialization with the given TypeConverter.
Definition Rewrite.cpp:847
void mlirRewriterBaseMoveOpAfter(MlirRewriterBase rewriter, MlirOperation op, MlirOperation existingOp)
Unlink this operation from its current block and insert it right after existingOp which may be in the...
Definition Rewrite.cpp:217
MlirLogicalResult mlirConversionPatternRewriterConvertRegionTypes(MlirConversionPatternRewriter rewriter, MlirRegion region, MlirTypeConverter typeConverter)
Apply a signature conversion to each block in the given region.
Definition Rewrite.cpp:577
void mlirRewriterBaseCloneRegionBefore(MlirRewriterBase rewriter, MlirRegion region, MlirBlock before)
Clone the blocks that belong to "region" before the given position in another region "parent".
Definition Rewrite.cpp:156
MlirOperation mlirRewriterBaseCloneWithMapping(MlirRewriterBase rewriter, MlirOperation op, MlirIRMapping mapping)
Clones the given operation using the rewriter and the provided IRMapping.
Definition Rewrite.cpp:150
MlirTypeConverter mlirTypeConverterCreate()
TypeConverter API.
Definition Rewrite.cpp:697
void mlirRewriterBaseSetInsertionPointAfter(MlirRewriterBase rewriter, MlirOperation op)
Sets the insertion point to the node after the specified operation, which will cause subsequent inser...
Definition Rewrite.cpp:51
void mlirConversionPatternRewriterReplaceOpWithMultiple(MlirConversionPatternRewriter rewriter, MlirOperation op, intptr_t nRanges, intptr_t *rangeSizes, MlirValue *values)
Replace the given operation with multiple value ranges – one range per result of op – and erase it.
Definition Rewrite.cpp:584
int64_t mlirGreedyRewriteDriverConfigGetMaxNumRewrites(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of rewrites within an iteration.
Definition Rewrite.cpp:422
void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set)
Destroy the given MlirFrozenRewritePatternSet.
Definition Rewrite.cpp:330
void mlirConversionTargetAddLegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as legal.
Definition Rewrite.cpp:613
void mlirRewriterBaseReplaceAllOpUsesWithOperation(MlirRewriterBase rewriter, MlirOperation from, MlirOperation to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:267
void mlirTypeConverterAdd1ToNTargetMaterialization(MlirTypeConverter typeConverter, MlirTypeConverter1ToNTargetMaterializationCallback callback, void *userData)
Register a 1:N target materialization with the given TypeConverter.
Definition Rewrite.cpp:865
void mlirRewriterBaseMoveBlockBefore(MlirRewriterBase rewriter, MlirBlock block, MlirBlock existingBlock)
Unlink this block and insert it right before existingBlock.
Definition Rewrite.cpp:222
void mlirRewriterBaseReplaceAllValueRangeUsesWith(MlirRewriterBase rewriter, intptr_t nValues, MlirValue const *from, MlirValue const *to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:247
void mlirTypeConverterAddTargetMaterialization(MlirTypeConverter typeConverter, MlirTypeConverterTargetMaterializationCallback callback, void *userData)
Register a target materialization with the given TypeConverter.
Definition Rewrite.cpp:856
void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block)
Erases a block along with all operations inside it.
Definition Rewrite.cpp:189
void mlirRewriterBaseReplaceAllUsesExcept(MlirRewriterBase rewriter, MlirValue from, MlirValue to, MlirOperation exceptedUser)
Find uses of from and replace them with to except if the user is exceptedUser.
Definition Rewrite.cpp:284
MlirLogicalResult mlirApplyPatternsAndFoldGreedilyWithOp(MlirOperation op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:481
void mlirGreedyRewriteDriverConfigDestroy(MlirGreedyRewriteDriverConfig config)
Destroys a greedy rewrite driver configuration.
Definition Rewrite.cpp:352
mlir::GreedyRewriteConfig * unwrap(MlirGreedyRewriteDriverConfig config)
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:339
MlirBlock mlirRewriterBaseCreateBlockBefore(MlirRewriterBase rewriter, MlirBlock insertBefore, intptr_t nArgTypes, MlirType const *argTypes, MlirLocation const *locations)
Block and operation creation/insertion/cloning.
Definition Rewrite.cpp:120
MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate()
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:348
bool mlirGreedyRewriteDriverConfigGetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config)
Gets whether top-down traversal is used for initial worklist population.
Definition Rewrite.cpp:427
void mlirConversionTargetAddDynamicallyLegalDialect(MlirConversionTarget target, MlirStringRef dialectName, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Register the given dialect as dynamically legal, with a callback to determine per-instance legality f...
Definition Rewrite.cpp:666
MlirTypeConverter mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern)
Get the type converter used by this conversion pattern.
Definition Rewrite.cpp:955
void mlirRewriterBaseSetInsertionPointToStart(MlirRewriterBase rewriter, MlirBlock block)
Sets the insertion point to the start of the specified block.
Definition Rewrite.cpp:61
MlirRewriterBase mlirPatternRewriterAsBase(MlirPatternRewriter rewriter)
PatternRewriter API.
Definition Rewrite.cpp:564
MlirRewritePattern mlirOpRewritePatternCreate(MlirStringRef rootName, unsigned benefit, MlirContext context, MlirRewritePatternCallbacks callbacks, void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames)
Create a rewrite pattern that matches the operation with the given rootName, corresponding to mlir::O...
Definition Rewrite.cpp:1001
void mlirConversionConfigSetFoldingMode(MlirConversionConfig config, MlirDialectConversionFoldingMode mode)
Set the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:521
void mlirConversionTargetAddIllegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as illegal.
Definition Rewrite.cpp:619
void mlirGreedyRewriteDriverConfigSetStrictness(MlirGreedyRewriteDriverConfig config, MlirGreedyRewriteStrictness strictness)
Sets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:377
MlirGreedyRewriteStrictness mlirGreedyRewriteDriverConfigGetStrictness(MlirGreedyRewriteDriverConfig config)
Gets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:437
MlirConversionConfig mlirConversionConfigCreate(void)
ConversionConfig API.
Definition Rewrite.cpp:513
MlirContext mlirRewritePatternSetGetContext(MlirRewritePatternSet set)
Get the context associated with a MlirRewritePatternSet.
Definition Rewrite.cpp:1023
MlirContext mlirRewriterBaseGetContext(MlirRewriterBase rewriter)
RewriterBase API inherited from OpBuilder.
Definition Rewrite.cpp:34
void mlirRewriterBaseReplaceAllOpUsesWithValueRange(MlirRewriterBase rewriter, MlirOperation from, intptr_t nTo, MlirValue const *to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:258
MlirLogicalResult mlirApplyFullConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a full conversion on the given operation.
Definition Rewrite.cpp:501
void mlirConversionConfigDestroy(MlirConversionConfig config)
Destroy the given ConversionConfig.
Definition Rewrite.cpp:517
MlirOperation mlirRewriterBaseClone(MlirRewriterBase rewriter, MlirOperation op)
Creates a deep copy of the specified operation.
Definition Rewrite.cpp:140
void mlirRewriterBaseInlineBlockBefore(MlirRewriterBase rewriter, MlirBlock source, MlirOperation op, intptr_t nArgValues, MlirValue const *argValues)
Inline the operations of block 'source' before the operation 'op'.
Definition Rewrite.cpp:193
void mlirRewriterBaseReplaceOpWithValues(MlirRewriterBase rewriter, MlirOperation op, intptr_t nValues, MlirValue const *values)
Replace the results of the given (original) operation with the specified list of values (replacements...
Definition Rewrite.cpp:171
void mlirRewriterBaseCancelOpModification(MlirRewriterBase rewriter, MlirOperation op)
This method cancels a pending in-place modification.
Definition Rewrite.cpp:237
void mlirRewriterBaseSetInsertionPointAfterValue(MlirRewriterBase rewriter, MlirValue value)
Sets the insertion point to the node after the specified value.
Definition Rewrite.cpp:56
void mlirRewriterBaseSetInsertionPointToEnd(MlirRewriterBase rewriter, MlirBlock block)
Sets the insertion point to the end of the specified block.
Definition Rewrite.cpp:66
MlirOperation mlirRewriterBaseCloneWithoutRegions(MlirRewriterBase rewriter, MlirOperation op)
Creates a deep copy of this operation but keep the operation regions empty.
Definition Rewrite.cpp:145
MlirConversionPattern mlirOpConversionPatternCreate(MlirStringRef rootName, unsigned benefit, MlirContext context, MlirTypeConverter typeConverter, MlirConversionPatternCallbacks callbacks, void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames)
Create a conversion pattern that matches the operation with the given rootName, corresponding to mlir...
Definition Rewrite.cpp:941
MlirConversionTarget mlirConversionTargetCreate(MlirContext context)
ConversionTarget API.
Definition Rewrite.cpp:605
void mlirConversionTargetMarkUnknownOpDynamicallyLegal(MlirConversionTarget target, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Mark unknown operations as dynamically legal, with a callback.
Definition Rewrite.cpp:685
void mlirTypeConverterAdd1ToNConversion(MlirTypeConverter typeConverter, MlirTypeConverter1ToNConversionCallback convertType, void *userData)
Add a 1:N type conversion function to the given TypeConverter.
Definition Rewrite.cpp:736
MlirRewriterBaseInsertPoint mlirRewriterBaseSaveInsertionPoint(MlirRewriterBase rewriter)
Returns the current insertion point of the rewriter so that it can be restored later with mlirRewrite...
Definition Rewrite.cpp:91
void mlirRewritePatternSetDestroy(MlirRewritePatternSet set)
Destruct the given MlirRewritePatternSet.
Definition Rewrite.cpp:1027
MlirBlock mlirRewriterBaseGetBlock(MlirRewriterBase rewriter)
Returns the current block of the rewriter.
Definition Rewrite.cpp:75
MlirOperation mlirRewriterBaseGetOperationAfterInsertion(MlirRewriterBase rewriter)
Returns the operation right after the current insertion point of the rewriter.
Definition Rewrite.cpp:80
void mlirRewriterBaseClearInsertionPoint(MlirRewriterBase rewriter)
Insertion points methods.
Definition Rewrite.cpp:42
void mlirTypeConverterDestroy(MlirTypeConverter typeConverter)
Destroy the given TypeConverter.
Definition Rewrite.cpp:701
void mlirConversionTargetAddLegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as legal.
Definition Rewrite.cpp:625
MlirLogicalResult mlirApplyPatternsAndFoldGreedily(MlirModule op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:473
MlirFrozenRewritePatternSet mlirFreezeRewritePattern(MlirRewritePatternSet set)
RewritePatternSet and FrozenRewritePatternSet API.
Definition Rewrite.cpp:324
bool mlirGreedyRewriteDriverConfigIsFoldingEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether folding is enabled during greedy rewriting.
Definition Rewrite.cpp:432
bool mlirGreedyRewriteDriverConfigIsConstantCSEEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether constant CSE is enabled.
Definition Rewrite.cpp:467
void mlirConversionConfigEnableBuildMaterializations(MlirConversionConfig config, bool enable)
Enable or disable building materializations during conversion.
Definition Rewrite.cpp:550
void mlirConversionTargetDestroy(MlirConversionTarget target)
Destroy the given ConversionTarget.
Definition Rewrite.cpp:609
MlirLogicalResult mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a partial conversion on the given operation.
Definition Rewrite.cpp:494
void mlirRewriterBaseInlineRegionBefore(MlirRewriterBase rewriter, MlirRegion region, MlirBlock before)
RewriterBase API.
Definition Rewrite.cpp:166
int64_t mlirGreedyRewriteDriverConfigGetMaxIterations(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of iterations for the greedy rewrite driver.
Definition Rewrite.cpp:417
MlirDialectConversionFoldingMode mlirConversionConfigGetFoldingMode(MlirConversionConfig config)
Get the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:539
void mlirRewriterBaseReplaceOpWithOperation(MlirRewriterBase rewriter, MlirOperation op, MlirOperation newOp)
Replace the results of the given (original) operation with the specified new op (replacement).
Definition Rewrite.cpp:179
void mlirRewriterBaseReplaceAllUsesWith(MlirRewriterBase rewriter, MlirValue from, MlirValue to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:242
void mlirRewriterBaseFinalizeOpModification(MlirRewriterBase rewriter, MlirOperation op)
This method is used to signal the end of an in-place modification of the given operation.
Definition Rewrite.cpp:232
void mlirRewriterBaseRestoreInsertionPoint(MlirRewriterBase rewriter, MlirRewriterBaseInsertPoint insertPoint)
Restores a previously saved insertion point.
Definition Rewrite.cpp:102
void mlirRewritePatternSetAdd(MlirRewritePatternSet set, MlirRewritePattern pattern)
Add the given MlirRewritePattern into a MlirRewritePatternSet.
Definition Rewrite.cpp:1031
MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter, MlirType type)
Convert the given type using the given TypeConverter.
Definition Rewrite.cpp:767
MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config)
Definition Rewrite.cpp:344
void mlirGreedyRewriteDriverConfigSetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal)
Sets whether to use top-down traversal for the initial population of the worklist.
Definition Rewrite.cpp:367
void mlirWalkAndApplyPatterns(MlirOperation op, MlirFrozenRewritePatternSet patterns)
Applies the given patterns to the given op by a fast walk-based pattern rewrite driver.
Definition Rewrite.cpp:488
MlirRewriterBase mlirIRRewriterCreateFromOp(MlirOperation op)
Create an IRRewriter and transfer ownership to the caller.
Definition Rewrite.cpp:299
void mlirGreedyRewriteDriverConfigEnableConstantCSE(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables constant CSE.
Definition Rewrite.cpp:412
MlirGreedySimplifyRegionLevel mlirGreedyRewriteDriverConfigGetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config)
Gets the region simplification level.
Definition Rewrite.cpp:452
void mlirConversionTargetAddIllegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as illegal.
Definition Rewrite.cpp:630
MlirRewritePattern mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern)
Cast the ConversionPattern to a RewritePattern.
Definition Rewrite.cpp:960
MlirOperation mlirDialectMaterializeConstant(MlirDialect dialect, MlirRewriterBase rewriter, MlirAttribute value, MlirType type, MlirLocation loc)
Dialect constant materialization API.
Definition Rewrite.cpp:311
void mlirGreedyRewriteDriverConfigSetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config, MlirGreedySimplifyRegionLevel level)
Sets the region simplification level.
Definition Rewrite.cpp:395
void mlirRewriterBaseMoveOpBefore(MlirRewriterBase rewriter, MlirOperation op, MlirOperation existingOp)
Unlink this operation from its current block and insert it right before existingOp which may be in th...
Definition Rewrite.cpp:212
MlirPatternRewriter mlirConversionPatternRewriterAsPatternRewriter(MlirConversionPatternRewriter rewriter)
ConversionPatternRewriter API.
Definition Rewrite.cpp:572
void mlirGreedyRewriteDriverConfigEnableFolding(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables folding during greedy rewriting.
Definition Rewrite.cpp:372
void mlirTypeConverterAddConversion(MlirTypeConverter typeConverter, MlirTypeConverterConversionCallback convertType, void *userData)
Add a type conversion function to the given TypeConverter.
Definition Rewrite.cpp:705
void mlirRewriterBaseSetInsertionPointBefore(MlirRewriterBase rewriter, MlirOperation op)
Sets the insertion point to the specified operation, which will cause subsequent insertions to go rig...
Definition Rewrite.cpp:46
MlirBlock mlirRewriterBaseGetInsertionBlock(MlirRewriterBase rewriter)
Return the block the current insertion point belongs to.
Definition Rewrite.cpp:71
void mlirGreedyRewriteDriverConfigSetMaxIterations(MlirGreedyRewriteDriverConfig config, int64_t maxIterations)
Sets the maximum number of iterations for the greedy rewrite driver.
Definition Rewrite.cpp:357
void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op)
Erases an operation that is known to have no uses.
Definition Rewrite.cpp:185
void mlirConversionTargetAddDynamicallyLegalOp(MlirConversionTarget target, MlirStringRef opName, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Register the given operation as dynamically legal, with a callback to determine per-instance legality...
Definition Rewrite.cpp:656
static Operation * materializeConstant(Dialect *dialect, OpBuilder &builder, Attribute value, Type type, Location loc)
A utility function used to materialize a constant for a given attribute and type.
Definition FoldUtils.cpp:51
b getContext())
memberIdxs push_back(ArrayAttr::get(parser.getContext(), values))
llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
Definition Wrap.h:40
Block represents an ordered list of Operations.
Definition Block.h:34
OpListType::iterator iterator
Definition Block.h:165
iterator end()
Definition Block.h:169
LogicalResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const override
Definition Rewrite.cpp:901
LogicalResult matchAndRewrite(Operation *op, ArrayRef< ValueRange > operands, ConversionPatternRewriter &rewriter) const override
Definition Rewrite.cpp:913
ExternalConversionPattern(MlirConversionPatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, TypeConverter *typeConverter, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:883
ExternalRewritePattern(MlirRewritePatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:972
LogicalResult matchAndRewrite(Operation *op, PatternRewriter &rewriter) const override
Attempt to match against code rooted at the specified operation, which is the same operation code as ...
Definition Rewrite.cpp:987
This class represents a frozen set of patterns that can be processed by a pattern applicator.
This class allows control over how the GreedyPatternRewriteDriver works.
bool isFoldingEnabled() const
Whether this should fold while greedily rewriting.
GreedyRewriteConfig & setRegionSimplificationLevel(GreedySimplifyRegionLevel level)
bool isConstantCSEEnabled() const
If set to "true", constants are CSE'd (even across multiple regions that are in a parent-ancestor rel...
GreedyRewriteConfig & enableConstantCSE(bool enable=true)
GreedyRewriteStrictness getStrictness() const
Strict mode can restrict the ops that are added to the worklist during the rewrite.
bool getUseTopDownTraversal() const
This specifies the order of initial traversal that populates the rewriters worklist.
GreedyRewriteConfig & enableFolding(bool enable=true)
int64_t getMaxNumRewrites() const
This specifies the maximum number of rewrites within an iteration.
GreedyRewriteConfig & setMaxIterations(int64_t iterations)
GreedyRewriteConfig & setMaxNumRewrites(int64_t limit)
int64_t getMaxIterations() const
This specifies the maximum number of times the rewriter will iterate between applying patterns and si...
GreedyRewriteConfig & setUseTopDownTraversal(bool use=true)
GreedySimplifyRegionLevel getRegionSimplificationLevel() const
Perform control flow optimizations to the region tree after applying all patterns.
GreedyRewriteConfig & setStrictness(GreedyRewriteStrictness mode)
This class coordinates rewriting a piece of IR outside of a pattern rewrite, providing a way to keep ...
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition Location.h:76
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:64
This class represents a saved insertion point.
Definition Builders.h:330
Block::iterator getPoint() const
Definition Builders.h:343
bool isSet() const
Returns true if this insert point is set.
Definition Builders.h:340
Block * getBlock() const
Definition Builders.h:342
This class helps build Operations.
Definition Builders.h:210
Block::iterator getInsertionPoint() const
Returns the current insertion point of the builder.
Definition Builders.h:448
Block * getInsertionBlock() const
Return the block the current insertion point belongs to.
Definition Builders.h:445
Operation is the basic unit of execution within MLIR.
Definition Operation.h:87
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
Definition OwningOpRef.h:29
This class represents the benefit of a pattern match in a unitless scheme that ranges from 0 (very li...
A special type of RewriterBase that coordinates the application of a rewrite pattern on the current I...
RewritePattern is the common base class for all DAG to DAG replacements.
This class coordinates the application of a rewrite on a set of IR, providing a way for clients to tr...
This class provides an abstraction over the various different ranges of value types.
Definition TypeRange.h:40
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition Types.h:74
This class provides an abstraction over the different types of ranges over Values.
Definition ValueRange.h:389
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition Value.h:96
MlirTypeConverterConversionStatus(* MlirTypeConverterConversionCallback)(MlirType type, MlirType *convertedType, void *userData)
Callback type for type conversion functions.
Definition Rewrite.h:652
MlirLogicalResult(* MlirTypeConverter1ToNTargetMaterializationCallback)(MlirRewriterBase rewriter, intptr_t nOutputTypes, MlirType *outputTypes, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, MlirType originalType, MlirValue *outputs, void *userData)
Callback type for 1:N target materializations.
Definition Rewrite.h:743
MlirDialectConversionFoldingMode
Definition Rewrite.h:489
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_AFTER_PATTERNS
Definition Rewrite.h:492
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_BEFORE_PATTERNS
Definition Rewrite.h:491
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_NEVER
Definition Rewrite.h:490
MlirValue(* MlirTypeConverterSourceMaterializationCallback)(MlirRewriterBase rewriter, MlirType outputType, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, void *userData)
Callback type for source materializations.
Definition Rewrite.h:706
MlirTypeConverterConversionStatus
Outcome of a type conversion callback.
Definition Rewrite.h:634
@ MlirTypeConverterConversionStatusFailure
The conversion failed; no further conversion function will be tried.
Definition Rewrite.h:638
@ MlirTypeConverterConversionStatusDeclined
The conversion was declined; another registered conversion function may be tried.
Definition Rewrite.h:641
@ MlirTypeConverterConversionStatusSuccess
The type was converted successfully.
Definition Rewrite.h:636
@ MLIR_CONVERSION_TARGET_LEGALITY_LEGAL
The operation instance is legal.
Definition Rewrite.h:580
@ MLIR_CONVERSION_TARGET_LEGALITY_NO_OPINION
The callback has no opinion on this instance.
Definition Rewrite.h:586
@ MLIR_CONVERSION_TARGET_LEGALITY_ILLEGAL
The operation instance is illegal.
Definition Rewrite.h:582
MlirTypeConverterConversionStatus(* MlirTypeConverter1ToNConversionCallback)(MlirType type, MlirTypeConverterConversionResults results, void *userData)
Callback type for 1:N type conversion functions.
Definition Rewrite.h:685
MlirValue(* MlirTypeConverterTargetMaterializationCallback)(MlirRewriterBase rewriter, MlirType outputType, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, MlirType originalType, void *userData)
Callback type for 1:1 target materializations.
Definition Rewrite.h:716
MlirConversionTargetLegality(* MlirConversionTargetDynamicLegalityCallback)(MlirOperation op, void *userData)
Callback for dynamic legality checks.
Definition Rewrite.h:592
MlirGreedySimplifyRegionLevel
Greedy simplify region levels.
Definition Rewrite.h:51
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_DISABLED
Disable region control-flow simplification.
Definition Rewrite.h:53
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_NORMAL
Run the normal simplification (e.g. dead args elimination).
Definition Rewrite.h:55
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_AGGRESSIVE
Run extra simplifications (e.g. block merging).
Definition Rewrite.h:57
MlirGreedyRewriteStrictness
Greedy rewrite strictness levels.
Definition Rewrite.h:41
@ MLIR_GREEDY_REWRITE_STRICTNESS_EXISTING_AND_NEW_OPS
Only pre-existing and newly created ops are processed.
Definition Rewrite.h:45
@ MLIR_GREEDY_REWRITE_STRICTNESS_EXISTING_OPS
Only pre-existing ops are processed.
Definition Rewrite.h:47
@ MLIR_GREEDY_REWRITE_STRICTNESS_ANY_OP
No restrictions wrt. which ops are processed.
Definition Rewrite.h:43
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
Definition Diagnostics.h:24
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
Definition Diagnostics.h:19
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
Definition IR.h:1021
static bool mlirLogicalResultIsFailure(MlirLogicalResult res)
Checks if the given logical result represents a failure.
Definition Support.h:132
Include the generated interface declarations.
@ Aggressive
Run extra simplificiations (e.g.
@ Normal
Run the normal simplification (e.g. dead args elimination).
@ Disabled
Disable region control-flow simplification.
LogicalResult applyPatternsGreedily(Region &region, const FrozenRewritePatternSet &patterns, GreedyRewriteConfig config=GreedyRewriteConfig(), bool *changed=nullptr)
Rewrite ops in the given region, which must be isolated from above, by repeatedly applying the highes...
Operation * cloneWithoutRegions(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
void walkAndApplyPatterns(Operation *op, const FrozenRewritePatternSet &patterns, RewriterBase::Listener *listener=nullptr)
A fast walk-based pattern rewrite driver.
GreedyRewriteStrictness
This enum controls which ops are put on the worklist during a greedy pattern rewrite.
@ ExistingOps
Only pre-existing ops are processed.
@ ExistingAndNewOps
Only pre-existing and newly created ops are processed.
@ AnyOp
No restrictions wrt. which ops are processed.
ConversionPattern API.
Definition Rewrite.h:758
A logical result value, essentially a boolean with named states.
Definition Support.h:121
RewritePattern API.
Definition Rewrite.h:807
A saved insertion point: a (block, operationAfter) pair.
Definition Rewrite.h:140
MlirOperation operationAfter
Definition Rewrite.h:142
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:78
Opaque accumulator for the result types of a 1:N type conversion.
Definition Rewrite.h:665
Eliminates variable at the specified position using Fourier-Motzkin variable elimination.