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
90//===----------------------------------------------------------------------===//
91/// Block and operation creation/insertion/cloning
92//===----------------------------------------------------------------------===//
93
95 MlirBlock insertBefore,
96 intptr_t nArgTypes,
97 MlirType const *argTypes,
98 MlirLocation const *locations) {
100 ArrayRef<Type> unwrappedArgs = unwrapList(nArgTypes, argTypes, args);
102 ArrayRef<Location> unwrappedLocs = unwrapList(nArgTypes, locations, locs);
103 return wrap(unwrap(rewriter)->createBlock(unwrap(insertBefore), unwrappedArgs,
104 unwrappedLocs));
105}
106
108 MlirOperation op) {
109 return wrap(unwrap(rewriter)->insert(unwrap(op)));
110}
111
112// Other methods of OpBuilder
113
115 MlirOperation op) {
116 return wrap(unwrap(rewriter)->clone(*unwrap(op)));
117}
118
120 MlirOperation op) {
121 return wrap(unwrap(rewriter)->cloneWithoutRegions(*unwrap(op)));
122}
123
125 MlirOperation op,
126 MlirIRMapping mapping) {
127 return wrap(unwrap(rewriter)->clone(*unwrap(op), *unwrap(mapping)));
128}
129
131 MlirRegion region, MlirBlock before) {
132
133 unwrap(rewriter)->cloneRegionBefore(*unwrap(region), unwrap(before));
134}
135
136//===----------------------------------------------------------------------===//
137/// RewriterBase API
138//===----------------------------------------------------------------------===//
139
141 MlirRegion region, MlirBlock before) {
142 unwrap(rewriter)->inlineRegionBefore(*unwrap(region), unwrap(before));
143}
144
146 MlirOperation op, intptr_t nValues,
147 MlirValue const *values) {
149 ArrayRef<Value> unwrappedVals = unwrapList(nValues, values, vals);
150 unwrap(rewriter)->replaceOp(unwrap(op), unwrappedVals);
151}
152
154 MlirOperation op,
155 MlirOperation newOp) {
156 unwrap(rewriter)->replaceOp(unwrap(op), unwrap(newOp));
157}
158
159void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op) {
160 unwrap(rewriter)->eraseOp(unwrap(op));
161}
162
163void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block) {
164 unwrap(rewriter)->eraseBlock(unwrap(block));
165}
166
168 MlirBlock source, MlirOperation op,
169 intptr_t nArgValues,
170 MlirValue const *argValues) {
172 ArrayRef<Value> unwrappedVals = unwrapList(nArgValues, argValues, vals);
173
174 unwrap(rewriter)->inlineBlockBefore(unwrap(source), unwrap(op),
175 unwrappedVals);
176}
177
178void mlirRewriterBaseMergeBlocks(MlirRewriterBase rewriter, MlirBlock source,
179 MlirBlock dest, intptr_t nArgValues,
180 MlirValue const *argValues) {
182 ArrayRef<Value> unwrappedArgs = unwrapList(nArgValues, argValues, args);
183 unwrap(rewriter)->mergeBlocks(unwrap(source), unwrap(dest), unwrappedArgs);
184}
185
186void mlirRewriterBaseMoveOpBefore(MlirRewriterBase rewriter, MlirOperation op,
187 MlirOperation existingOp) {
188 unwrap(rewriter)->moveOpBefore(unwrap(op), unwrap(existingOp));
189}
190
191void mlirRewriterBaseMoveOpAfter(MlirRewriterBase rewriter, MlirOperation op,
192 MlirOperation existingOp) {
193 unwrap(rewriter)->moveOpAfter(unwrap(op), unwrap(existingOp));
194}
195
197 MlirBlock existingBlock) {
198 unwrap(rewriter)->moveBlockBefore(unwrap(block), unwrap(existingBlock));
199}
200
202 MlirOperation op) {
203 unwrap(rewriter)->startOpModification(unwrap(op));
204}
205
207 MlirOperation op) {
208 unwrap(rewriter)->finalizeOpModification(unwrap(op));
209}
210
212 MlirOperation op) {
213 unwrap(rewriter)->cancelOpModification(unwrap(op));
214}
215
217 MlirValue from, MlirValue to) {
218 unwrap(rewriter)->replaceAllUsesWith(unwrap(from), unwrap(to));
219}
220
222 intptr_t nValues,
223 MlirValue const *from,
224 MlirValue const *to) {
225 SmallVector<Value, 4> fromVals;
226 ArrayRef<Value> unwrappedFromVals = unwrapList(nValues, from, fromVals);
228 ArrayRef<Value> unwrappedToVals = unwrapList(nValues, to, toVals);
229 unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
230}
231
233 MlirOperation from,
234 intptr_t nTo,
235 MlirValue const *to) {
237 ArrayRef<Value> unwrappedToVals = unwrapList(nTo, to, toVals);
238 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrappedToVals);
239}
240
242 MlirOperation from,
243 MlirOperation to) {
244 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrap(to));
245}
246
248 MlirOperation op,
249 intptr_t nNewValues,
250 MlirValue const *newValues,
251 MlirBlock block) {
253 ArrayRef<Value> unwrappedVals = unwrapList(nNewValues, newValues, vals);
254 unwrap(rewriter)->replaceOpUsesWithinBlock(unwrap(op), unwrappedVals,
255 unwrap(block));
256}
257
259 MlirValue from, MlirValue to,
260 MlirOperation exceptedUser) {
261 unwrap(rewriter)->replaceAllUsesExcept(unwrap(from), unwrap(to),
262 unwrap(exceptedUser));
263}
264
265//===----------------------------------------------------------------------===//
266/// IRRewriter API
267//===----------------------------------------------------------------------===//
268
270 return wrap(new IRRewriter(unwrap(context)));
271}
272
274 return wrap(new IRRewriter(unwrap(op)));
275}
276
278 delete static_cast<IRRewriter *>(unwrap(rewriter));
279}
280
281//===----------------------------------------------------------------------===//
282/// RewritePatternSet and FrozenRewritePatternSet API
283//===----------------------------------------------------------------------===//
284
285MlirFrozenRewritePatternSet
286mlirFreezeRewritePattern(MlirRewritePatternSet set) {
287 auto *m = new mlir::FrozenRewritePatternSet(std::move(*unwrap(set)));
288 set.ptr = nullptr;
289 return wrap(m);
290}
291
292void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set) {
293 delete unwrap(set);
294 set.ptr = nullptr;
295}
296
297//===----------------------------------------------------------------------===//
298/// GreedyRewriteDriverConfig API
299//===----------------------------------------------------------------------===//
300
301inline mlir::GreedyRewriteConfig *unwrap(MlirGreedyRewriteDriverConfig config) {
302 assert(config.ptr && "unexpected null config");
303 return static_cast<mlir::GreedyRewriteConfig *>(config.ptr);
304}
305
306inline MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config) {
307 return {config};
308}
309
310MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate() {
311 return wrap(new mlir::GreedyRewriteConfig());
312}
313
315 MlirGreedyRewriteDriverConfig config) {
316 delete unwrap(config);
317}
318
320 MlirGreedyRewriteDriverConfig config, int64_t maxIterations) {
321 unwrap(config)->setMaxIterations(maxIterations);
322}
323
325 MlirGreedyRewriteDriverConfig config, int64_t maxNumRewrites) {
326 unwrap(config)->setMaxNumRewrites(maxNumRewrites);
327}
328
330 MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal) {
331 unwrap(config)->setUseTopDownTraversal(useTopDownTraversal);
332}
333
335 MlirGreedyRewriteDriverConfig config, bool enable) {
336 unwrap(config)->enableFolding(enable);
337}
338
340 MlirGreedyRewriteDriverConfig config,
341 MlirGreedyRewriteStrictness strictness) {
342 mlir::GreedyRewriteStrictness cppStrictness;
343 switch (strictness) {
346 break;
349 break;
352 break;
353 }
354 unwrap(config)->setStrictness(cppStrictness);
355}
356
373
375 MlirGreedyRewriteDriverConfig config, bool enable) {
376 unwrap(config)->enableConstantCSE(enable);
377}
378
380 MlirGreedyRewriteDriverConfig config) {
381 return unwrap(config)->getMaxIterations();
382}
383
385 MlirGreedyRewriteDriverConfig config) {
386 return unwrap(config)->getMaxNumRewrites();
387}
388
390 MlirGreedyRewriteDriverConfig config) {
391 return unwrap(config)->getUseTopDownTraversal();
392}
393
395 MlirGreedyRewriteDriverConfig config) {
396 return unwrap(config)->isFoldingEnabled();
397}
398
412
428
430 MlirGreedyRewriteDriverConfig config) {
431 return unwrap(config)->isConstantCSEEnabled();
432}
433
436 MlirFrozenRewritePatternSet patterns,
437 MlirGreedyRewriteDriverConfig config) {
438 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
439 *unwrap(config)));
440}
441
444 MlirFrozenRewritePatternSet patterns,
445 MlirGreedyRewriteDriverConfig config) {
446 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
447 *unwrap(config)));
448}
449
450void mlirWalkAndApplyPatterns(MlirOperation op,
451 MlirFrozenRewritePatternSet patterns) {
453}
454
456mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target,
457 MlirFrozenRewritePatternSet patterns,
458 MlirConversionConfig config) {
459 return wrap(mlir::applyPartialConversion(unwrap(op), *unwrap(target),
460 *unwrap(patterns), *unwrap(config)));
461}
462
464 MlirConversionTarget target,
465 MlirFrozenRewritePatternSet patterns,
466 MlirConversionConfig config) {
467 return wrap(mlir::applyFullConversion(unwrap(op), *unwrap(target),
468 *unwrap(patterns), *unwrap(config)));
469}
470
471//===----------------------------------------------------------------------===//
472/// ConversionConfig API
473//===----------------------------------------------------------------------===//
474
475MlirConversionConfig mlirConversionConfigCreate(void) {
476 return wrap(new mlir::ConversionConfig());
477}
478
479void mlirConversionConfigDestroy(MlirConversionConfig config) {
480 delete unwrap(config);
481}
482
483void mlirConversionConfigSetFoldingMode(MlirConversionConfig config,
485 mlir::DialectConversionFoldingMode cppMode;
486 switch (mode) {
488 cppMode = mlir::DialectConversionFoldingMode::Never;
489 break;
491 cppMode = mlir::DialectConversionFoldingMode::BeforePatterns;
492 break;
494 cppMode = mlir::DialectConversionFoldingMode::AfterPatterns;
495 break;
496 }
497 unwrap(config)->foldingMode = cppMode;
498}
499
501mlirConversionConfigGetFoldingMode(MlirConversionConfig config) {
502 switch (unwrap(config)->foldingMode) {
503 case mlir::DialectConversionFoldingMode::Never:
505 case mlir::DialectConversionFoldingMode::BeforePatterns:
507 case mlir::DialectConversionFoldingMode::AfterPatterns:
509 }
510}
511
513 MlirConversionConfig config, bool enable) {
514 unwrap(config)->buildMaterializations = enable;
515}
516
518 MlirConversionConfig config) {
519 return unwrap(config)->buildMaterializations;
520}
521
522//===----------------------------------------------------------------------===//
523/// PatternRewriter API
524//===----------------------------------------------------------------------===//
525
526MlirRewriterBase mlirPatternRewriterAsBase(MlirPatternRewriter rewriter) {
527 return wrap(static_cast<mlir::RewriterBase *>(unwrap(rewriter)));
528}
529
530//===----------------------------------------------------------------------===//
531/// ConversionPatternRewriter API
532//===----------------------------------------------------------------------===//
533
535 MlirConversionPatternRewriter rewriter) {
536 return wrap(static_cast<mlir::PatternRewriter *>(unwrap(rewriter)));
537}
538
540 MlirConversionPatternRewriter rewriter, MlirRegion region,
541 MlirTypeConverter typeConverter) {
542 return wrap(unwrap(rewriter)->convertRegionTypes(unwrap(region),
543 *unwrap(typeConverter)));
544}
545
546//===----------------------------------------------------------------------===//
547/// ConversionTarget API
548//===----------------------------------------------------------------------===//
549
550MlirConversionTarget mlirConversionTargetCreate(MlirContext context) {
551 return wrap(new mlir::ConversionTarget(*unwrap(context)));
552}
553
554void mlirConversionTargetDestroy(MlirConversionTarget target) {
555 delete unwrap(target);
556}
557
558void mlirConversionTargetAddLegalOp(MlirConversionTarget target,
559 MlirStringRef opName) {
560 unwrap(target)->addLegalOp(
562}
563
564void mlirConversionTargetAddIllegalOp(MlirConversionTarget target,
565 MlirStringRef opName) {
566 unwrap(target)->addIllegalOp(
568}
569
571 MlirStringRef dialectName) {
572 unwrap(target)->addLegalDialect(unwrap(dialectName));
573}
574
576 MlirStringRef dialectName) {
577 unwrap(target)->addIllegalDialect(unwrap(dialectName));
578}
579
580namespace {
581/// Wraps a C dynamic-legality callback as a C++ DynamicLegalityCallbackFn,
582/// translating the tri-state MlirConversionTargetLegality result into the
583/// std::optional<bool> expected by ConversionTarget (NO_OPINION -> nullopt).
584ConversionTarget::DynamicLegalityCallbackFn
585wrapLegalityCallback(MlirConversionTargetDynamicLegalityCallback callback,
586 void *userData) {
587 return [callback, userData](Operation *op) -> std::optional<bool> {
588 switch (callback(wrap(op), userData)) {
590 return true;
592 return false;
594 return std::nullopt;
595 }
596 llvm_unreachable("unknown MlirConversionTargetLegality");
597 };
598}
599} // namespace
600
602 MlirConversionTarget target, MlirStringRef opName,
603 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
604 assert(callback && "expected non-null legality callback");
605 MLIRContext *ctx = &unwrap(target)->getContext();
606 OperationName name(unwrap(opName), ctx);
607 unwrap(target)->addDynamicallyLegalOp(
608 name, wrapLegalityCallback(callback, userData));
609}
610
612 MlirConversionTarget target, MlirStringRef dialectName,
613 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
614 assert(callback && "expected non-null legality callback");
615 unwrap(target)->addDynamicallyLegalDialect(
616 wrapLegalityCallback(callback, userData), unwrap(dialectName));
617}
618
620 MlirConversionTarget target, MlirStringRef opName,
621 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
622 MLIRContext *ctx = &unwrap(target)->getContext();
623 OperationName name(unwrap(opName), ctx);
624 ConversionTarget::DynamicLegalityCallbackFn fn;
625 if (callback)
626 fn = wrapLegalityCallback(callback, userData);
627 unwrap(target)->markOpRecursivelyLegal(name, fn);
628}
629
631 MlirConversionTarget target,
632 MlirConversionTargetDynamicLegalityCallback callback, void *userData) {
633 assert(callback && "expected non-null legality callback");
634 unwrap(target)->markUnknownOpDynamicallyLegal(
635 wrapLegalityCallback(callback, userData));
636}
637
638//===----------------------------------------------------------------------===//
639/// TypeConverter API
640//===----------------------------------------------------------------------===//
641
642MlirTypeConverter mlirTypeConverterCreate() {
643 return wrap(new mlir::TypeConverter());
644}
645
646void mlirTypeConverterDestroy(MlirTypeConverter typeConverter) {
647 delete unwrap(typeConverter);
648}
649
651 MlirTypeConverter typeConverter,
652 MlirTypeConverterConversionCallback convertType, void *userData) {
653 unwrap(typeConverter)
654 ->addConversion(
655 [convertType, userData](Type type) -> std::optional<Type> {
656 MlirType converted{nullptr};
658 convertType(wrap(type), &converted, userData);
660 return std::nullopt; // allowed to try another conversion function
661 if (mlirTypeIsNull(converted))
662 return nullptr;
663 return unwrap(converted);
664 });
665}
666
667MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter,
668 MlirType type) {
669 return wrap(unwrap(typeConverter)->convertType(unwrap(type)));
670}
671
672//===----------------------------------------------------------------------===//
673/// ConversionPattern API
674//===----------------------------------------------------------------------===//
675
676namespace mlir {
677
678class ExternalConversionPattern : public mlir::ConversionPattern {
679public:
681 void *userData, StringRef rootName,
682 PatternBenefit benefit, MLIRContext *context,
683 TypeConverter *typeConverter,
684 ArrayRef<StringRef> generatedNames)
685 : ConversionPattern(*typeConverter, rootName, benefit, context,
686 generatedNames),
687 callbacks(callbacks), userData(userData) {
688 if (callbacks.construct)
689 callbacks.construct(userData);
690 }
691
693 if (callbacks.destruct)
694 callbacks.destruct(userData);
695 }
696
697 LogicalResult
699 ConversionPatternRewriter &rewriter) const override {
700 std::vector<MlirValue> wrappedOperands;
701 for (Value val : operands)
702 wrappedOperands.push_back(wrap(val));
703 return unwrap(callbacks.matchAndRewrite(
704 wrap(static_cast<const mlir::ConversionPattern *>(this)), wrap(op),
705 wrappedOperands.size(), wrappedOperands.data(), wrap(&rewriter),
706 userData));
707 }
708
709private:
711 void *userData;
712};
713
714} // namespace mlir
715
716MlirConversionPattern mlirOpConversionPatternCreate(
717 MlirStringRef rootName, unsigned benefit, MlirContext context,
718 MlirTypeConverter typeConverter, MlirConversionPatternCallbacks callbacks,
719 void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames) {
720 std::vector<mlir::StringRef> generatedNamesVec;
721 generatedNamesVec.reserve(nGeneratedNames);
722 for (size_t i = 0; i < nGeneratedNames; ++i)
723 generatedNamesVec.push_back(unwrap(generatedNames[i]));
725 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
726 unwrap(context), unwrap(typeConverter), generatedNamesVec));
727}
728
729MlirTypeConverter
730mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern) {
731 return wrap(const_cast<TypeConverter *>(unwrap(pattern)->getTypeConverter()));
732}
733
734MlirRewritePattern
735mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern) {
736 return wrap(static_cast<const RewritePattern *>(unwrap(pattern)));
737}
738
739//===----------------------------------------------------------------------===//
740/// RewritePattern API
741//===----------------------------------------------------------------------===//
742
743namespace mlir {
744
746public:
748 StringRef rootName, PatternBenefit benefit,
749 MLIRContext *context,
750 ArrayRef<StringRef> generatedNames)
751 : RewritePattern(rootName, benefit, context, generatedNames),
752 callbacks(callbacks), userData(userData) {
753 if (callbacks.construct)
754 callbacks.construct(userData);
755 }
756
758 if (callbacks.destruct)
759 callbacks.destruct(userData);
760 }
761
762 LogicalResult matchAndRewrite(Operation *op,
763 PatternRewriter &rewriter) const override {
764 return unwrap(callbacks.matchAndRewrite(
765 wrap(static_cast<const mlir::RewritePattern *>(this)), wrap(op),
766 wrap(&rewriter), userData));
767 }
768
769private:
771 void *userData;
772};
773
774} // namespace mlir
775
776MlirRewritePattern mlirOpRewritePatternCreate(
777 MlirStringRef rootName, unsigned benefit, MlirContext context,
778 MlirRewritePatternCallbacks callbacks, void *userData,
779 size_t nGeneratedNames, MlirStringRef *generatedNames) {
780 std::vector<mlir::StringRef> generatedNamesVec;
781 generatedNamesVec.reserve(nGeneratedNames);
782 for (size_t i = 0; i < nGeneratedNames; ++i) {
783 generatedNamesVec.push_back(unwrap(generatedNames[i]));
784 }
786 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
787 unwrap(context), generatedNamesVec));
788}
789
790//===----------------------------------------------------------------------===//
791/// RewritePatternSet API
792//===----------------------------------------------------------------------===//
793
794MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context) {
795 return wrap(new mlir::RewritePatternSet(unwrap(context)));
796}
797
798MlirContext mlirRewritePatternSetGetContext(MlirRewritePatternSet set) {
799 return wrap(unwrap(set)->getContext());
800}
801
802void mlirRewritePatternSetDestroy(MlirRewritePatternSet set) {
803 delete unwrap(set);
804}
805
806void mlirRewritePatternSetAdd(MlirRewritePatternSet set,
807 MlirRewritePattern pattern) {
808 std::unique_ptr<mlir::RewritePattern> patternPtr(
809 const_cast<mlir::RewritePattern *>(unwrap(pattern)));
810 pattern.ptr = nullptr;
811 unwrap(set)->add(std::move(patternPtr));
812}
813
814//===----------------------------------------------------------------------===//
815/// PDLPatternModule API
816//===----------------------------------------------------------------------===//
817
818#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
819MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
820 return wrap(new mlir::PDLPatternModule(
822}
823
824void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
825 delete unwrap(op);
826 op.ptr = nullptr;
827}
828
829MlirRewritePatternSet
830mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
831 auto *m = new mlir::RewritePatternSet(std::move(*unwrap(op)));
832 op.ptr = nullptr;
833 return wrap(m);
834}
835
836MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
837 return wrap(unwrap(value)->dyn_cast<mlir::Value>());
838}
839
840MlirType mlirPDLValueAsType(MlirPDLValue value) {
841 return wrap(unwrap(value)->dyn_cast<mlir::Type>());
842}
843
844MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
845 return wrap(unwrap(value)->dyn_cast<mlir::Operation *>());
846}
847
848MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
849 return wrap(unwrap(value)->dyn_cast<mlir::Attribute>());
850}
851
852void mlirPDLResultListPushBackValue(MlirPDLResultList results,
853 MlirValue value) {
854 unwrap(results)->push_back(unwrap(value));
855}
856
857void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
858 unwrap(results)->push_back(unwrap(value));
859}
860
861void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
862 MlirOperation value) {
863 unwrap(results)->push_back(unwrap(value));
864}
865
866void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
867 MlirAttribute value) {
868 unwrap(results)->push_back(unwrap(value));
869}
870
871inline std::vector<MlirPDLValue> wrap(ArrayRef<PDLValue> values) {
872 std::vector<MlirPDLValue> mlirValues;
873 mlirValues.reserve(values.size());
874 for (auto &value : values) {
875 mlirValues.push_back(wrap(&value));
876 }
877 return mlirValues;
878}
879
880void mlirPDLPatternModuleRegisterRewriteFunction(
881 MlirPDLPatternModule pdlModule, MlirStringRef name,
882 MlirPDLRewriteFunction rewriteFn, void *userData) {
883 unwrap(pdlModule)->registerRewriteFunction(
884 unwrap(name),
885 [userData, rewriteFn](PatternRewriter &rewriter, PDLResultList &results,
886 ArrayRef<PDLValue> values) -> LogicalResult {
887 std::vector<MlirPDLValue> mlirValues = wrap(values);
888 return unwrap(rewriteFn(wrap(&rewriter), wrap(&results),
889 mlirValues.size(), mlirValues.data(),
890 userData));
891 });
892}
893
894void mlirPDLPatternModuleRegisterConstraintFunction(
895 MlirPDLPatternModule pdlModule, MlirStringRef name,
896 MlirPDLConstraintFunction constraintFn, void *userData) {
897 unwrap(pdlModule)->registerConstraintFunction(
898 unwrap(name),
899 [userData, constraintFn](PatternRewriter &rewriter,
900 PDLResultList &results,
901 ArrayRef<PDLValue> values) -> LogicalResult {
902 std::vector<MlirPDLValue> mlirValues = wrap(values);
903 return unwrap(constraintFn(wrap(&rewriter), wrap(&results),
904 mlirValues.size(), mlirValues.data(),
905 userData));
906 });
907}
908#endif // MLIR_ENABLE_PDL_IN_PATTERNMATCH
void mlirGreedyRewriteDriverConfigSetMaxNumRewrites(MlirGreedyRewriteDriverConfig config, int64_t maxNumRewrites)
Sets the maximum number of rewrites within an iteration.
Definition Rewrite.cpp:324
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:247
MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context)
RewritePatternSet API.
Definition Rewrite.cpp:794
void mlirConversionTargetMarkOpRecursivelyLegal(MlirConversionTarget target, MlirStringRef opName, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Mark the given operation as recursively legal.
Definition Rewrite.cpp:619
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:178
void mlirIRRewriterDestroy(MlirRewriterBase rewriter)
Takes an IRRewriter owned by the caller and destroys it.
Definition Rewrite.cpp:277
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:201
MlirOperation mlirRewriterBaseInsert(MlirRewriterBase rewriter, MlirOperation op)
Insert the given operation at the current insertion point and return it.
Definition Rewrite.cpp:107
MlirRewriterBase mlirIRRewriterCreate(MlirContext context)
IRRewriter API.
Definition Rewrite.cpp:269
bool mlirConversionConfigIsBuildMaterializationsEnabled(MlirConversionConfig config)
Check if building materializations during conversion is enabled.
Definition Rewrite.cpp:517
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:191
MlirLogicalResult mlirConversionPatternRewriterConvertRegionTypes(MlirConversionPatternRewriter rewriter, MlirRegion region, MlirTypeConverter typeConverter)
Apply a signature conversion to each block in the given region.
Definition Rewrite.cpp:539
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:130
MlirOperation mlirRewriterBaseCloneWithMapping(MlirRewriterBase rewriter, MlirOperation op, MlirIRMapping mapping)
Clones the given operation using the rewriter and the provided IRMapping.
Definition Rewrite.cpp:124
MlirTypeConverter mlirTypeConverterCreate()
TypeConverter API.
Definition Rewrite.cpp:642
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
int64_t mlirGreedyRewriteDriverConfigGetMaxNumRewrites(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of rewrites within an iteration.
Definition Rewrite.cpp:384
void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set)
Destroy the given MlirFrozenRewritePatternSet.
Definition Rewrite.cpp:292
void mlirConversionTargetAddLegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as legal.
Definition Rewrite.cpp:558
void mlirRewriterBaseReplaceAllOpUsesWithOperation(MlirRewriterBase rewriter, MlirOperation from, MlirOperation to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:241
void mlirRewriterBaseMoveBlockBefore(MlirRewriterBase rewriter, MlirBlock block, MlirBlock existingBlock)
Unlink this block and insert it right before existingBlock.
Definition Rewrite.cpp:196
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:221
void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block)
Erases a block along with all operations inside it.
Definition Rewrite.cpp:163
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:258
MlirLogicalResult mlirApplyPatternsAndFoldGreedilyWithOp(MlirOperation op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:443
void mlirGreedyRewriteDriverConfigDestroy(MlirGreedyRewriteDriverConfig config)
Destroys a greedy rewrite driver configuration.
Definition Rewrite.cpp:314
mlir::GreedyRewriteConfig * unwrap(MlirGreedyRewriteDriverConfig config)
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:301
MlirBlock mlirRewriterBaseCreateBlockBefore(MlirRewriterBase rewriter, MlirBlock insertBefore, intptr_t nArgTypes, MlirType const *argTypes, MlirLocation const *locations)
Block and operation creation/insertion/cloning.
Definition Rewrite.cpp:94
MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate()
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:310
bool mlirGreedyRewriteDriverConfigGetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config)
Gets whether top-down traversal is used for initial worklist population.
Definition Rewrite.cpp:389
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:611
MlirTypeConverter mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern)
Get the type converter used by this conversion pattern.
Definition Rewrite.cpp:730
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:526
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:776
void mlirConversionConfigSetFoldingMode(MlirConversionConfig config, MlirDialectConversionFoldingMode mode)
Set the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:483
void mlirConversionTargetAddIllegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as illegal.
Definition Rewrite.cpp:564
void mlirGreedyRewriteDriverConfigSetStrictness(MlirGreedyRewriteDriverConfig config, MlirGreedyRewriteStrictness strictness)
Sets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:339
MlirGreedyRewriteStrictness mlirGreedyRewriteDriverConfigGetStrictness(MlirGreedyRewriteDriverConfig config)
Gets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:399
MlirConversionConfig mlirConversionConfigCreate(void)
ConversionConfig API.
Definition Rewrite.cpp:475
MlirContext mlirRewritePatternSetGetContext(MlirRewritePatternSet set)
Get the context associated with a MlirRewritePatternSet.
Definition Rewrite.cpp:798
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:232
MlirLogicalResult mlirApplyFullConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a full conversion on the given operation.
Definition Rewrite.cpp:463
void mlirConversionConfigDestroy(MlirConversionConfig config)
Destroy the given ConversionConfig.
Definition Rewrite.cpp:479
MlirOperation mlirRewriterBaseClone(MlirRewriterBase rewriter, MlirOperation op)
Creates a deep copy of the specified operation.
Definition Rewrite.cpp:114
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:167
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:145
void mlirRewriterBaseCancelOpModification(MlirRewriterBase rewriter, MlirOperation op)
This method cancels a pending in-place modification.
Definition Rewrite.cpp:211
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:119
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:716
MlirConversionTarget mlirConversionTargetCreate(MlirContext context)
ConversionTarget API.
Definition Rewrite.cpp:550
void mlirConversionTargetMarkUnknownOpDynamicallyLegal(MlirConversionTarget target, MlirConversionTargetDynamicLegalityCallback callback, void *userData)
Mark unknown operations as dynamically legal, with a callback.
Definition Rewrite.cpp:630
void mlirRewritePatternSetDestroy(MlirRewritePatternSet set)
Destruct the given MlirRewritePatternSet.
Definition Rewrite.cpp:802
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:646
void mlirConversionTargetAddLegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as legal.
Definition Rewrite.cpp:570
MlirLogicalResult mlirApplyPatternsAndFoldGreedily(MlirModule op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:435
MlirFrozenRewritePatternSet mlirFreezeRewritePattern(MlirRewritePatternSet set)
RewritePatternSet and FrozenRewritePatternSet API.
Definition Rewrite.cpp:286
bool mlirGreedyRewriteDriverConfigIsFoldingEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether folding is enabled during greedy rewriting.
Definition Rewrite.cpp:394
bool mlirGreedyRewriteDriverConfigIsConstantCSEEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether constant CSE is enabled.
Definition Rewrite.cpp:429
void mlirConversionConfigEnableBuildMaterializations(MlirConversionConfig config, bool enable)
Enable or disable building materializations during conversion.
Definition Rewrite.cpp:512
void mlirConversionTargetDestroy(MlirConversionTarget target)
Destroy the given ConversionTarget.
Definition Rewrite.cpp:554
MlirLogicalResult mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a partial conversion on the given operation.
Definition Rewrite.cpp:456
void mlirRewriterBaseInlineRegionBefore(MlirRewriterBase rewriter, MlirRegion region, MlirBlock before)
RewriterBase API.
Definition Rewrite.cpp:140
int64_t mlirGreedyRewriteDriverConfigGetMaxIterations(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of iterations for the greedy rewrite driver.
Definition Rewrite.cpp:379
MlirDialectConversionFoldingMode mlirConversionConfigGetFoldingMode(MlirConversionConfig config)
Get the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:501
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:153
void mlirRewriterBaseReplaceAllUsesWith(MlirRewriterBase rewriter, MlirValue from, MlirValue to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:216
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:206
void mlirRewritePatternSetAdd(MlirRewritePatternSet set, MlirRewritePattern pattern)
Add the given MlirRewritePattern into a MlirRewritePatternSet.
Definition Rewrite.cpp:806
MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter, MlirType type)
Convert the given type using the given TypeConverter.
Definition Rewrite.cpp:667
MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config)
Definition Rewrite.cpp:306
void mlirGreedyRewriteDriverConfigSetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal)
Sets whether to use top-down traversal for the initial population of the worklist.
Definition Rewrite.cpp:329
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:450
MlirRewriterBase mlirIRRewriterCreateFromOp(MlirOperation op)
Create an IRRewriter and transfer ownership to the caller.
Definition Rewrite.cpp:273
void mlirGreedyRewriteDriverConfigEnableConstantCSE(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables constant CSE.
Definition Rewrite.cpp:374
MlirGreedySimplifyRegionLevel mlirGreedyRewriteDriverConfigGetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config)
Gets the region simplification level.
Definition Rewrite.cpp:414
void mlirConversionTargetAddIllegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as illegal.
Definition Rewrite.cpp:575
MlirRewritePattern mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern)
Cast the ConversionPattern to a RewritePattern.
Definition Rewrite.cpp:735
void mlirGreedyRewriteDriverConfigSetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config, MlirGreedySimplifyRegionLevel level)
Sets the region simplification level.
Definition Rewrite.cpp:357
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:186
MlirPatternRewriter mlirConversionPatternRewriterAsPatternRewriter(MlirConversionPatternRewriter rewriter)
ConversionPatternRewriter API.
Definition Rewrite.cpp:534
void mlirGreedyRewriteDriverConfigEnableFolding(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables folding during greedy rewriting.
Definition Rewrite.cpp:334
void mlirTypeConverterAddConversion(MlirTypeConverter typeConverter, MlirTypeConverterConversionCallback convertType, void *userData)
Add a type conversion function to the given TypeConverter.
Definition Rewrite.cpp:650
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:319
void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op)
Erases an operation that is known to have no uses.
Definition Rewrite.cpp:159
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:601
b getContext())
static 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:33
OpListType::iterator iterator
Definition Block.h:164
iterator end()
Definition Block.h:168
LogicalResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const override
Definition Rewrite.cpp:698
ExternalConversionPattern(MlirConversionPatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, TypeConverter *typeConverter, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:680
ExternalRewritePattern(MlirRewritePatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:747
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:762
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 ...
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
Block::iterator getInsertionPoint() const
Returns the current insertion point of the builder.
Definition Builders.h:447
Block * getInsertionBlock() const
Return the block the current insertion point belongs to.
Definition Builders.h:444
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...
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition Types.h:74
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Definition Value.h:96
MlirDialectConversionFoldingMode
Definition Rewrite.h:457
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_AFTER_PATTERNS
Definition Rewrite.h:460
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_BEFORE_PATTERNS
Definition Rewrite.h:459
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_NEVER
Definition Rewrite.h:458
@ MLIR_CONVERSION_TARGET_LEGALITY_LEGAL
The operation instance is legal.
Definition Rewrite.h:539
@ MLIR_CONVERSION_TARGET_LEGALITY_NO_OPINION
The callback has no opinion on this instance.
Definition Rewrite.h:545
@ MLIR_CONVERSION_TARGET_LEGALITY_ILLEGAL
The operation instance is illegal.
Definition Rewrite.h:541
MlirLogicalResult(* MlirTypeConverterConversionCallback)(MlirType type, MlirType *convertedType, void *userData)
Callback type for type conversion functions.
Definition Rewrite.h:595
MlirConversionTargetLegality(* MlirConversionTargetDynamicLegalityCallback)(MlirOperation op, void *userData)
Callback for dynamic legality checks.
Definition Rewrite.h:551
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 mlirTypeIsNull(MlirType type)
Checks whether a type is null.
Definition IR.h:1172
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:612
A logical result value, essentially a boolean with named states.
Definition Support.h:121
RewritePattern API.
Definition Rewrite.h:649
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:78