MLIR 23.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/Rewrite.h"
15#include "mlir/CAPI/Support.h"
16#include "mlir/CAPI/Wrap.h"
17#include "mlir/IR/Attributes.h"
24
25using namespace mlir;
26
27//===----------------------------------------------------------------------===//
28/// RewriterBase API inherited from OpBuilder
29//===----------------------------------------------------------------------===//
30
31MlirContext mlirRewriterBaseGetContext(MlirRewriterBase rewriter) {
32 return wrap(unwrap(rewriter)->getContext());
33}
34
35//===----------------------------------------------------------------------===//
36/// Insertion points methods
37//===----------------------------------------------------------------------===//
38
39void mlirRewriterBaseClearInsertionPoint(MlirRewriterBase rewriter) {
40 unwrap(rewriter)->clearInsertionPoint();
41}
42
43void mlirRewriterBaseSetInsertionPointBefore(MlirRewriterBase rewriter,
44 MlirOperation op) {
45 unwrap(rewriter)->setInsertionPoint(unwrap(op));
46}
47
48void mlirRewriterBaseSetInsertionPointAfter(MlirRewriterBase rewriter,
49 MlirOperation op) {
50 unwrap(rewriter)->setInsertionPointAfter(unwrap(op));
51}
52
53void mlirRewriterBaseSetInsertionPointAfterValue(MlirRewriterBase rewriter,
54 MlirValue value) {
55 unwrap(rewriter)->setInsertionPointAfterValue(unwrap(value));
56}
57
58void mlirRewriterBaseSetInsertionPointToStart(MlirRewriterBase rewriter,
59 MlirBlock block) {
60 unwrap(rewriter)->setInsertionPointToStart(unwrap(block));
61}
62
63void mlirRewriterBaseSetInsertionPointToEnd(MlirRewriterBase rewriter,
64 MlirBlock block) {
65 unwrap(rewriter)->setInsertionPointToEnd(unwrap(block));
66}
67
68MlirBlock mlirRewriterBaseGetInsertionBlock(MlirRewriterBase rewriter) {
69 return wrap(unwrap(rewriter)->getInsertionBlock());
70}
71
72MlirBlock mlirRewriterBaseGetBlock(MlirRewriterBase rewriter) {
73 return wrap(unwrap(rewriter)->getBlock());
74}
75
76MlirOperation
78 mlir::RewriterBase *base = unwrap(rewriter);
79 mlir::Block *block = base->getInsertionBlock();
81 if (it == block->end())
82 return {nullptr};
83
84 return wrap(std::addressof(*it));
85}
86
87//===----------------------------------------------------------------------===//
88/// Block and operation creation/insertion/cloning
89//===----------------------------------------------------------------------===//
90
91MlirBlock mlirRewriterBaseCreateBlockBefore(MlirRewriterBase rewriter,
92 MlirBlock insertBefore,
93 intptr_t nArgTypes,
94 MlirType const *argTypes,
95 MlirLocation const *locations) {
97 ArrayRef<Type> unwrappedArgs = unwrapList(nArgTypes, argTypes, args);
99 ArrayRef<Location> unwrappedLocs = unwrapList(nArgTypes, locations, locs);
100 return wrap(unwrap(rewriter)->createBlock(unwrap(insertBefore), unwrappedArgs,
101 unwrappedLocs));
102}
103
104MlirOperation mlirRewriterBaseInsert(MlirRewriterBase rewriter,
105 MlirOperation op) {
106 return wrap(unwrap(rewriter)->insert(unwrap(op)));
107}
108
109// Other methods of OpBuilder
110
111MlirOperation mlirRewriterBaseClone(MlirRewriterBase rewriter,
112 MlirOperation op) {
113 return wrap(unwrap(rewriter)->clone(*unwrap(op)));
114}
115
116MlirOperation mlirRewriterBaseCloneWithoutRegions(MlirRewriterBase rewriter,
117 MlirOperation op) {
118 return wrap(unwrap(rewriter)->cloneWithoutRegions(*unwrap(op)));
119}
120
121void mlirRewriterBaseCloneRegionBefore(MlirRewriterBase rewriter,
122 MlirRegion region, MlirBlock before) {
123
124 unwrap(rewriter)->cloneRegionBefore(*unwrap(region), unwrap(before));
125}
126
127//===----------------------------------------------------------------------===//
128/// RewriterBase API
129//===----------------------------------------------------------------------===//
130
131void mlirRewriterBaseInlineRegionBefore(MlirRewriterBase rewriter,
132 MlirRegion region, MlirBlock before) {
133 unwrap(rewriter)->inlineRegionBefore(*unwrap(region), unwrap(before));
134}
135
136void mlirRewriterBaseReplaceOpWithValues(MlirRewriterBase rewriter,
137 MlirOperation op, intptr_t nValues,
138 MlirValue const *values) {
140 ArrayRef<Value> unwrappedVals = unwrapList(nValues, values, vals);
141 unwrap(rewriter)->replaceOp(unwrap(op), unwrappedVals);
142}
143
144void mlirRewriterBaseReplaceOpWithOperation(MlirRewriterBase rewriter,
145 MlirOperation op,
146 MlirOperation newOp) {
147 unwrap(rewriter)->replaceOp(unwrap(op), unwrap(newOp));
148}
149
150void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op) {
151 unwrap(rewriter)->eraseOp(unwrap(op));
152}
153
154void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block) {
155 unwrap(rewriter)->eraseBlock(unwrap(block));
156}
157
158void mlirRewriterBaseInlineBlockBefore(MlirRewriterBase rewriter,
159 MlirBlock source, MlirOperation op,
160 intptr_t nArgValues,
161 MlirValue const *argValues) {
163 ArrayRef<Value> unwrappedVals = unwrapList(nArgValues, argValues, vals);
164
165 unwrap(rewriter)->inlineBlockBefore(unwrap(source), unwrap(op),
166 unwrappedVals);
167}
168
169void mlirRewriterBaseMergeBlocks(MlirRewriterBase rewriter, MlirBlock source,
170 MlirBlock dest, intptr_t nArgValues,
171 MlirValue const *argValues) {
173 ArrayRef<Value> unwrappedArgs = unwrapList(nArgValues, argValues, args);
174 unwrap(rewriter)->mergeBlocks(unwrap(source), unwrap(dest), unwrappedArgs);
175}
176
177void mlirRewriterBaseMoveOpBefore(MlirRewriterBase rewriter, MlirOperation op,
178 MlirOperation existingOp) {
179 unwrap(rewriter)->moveOpBefore(unwrap(op), unwrap(existingOp));
180}
181
182void mlirRewriterBaseMoveOpAfter(MlirRewriterBase rewriter, MlirOperation op,
183 MlirOperation existingOp) {
184 unwrap(rewriter)->moveOpAfter(unwrap(op), unwrap(existingOp));
185}
186
187void mlirRewriterBaseMoveBlockBefore(MlirRewriterBase rewriter, MlirBlock block,
188 MlirBlock existingBlock) {
189 unwrap(rewriter)->moveBlockBefore(unwrap(block), unwrap(existingBlock));
190}
191
192void mlirRewriterBaseStartOpModification(MlirRewriterBase rewriter,
193 MlirOperation op) {
194 unwrap(rewriter)->startOpModification(unwrap(op));
195}
196
197void mlirRewriterBaseFinalizeOpModification(MlirRewriterBase rewriter,
198 MlirOperation op) {
199 unwrap(rewriter)->finalizeOpModification(unwrap(op));
200}
201
202void mlirRewriterBaseCancelOpModification(MlirRewriterBase rewriter,
203 MlirOperation op) {
204 unwrap(rewriter)->cancelOpModification(unwrap(op));
205}
206
207void mlirRewriterBaseReplaceAllUsesWith(MlirRewriterBase rewriter,
208 MlirValue from, MlirValue to) {
209 unwrap(rewriter)->replaceAllUsesWith(unwrap(from), unwrap(to));
210}
211
212void mlirRewriterBaseReplaceAllValueRangeUsesWith(MlirRewriterBase rewriter,
213 intptr_t nValues,
214 MlirValue const *from,
215 MlirValue const *to) {
216 SmallVector<Value, 4> fromVals;
217 ArrayRef<Value> unwrappedFromVals = unwrapList(nValues, from, fromVals);
219 ArrayRef<Value> unwrappedToVals = unwrapList(nValues, to, toVals);
220 unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
221}
222
224 MlirOperation from,
225 intptr_t nTo,
226 MlirValue const *to) {
228 ArrayRef<Value> unwrappedToVals = unwrapList(nTo, to, toVals);
229 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrappedToVals);
230}
231
233 MlirOperation from,
234 MlirOperation to) {
235 unwrap(rewriter)->replaceAllOpUsesWith(unwrap(from), unwrap(to));
236}
237
238void mlirRewriterBaseReplaceOpUsesWithinBlock(MlirRewriterBase rewriter,
239 MlirOperation op,
240 intptr_t nNewValues,
241 MlirValue const *newValues,
242 MlirBlock block) {
244 ArrayRef<Value> unwrappedVals = unwrapList(nNewValues, newValues, vals);
245 unwrap(rewriter)->replaceOpUsesWithinBlock(unwrap(op), unwrappedVals,
246 unwrap(block));
247}
248
249void mlirRewriterBaseReplaceAllUsesExcept(MlirRewriterBase rewriter,
250 MlirValue from, MlirValue to,
251 MlirOperation exceptedUser) {
252 unwrap(rewriter)->replaceAllUsesExcept(unwrap(from), unwrap(to),
253 unwrap(exceptedUser));
254}
255
256//===----------------------------------------------------------------------===//
257/// IRRewriter API
258//===----------------------------------------------------------------------===//
259
260MlirRewriterBase mlirIRRewriterCreate(MlirContext context) {
261 return wrap(new IRRewriter(unwrap(context)));
262}
263
264MlirRewriterBase mlirIRRewriterCreateFromOp(MlirOperation op) {
265 return wrap(new IRRewriter(unwrap(op)));
266}
267
268void mlirIRRewriterDestroy(MlirRewriterBase rewriter) {
269 delete static_cast<IRRewriter *>(unwrap(rewriter));
270}
271
272//===----------------------------------------------------------------------===//
273/// RewritePatternSet and FrozenRewritePatternSet API
274//===----------------------------------------------------------------------===//
275
276MlirFrozenRewritePatternSet
277mlirFreezeRewritePattern(MlirRewritePatternSet set) {
278 auto *m = new mlir::FrozenRewritePatternSet(std::move(*unwrap(set)));
279 set.ptr = nullptr;
280 return wrap(m);
281}
282
283void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set) {
284 delete unwrap(set);
285 set.ptr = nullptr;
286}
287
288//===----------------------------------------------------------------------===//
289/// GreedyRewriteDriverConfig API
290//===----------------------------------------------------------------------===//
291
292inline mlir::GreedyRewriteConfig *unwrap(MlirGreedyRewriteDriverConfig config) {
293 assert(config.ptr && "unexpected null config");
294 return static_cast<mlir::GreedyRewriteConfig *>(config.ptr);
295}
296
297inline MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config) {
298 return {config};
299}
300
301MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate() {
302 return wrap(new mlir::GreedyRewriteConfig());
303}
304
306 MlirGreedyRewriteDriverConfig config) {
307 delete unwrap(config);
308}
309
311 MlirGreedyRewriteDriverConfig config, int64_t maxIterations) {
312 unwrap(config)->setMaxIterations(maxIterations);
313}
314
316 MlirGreedyRewriteDriverConfig config, int64_t maxNumRewrites) {
317 unwrap(config)->setMaxNumRewrites(maxNumRewrites);
318}
319
321 MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal) {
322 unwrap(config)->setUseTopDownTraversal(useTopDownTraversal);
323}
324
326 MlirGreedyRewriteDriverConfig config, bool enable) {
327 unwrap(config)->enableFolding(enable);
328}
329
331 MlirGreedyRewriteDriverConfig config,
332 MlirGreedyRewriteStrictness strictness) {
333 mlir::GreedyRewriteStrictness cppStrictness;
334 switch (strictness) {
337 break;
340 break;
343 break;
344 }
345 unwrap(config)->setStrictness(cppStrictness);
346}
347
364
366 MlirGreedyRewriteDriverConfig config, bool enable) {
368}
369
371 MlirGreedyRewriteDriverConfig config) {
372 return unwrap(config)->getMaxIterations();
373}
374
376 MlirGreedyRewriteDriverConfig config) {
378}
379
381 MlirGreedyRewriteDriverConfig config) {
383}
384
386 MlirGreedyRewriteDriverConfig config) {
387 return unwrap(config)->isFoldingEnabled();
388}
389
403
419
421 MlirGreedyRewriteDriverConfig config) {
423}
424
427 MlirFrozenRewritePatternSet patterns,
428 MlirGreedyRewriteDriverConfig config) {
430 *unwrap(config)));
431}
432
435 MlirFrozenRewritePatternSet patterns,
436 MlirGreedyRewriteDriverConfig config) {
438 *unwrap(config)));
439}
440
441void mlirWalkAndApplyPatterns(MlirOperation op,
442 MlirFrozenRewritePatternSet patterns) {
444}
445
447mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target,
448 MlirFrozenRewritePatternSet patterns,
449 MlirConversionConfig config) {
450 return wrap(mlir::applyPartialConversion(unwrap(op), *unwrap(target),
452}
453
455 MlirConversionTarget target,
456 MlirFrozenRewritePatternSet patterns,
457 MlirConversionConfig config) {
458 return wrap(mlir::applyFullConversion(unwrap(op), *unwrap(target),
460}
461
462//===----------------------------------------------------------------------===//
463/// ConversionConfig API
464//===----------------------------------------------------------------------===//
465
466MlirConversionConfig mlirConversionConfigCreate(void) {
467 return wrap(new mlir::ConversionConfig());
468}
469
470void mlirConversionConfigDestroy(MlirConversionConfig config) {
471 delete unwrap(config);
472}
473
476 mlir::DialectConversionFoldingMode cppMode;
477 switch (mode) {
479 cppMode = mlir::DialectConversionFoldingMode::Never;
480 break;
482 cppMode = mlir::DialectConversionFoldingMode::BeforePatterns;
483 break;
485 cppMode = mlir::DialectConversionFoldingMode::AfterPatterns;
486 break;
487 }
488 unwrap(config)->foldingMode = cppMode;
489}
490
493 switch (unwrap(config)->foldingMode) {
494 case mlir::DialectConversionFoldingMode::Never:
496 case mlir::DialectConversionFoldingMode::BeforePatterns:
498 case mlir::DialectConversionFoldingMode::AfterPatterns:
500 }
501}
502
504 MlirConversionConfig config, bool enable) {
505 unwrap(config)->buildMaterializations = enable;
506}
507
509 MlirConversionConfig config) {
510 return unwrap(config)->buildMaterializations;
511}
512
513//===----------------------------------------------------------------------===//
514/// PatternRewriter API
515//===----------------------------------------------------------------------===//
516
517MlirRewriterBase mlirPatternRewriterAsBase(MlirPatternRewriter rewriter) {
518 return wrap(static_cast<mlir::RewriterBase *>(unwrap(rewriter)));
519}
520
521//===----------------------------------------------------------------------===//
522/// ConversionPatternRewriter API
523//===----------------------------------------------------------------------===//
524
526 MlirConversionPatternRewriter rewriter) {
527 return wrap(static_cast<mlir::PatternRewriter *>(unwrap(rewriter)));
528}
529
530//===----------------------------------------------------------------------===//
531/// ConversionTarget API
532//===----------------------------------------------------------------------===//
533
534MlirConversionTarget mlirConversionTargetCreate(MlirContext context) {
535 return wrap(new mlir::ConversionTarget(*unwrap(context)));
536}
537
538void mlirConversionTargetDestroy(MlirConversionTarget target) {
539 delete unwrap(target);
540}
541
542void mlirConversionTargetAddLegalOp(MlirConversionTarget target,
543 MlirStringRef opName) {
544 unwrap(target)->addLegalOp(
546}
547
548void mlirConversionTargetAddIllegalOp(MlirConversionTarget target,
549 MlirStringRef opName) {
550 unwrap(target)->addIllegalOp(
552}
553
555 MlirStringRef dialectName) {
556 unwrap(target)->addLegalDialect(unwrap(dialectName));
557}
558
560 MlirStringRef dialectName) {
561 unwrap(target)->addIllegalDialect(unwrap(dialectName));
562}
563
564//===----------------------------------------------------------------------===//
565/// TypeConverter API
566//===----------------------------------------------------------------------===//
567
568MlirTypeConverter mlirTypeConverterCreate() {
569 return wrap(new mlir::TypeConverter());
570}
571
572void mlirTypeConverterDestroy(MlirTypeConverter typeConverter) {
573 delete unwrap(typeConverter);
574}
575
577 MlirTypeConverter typeConverter,
578 MlirTypeConverterConversionCallback convertType, void *userData) {
579 unwrap(typeConverter)
580 ->addConversion(
581 [convertType, userData](Type type) -> std::optional<Type> {
582 MlirType converted{nullptr};
584 convertType(wrap(type), &converted, userData);
586 return std::nullopt; // allowed to try another conversion function
587 if (mlirTypeIsNull(converted))
588 return nullptr;
589 return unwrap(converted);
590 });
591}
592
593//===----------------------------------------------------------------------===//
594/// ConversionPattern API
595//===----------------------------------------------------------------------===//
596
597namespace mlir {
598
599class ExternalConversionPattern : public mlir::ConversionPattern {
600public:
602 void *userData, StringRef rootName,
603 PatternBenefit benefit, MLIRContext *context,
604 TypeConverter *typeConverter,
605 ArrayRef<StringRef> generatedNames)
606 : ConversionPattern(*typeConverter, rootName, benefit, context,
607 generatedNames),
608 callbacks(callbacks), userData(userData) {
609 if (callbacks.construct)
610 callbacks.construct(userData);
611 }
612
614 if (callbacks.destruct)
615 callbacks.destruct(userData);
616 }
617
618 LogicalResult
620 ConversionPatternRewriter &rewriter) const override {
621 std::vector<MlirValue> wrappedOperands;
622 for (Value val : operands)
623 wrappedOperands.push_back(wrap(val));
624 return unwrap(callbacks.matchAndRewrite(
625 wrap(static_cast<const mlir::ConversionPattern *>(this)), wrap(op),
626 wrappedOperands.size(), wrappedOperands.data(), wrap(&rewriter),
627 userData));
628 }
629
630private:
632 void *userData;
633};
634
635} // namespace mlir
636
637MlirConversionPattern mlirOpConversionPatternCreate(
638 MlirStringRef rootName, unsigned benefit, MlirContext context,
639 MlirTypeConverter typeConverter, MlirConversionPatternCallbacks callbacks,
640 void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames) {
641 std::vector<mlir::StringRef> generatedNamesVec;
642 generatedNamesVec.reserve(nGeneratedNames);
643 for (size_t i = 0; i < nGeneratedNames; ++i)
644 generatedNamesVec.push_back(unwrap(generatedNames[i]));
646 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
647 unwrap(context), unwrap(typeConverter), generatedNamesVec));
648}
649
650MlirTypeConverter
651mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern) {
652 return wrap(const_cast<TypeConverter *>(unwrap(pattern)->getTypeConverter()));
653}
654
655MlirRewritePattern
656mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern) {
657 return wrap(static_cast<const RewritePattern *>(unwrap(pattern)));
658}
659
660//===----------------------------------------------------------------------===//
661/// RewritePattern API
662//===----------------------------------------------------------------------===//
663
664namespace mlir {
665
667public:
669 StringRef rootName, PatternBenefit benefit,
670 MLIRContext *context,
671 ArrayRef<StringRef> generatedNames)
672 : RewritePattern(rootName, benefit, context, generatedNames),
673 callbacks(callbacks), userData(userData) {
674 if (callbacks.construct)
675 callbacks.construct(userData);
676 }
677
679 if (callbacks.destruct)
680 callbacks.destruct(userData);
681 }
682
683 LogicalResult matchAndRewrite(Operation *op,
684 PatternRewriter &rewriter) const override {
685 return unwrap(callbacks.matchAndRewrite(
686 wrap(static_cast<const mlir::RewritePattern *>(this)), wrap(op),
687 wrap(&rewriter), userData));
688 }
689
690private:
692 void *userData;
693};
694
695} // namespace mlir
696
697MlirRewritePattern mlirOpRewritePatternCreate(
698 MlirStringRef rootName, unsigned benefit, MlirContext context,
699 MlirRewritePatternCallbacks callbacks, void *userData,
700 size_t nGeneratedNames, MlirStringRef *generatedNames) {
701 std::vector<mlir::StringRef> generatedNamesVec;
702 generatedNamesVec.reserve(nGeneratedNames);
703 for (size_t i = 0; i < nGeneratedNames; ++i) {
704 generatedNamesVec.push_back(unwrap(generatedNames[i]));
705 }
707 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
708 unwrap(context), generatedNamesVec));
709}
710
711//===----------------------------------------------------------------------===//
712/// RewritePatternSet API
713//===----------------------------------------------------------------------===//
714
715MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context) {
716 return wrap(new mlir::RewritePatternSet(unwrap(context)));
717}
718
719void mlirRewritePatternSetDestroy(MlirRewritePatternSet set) {
720 delete unwrap(set);
721}
722
723void mlirRewritePatternSetAdd(MlirRewritePatternSet set,
724 MlirRewritePattern pattern) {
725 std::unique_ptr<mlir::RewritePattern> patternPtr(
726 const_cast<mlir::RewritePattern *>(unwrap(pattern)));
727 pattern.ptr = nullptr;
728 unwrap(set)->add(std::move(patternPtr));
729}
730
731//===----------------------------------------------------------------------===//
732/// PDLPatternModule API
733//===----------------------------------------------------------------------===//
734
735#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
736MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
737 return wrap(new mlir::PDLPatternModule(
739}
740
741void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
742 delete unwrap(op);
743 op.ptr = nullptr;
744}
745
746MlirRewritePatternSet
747mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
748 auto *m = new mlir::RewritePatternSet(std::move(*unwrap(op)));
749 op.ptr = nullptr;
750 return wrap(m);
751}
752
753MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
754 return wrap(unwrap(value)->dyn_cast<mlir::Value>());
755}
756
757MlirType mlirPDLValueAsType(MlirPDLValue value) {
758 return wrap(unwrap(value)->dyn_cast<mlir::Type>());
759}
760
761MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
762 return wrap(unwrap(value)->dyn_cast<mlir::Operation *>());
763}
764
765MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
766 return wrap(unwrap(value)->dyn_cast<mlir::Attribute>());
767}
768
769void mlirPDLResultListPushBackValue(MlirPDLResultList results,
770 MlirValue value) {
771 unwrap(results)->push_back(unwrap(value));
772}
773
774void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
775 unwrap(results)->push_back(unwrap(value));
776}
777
778void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
779 MlirOperation value) {
780 unwrap(results)->push_back(unwrap(value));
781}
782
783void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
784 MlirAttribute value) {
785 unwrap(results)->push_back(unwrap(value));
786}
787
788inline std::vector<MlirPDLValue> wrap(ArrayRef<PDLValue> values) {
789 std::vector<MlirPDLValue> mlirValues;
790 mlirValues.reserve(values.size());
791 for (auto &value : values) {
792 mlirValues.push_back(wrap(&value));
793 }
794 return mlirValues;
795}
796
797void mlirPDLPatternModuleRegisterRewriteFunction(
798 MlirPDLPatternModule pdlModule, MlirStringRef name,
799 MlirPDLRewriteFunction rewriteFn, void *userData) {
800 unwrap(pdlModule)->registerRewriteFunction(
801 unwrap(name),
802 [userData, rewriteFn](PatternRewriter &rewriter, PDLResultList &results,
803 ArrayRef<PDLValue> values) -> LogicalResult {
804 std::vector<MlirPDLValue> mlirValues = wrap(values);
805 return unwrap(rewriteFn(wrap(&rewriter), wrap(&results),
806 mlirValues.size(), mlirValues.data(),
807 userData));
808 });
809}
810
811void mlirPDLPatternModuleRegisterConstraintFunction(
812 MlirPDLPatternModule pdlModule, MlirStringRef name,
813 MlirPDLConstraintFunction constraintFn, void *userData) {
814 unwrap(pdlModule)->registerConstraintFunction(
815 unwrap(name),
816 [userData, constraintFn](PatternRewriter &rewriter,
817 PDLResultList &results,
818 ArrayRef<PDLValue> values) -> LogicalResult {
819 std::vector<MlirPDLValue> mlirValues = wrap(values);
820 return unwrap(constraintFn(wrap(&rewriter), wrap(&results),
821 mlirValues.size(), mlirValues.data(),
822 userData));
823 });
824}
825#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:315
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:238
MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context)
RewritePatternSet API.
Definition Rewrite.cpp:715
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:169
void mlirIRRewriterDestroy(MlirRewriterBase rewriter)
Takes an IRRewriter owned by the caller and destroys it.
Definition Rewrite.cpp:268
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:192
MlirOperation mlirRewriterBaseInsert(MlirRewriterBase rewriter, MlirOperation op)
Insert the given operation at the current insertion point and return it.
Definition Rewrite.cpp:104
MlirRewriterBase mlirIRRewriterCreate(MlirContext context)
IRRewriter API.
Definition Rewrite.cpp:260
bool mlirConversionConfigIsBuildMaterializationsEnabled(MlirConversionConfig config)
Check if building materializations during conversion is enabled.
Definition Rewrite.cpp:508
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:182
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:121
MlirTypeConverter mlirTypeConverterCreate()
TypeConverter API.
Definition Rewrite.cpp:568
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:48
int64_t mlirGreedyRewriteDriverConfigGetMaxNumRewrites(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of rewrites within an iteration.
Definition Rewrite.cpp:375
void mlirFrozenRewritePatternSetDestroy(MlirFrozenRewritePatternSet set)
Destroy the given MlirFrozenRewritePatternSet.
Definition Rewrite.cpp:283
void mlirConversionTargetAddLegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as legal.
Definition Rewrite.cpp:542
void mlirRewriterBaseReplaceAllOpUsesWithOperation(MlirRewriterBase rewriter, MlirOperation from, MlirOperation to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:232
void mlirRewriterBaseMoveBlockBefore(MlirRewriterBase rewriter, MlirBlock block, MlirBlock existingBlock)
Unlink this block and insert it right before existingBlock.
Definition Rewrite.cpp:187
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:212
void mlirRewriterBaseEraseBlock(MlirRewriterBase rewriter, MlirBlock block)
Erases a block along with all operations inside it.
Definition Rewrite.cpp:154
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:249
MlirLogicalResult mlirApplyPatternsAndFoldGreedilyWithOp(MlirOperation op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:434
void mlirGreedyRewriteDriverConfigDestroy(MlirGreedyRewriteDriverConfig config)
Destroys a greedy rewrite driver configuration.
Definition Rewrite.cpp:305
mlir::GreedyRewriteConfig * unwrap(MlirGreedyRewriteDriverConfig config)
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:292
MlirBlock mlirRewriterBaseCreateBlockBefore(MlirRewriterBase rewriter, MlirBlock insertBefore, intptr_t nArgTypes, MlirType const *argTypes, MlirLocation const *locations)
Block and operation creation/insertion/cloning.
Definition Rewrite.cpp:91
MlirGreedyRewriteDriverConfig mlirGreedyRewriteDriverConfigCreate()
GreedyRewriteDriverConfig API.
Definition Rewrite.cpp:301
bool mlirGreedyRewriteDriverConfigGetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config)
Gets whether top-down traversal is used for initial worklist population.
Definition Rewrite.cpp:380
MlirTypeConverter mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern)
Get the type converter used by this conversion pattern.
Definition Rewrite.cpp:651
void mlirRewriterBaseSetInsertionPointToStart(MlirRewriterBase rewriter, MlirBlock block)
Sets the insertion point to the start of the specified block.
Definition Rewrite.cpp:58
MlirRewriterBase mlirPatternRewriterAsBase(MlirPatternRewriter rewriter)
PatternRewriter API.
Definition Rewrite.cpp:517
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:697
void mlirConversionConfigSetFoldingMode(MlirConversionConfig config, MlirDialectConversionFoldingMode mode)
Set the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:474
void mlirConversionTargetAddIllegalOp(MlirConversionTarget target, MlirStringRef opName)
Register the given operations as illegal.
Definition Rewrite.cpp:548
void mlirGreedyRewriteDriverConfigSetStrictness(MlirGreedyRewriteDriverConfig config, MlirGreedyRewriteStrictness strictness)
Sets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:330
MlirGreedyRewriteStrictness mlirGreedyRewriteDriverConfigGetStrictness(MlirGreedyRewriteDriverConfig config)
Gets the strictness level for the greedy rewrite driver.
Definition Rewrite.cpp:390
MlirConversionConfig mlirConversionConfigCreate(void)
ConversionConfig API.
Definition Rewrite.cpp:466
MlirContext mlirRewriterBaseGetContext(MlirRewriterBase rewriter)
RewriterBase API inherited from OpBuilder.
Definition Rewrite.cpp:31
void mlirRewriterBaseReplaceAllOpUsesWithValueRange(MlirRewriterBase rewriter, MlirOperation from, intptr_t nTo, MlirValue const *to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:223
MlirLogicalResult mlirApplyFullConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a full conversion on the given operation.
Definition Rewrite.cpp:454
void mlirConversionConfigDestroy(MlirConversionConfig config)
Destroy the given ConversionConfig.
Definition Rewrite.cpp:470
MlirOperation mlirRewriterBaseClone(MlirRewriterBase rewriter, MlirOperation op)
Creates a deep copy of the specified operation.
Definition Rewrite.cpp:111
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:158
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:136
void mlirRewriterBaseCancelOpModification(MlirRewriterBase rewriter, MlirOperation op)
This method cancels a pending in-place modification.
Definition Rewrite.cpp:202
void mlirRewriterBaseSetInsertionPointAfterValue(MlirRewriterBase rewriter, MlirValue value)
Sets the insertion point to the node after the specified value.
Definition Rewrite.cpp:53
void mlirRewriterBaseSetInsertionPointToEnd(MlirRewriterBase rewriter, MlirBlock block)
Sets the insertion point to the end of the specified block.
Definition Rewrite.cpp:63
MlirOperation mlirRewriterBaseCloneWithoutRegions(MlirRewriterBase rewriter, MlirOperation op)
Creates a deep copy of this operation but keep the operation regions empty.
Definition Rewrite.cpp:116
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:637
MlirConversionTarget mlirConversionTargetCreate(MlirContext context)
ConversionTarget API.
Definition Rewrite.cpp:534
void mlirRewritePatternSetDestroy(MlirRewritePatternSet set)
Destruct the given MlirRewritePatternSet.
Definition Rewrite.cpp:719
MlirBlock mlirRewriterBaseGetBlock(MlirRewriterBase rewriter)
Returns the current block of the rewriter.
Definition Rewrite.cpp:72
MlirOperation mlirRewriterBaseGetOperationAfterInsertion(MlirRewriterBase rewriter)
Returns the operation right after the current insertion point of the rewriter.
Definition Rewrite.cpp:77
void mlirRewriterBaseClearInsertionPoint(MlirRewriterBase rewriter)
Insertion points methods.
Definition Rewrite.cpp:39
void mlirTypeConverterDestroy(MlirTypeConverter typeConverter)
Destroy the given TypeConverter.
Definition Rewrite.cpp:572
void mlirConversionTargetAddLegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as legal.
Definition Rewrite.cpp:554
MlirLogicalResult mlirApplyPatternsAndFoldGreedily(MlirModule op, MlirFrozenRewritePatternSet patterns, MlirGreedyRewriteDriverConfig config)
Definition Rewrite.cpp:426
MlirFrozenRewritePatternSet mlirFreezeRewritePattern(MlirRewritePatternSet set)
RewritePatternSet and FrozenRewritePatternSet API.
Definition Rewrite.cpp:277
bool mlirGreedyRewriteDriverConfigIsFoldingEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether folding is enabled during greedy rewriting.
Definition Rewrite.cpp:385
bool mlirGreedyRewriteDriverConfigIsConstantCSEEnabled(MlirGreedyRewriteDriverConfig config)
Gets whether constant CSE is enabled.
Definition Rewrite.cpp:420
void mlirConversionConfigEnableBuildMaterializations(MlirConversionConfig config, bool enable)
Enable or disable building materializations during conversion.
Definition Rewrite.cpp:503
void mlirConversionTargetDestroy(MlirConversionTarget target)
Destroy the given ConversionTarget.
Definition Rewrite.cpp:538
MlirLogicalResult mlirApplyPartialConversion(MlirOperation op, MlirConversionTarget target, MlirFrozenRewritePatternSet patterns, MlirConversionConfig config)
Apply a partial conversion on the given operation.
Definition Rewrite.cpp:447
void mlirRewriterBaseInlineRegionBefore(MlirRewriterBase rewriter, MlirRegion region, MlirBlock before)
RewriterBase API.
Definition Rewrite.cpp:131
int64_t mlirGreedyRewriteDriverConfigGetMaxIterations(MlirGreedyRewriteDriverConfig config)
Gets the maximum number of iterations for the greedy rewrite driver.
Definition Rewrite.cpp:370
MlirDialectConversionFoldingMode mlirConversionConfigGetFoldingMode(MlirConversionConfig config)
Get the folding mode for the given ConversionConfig.
Definition Rewrite.cpp:492
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:144
void mlirRewriterBaseReplaceAllUsesWith(MlirRewriterBase rewriter, MlirValue from, MlirValue to)
Find uses of from and replace them with to.
Definition Rewrite.cpp:207
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:197
void mlirRewritePatternSetAdd(MlirRewritePatternSet set, MlirRewritePattern pattern)
Add the given MlirRewritePattern into a MlirRewritePatternSet.
Definition Rewrite.cpp:723
MlirGreedyRewriteDriverConfig wrap(mlir::GreedyRewriteConfig *config)
Definition Rewrite.cpp:297
void mlirGreedyRewriteDriverConfigSetUseTopDownTraversal(MlirGreedyRewriteDriverConfig config, bool useTopDownTraversal)
Sets whether to use top-down traversal for the initial population of the worklist.
Definition Rewrite.cpp:320
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:441
MlirRewriterBase mlirIRRewriterCreateFromOp(MlirOperation op)
Create an IRRewriter and transfer ownership to the caller.
Definition Rewrite.cpp:264
void mlirGreedyRewriteDriverConfigEnableConstantCSE(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables constant CSE.
Definition Rewrite.cpp:365
MlirGreedySimplifyRegionLevel mlirGreedyRewriteDriverConfigGetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config)
Gets the region simplification level.
Definition Rewrite.cpp:405
void mlirConversionTargetAddIllegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as illegal.
Definition Rewrite.cpp:559
MlirRewritePattern mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern)
Cast the ConversionPattern to a RewritePattern.
Definition Rewrite.cpp:656
void mlirGreedyRewriteDriverConfigSetRegionSimplificationLevel(MlirGreedyRewriteDriverConfig config, MlirGreedySimplifyRegionLevel level)
Sets the region simplification level.
Definition Rewrite.cpp:348
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:177
MlirPatternRewriter mlirConversionPatternRewriterAsPatternRewriter(MlirConversionPatternRewriter rewriter)
ConversionPatternRewriter API.
Definition Rewrite.cpp:525
void mlirGreedyRewriteDriverConfigEnableFolding(MlirGreedyRewriteDriverConfig config, bool enable)
Enables or disables folding during greedy rewriting.
Definition Rewrite.cpp:325
void mlirTypeConverterAddConversion(MlirTypeConverter typeConverter, MlirTypeConverterConversionCallback convertType, void *userData)
Add a type conversion function to the given TypeConverter.
Definition Rewrite.cpp:576
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:43
MlirBlock mlirRewriterBaseGetInsertionBlock(MlirRewriterBase rewriter)
Return the block the current insertion point belongs to.
Definition Rewrite.cpp:68
void mlirGreedyRewriteDriverConfigSetMaxIterations(MlirGreedyRewriteDriverConfig config, int64_t maxIterations)
Sets the maximum number of iterations for the greedy rewrite driver.
Definition Rewrite.cpp:310
void mlirRewriterBaseEraseOp(MlirRewriterBase rewriter, MlirOperation op)
Erases an operation that is known to have no uses.
Definition Rewrite.cpp:150
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:150
iterator end()
Definition Block.h:154
LogicalResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const override
Definition Rewrite.cpp:619
ExternalConversionPattern(MlirConversionPatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, TypeConverter *typeConverter, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:601
ExternalRewritePattern(MlirRewritePatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:668
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:683
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:88
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:452
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_AFTER_PATTERNS
Definition Rewrite.h:455
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_BEFORE_PATTERNS
Definition Rewrite.h:454
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_NEVER
Definition Rewrite.h:453
MlirLogicalResult(* MlirTypeConverterConversionCallback)(MlirType type, MlirType *convertedType, void *userData)
Callback type for type conversion functions.
Definition Rewrite.h:540
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:1156
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.
const FrozenRewritePatternSet GreedyRewriteConfig config
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)
const FrozenRewritePatternSet & patterns
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:553
A logical result value, essentially a boolean with named states.
Definition Support.h:121
RewritePattern API.
Definition Rewrite.h:590
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:78