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