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
32 return wrap(unwrap(rewriter)->getContext());
33}
34
35//===----------------------------------------------------------------------===//
36/// Insertion points methods
37//===----------------------------------------------------------------------===//
38
40 unwrap(rewriter)->clearInsertionPoint();
41}
42
44 MlirOperation op) {
45 unwrap(rewriter)->setInsertionPoint(unwrap(op));
46}
47
49 MlirOperation op) {
50 unwrap(rewriter)->setInsertionPointAfter(unwrap(op));
51}
52
54 MlirValue value) {
55 unwrap(rewriter)->setInsertionPointAfterValue(unwrap(value));
56}
57
59 MlirBlock block) {
60 unwrap(rewriter)->setInsertionPointToStart(unwrap(block));
61}
62
64 MlirBlock block) {
65 unwrap(rewriter)->setInsertionPointToEnd(unwrap(block));
66}
67
69 return wrap(unwrap(rewriter)->getInsertionBlock());
70}
71
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
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
105 MlirOperation op) {
106 return wrap(unwrap(rewriter)->insert(unwrap(op)));
107}
108
109// Other methods of OpBuilder
110
112 MlirOperation op) {
113 return wrap(unwrap(rewriter)->clone(*unwrap(op)));
114}
115
117 MlirOperation op) {
118 return wrap(unwrap(rewriter)->cloneWithoutRegions(*unwrap(op)));
119}
120
122 MlirRegion region, MlirBlock before) {
123
124 unwrap(rewriter)->cloneRegionBefore(*unwrap(region), unwrap(before));
125}
126
127//===----------------------------------------------------------------------===//
128/// RewriterBase API
129//===----------------------------------------------------------------------===//
130
132 MlirRegion region, MlirBlock before) {
133 unwrap(rewriter)->inlineRegionBefore(*unwrap(region), unwrap(before));
134}
135
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
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
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
188 MlirBlock existingBlock) {
189 unwrap(rewriter)->moveBlockBefore(unwrap(block), unwrap(existingBlock));
190}
191
193 MlirOperation op) {
194 unwrap(rewriter)->startOpModification(unwrap(op));
195}
196
198 MlirOperation op) {
199 unwrap(rewriter)->finalizeOpModification(unwrap(op));
200}
201
203 MlirOperation op) {
204 unwrap(rewriter)->cancelOpModification(unwrap(op));
205}
206
208 MlirValue from, MlirValue to) {
209 unwrap(rewriter)->replaceAllUsesWith(unwrap(from), unwrap(to));
210}
211
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
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
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
261 return wrap(new IRRewriter(unwrap(context)));
262}
263
265 return wrap(new IRRewriter(unwrap(op)));
266}
267
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) {
367 unwrap(config)->enableConstantCSE(enable);
368}
369
371 MlirGreedyRewriteDriverConfig config) {
372 return unwrap(config)->getMaxIterations();
373}
374
376 MlirGreedyRewriteDriverConfig config) {
377 return unwrap(config)->getMaxNumRewrites();
378}
379
381 MlirGreedyRewriteDriverConfig config) {
382 return unwrap(config)->getUseTopDownTraversal();
383}
384
386 MlirGreedyRewriteDriverConfig config) {
387 return unwrap(config)->isFoldingEnabled();
388}
389
403
419
421 MlirGreedyRewriteDriverConfig config) {
422 return unwrap(config)->isConstantCSEEnabled();
423}
424
427 MlirFrozenRewritePatternSet patterns,
428 MlirGreedyRewriteDriverConfig config) {
429 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
430 *unwrap(config)));
431}
432
435 MlirFrozenRewritePatternSet patterns,
436 MlirGreedyRewriteDriverConfig config) {
437 return wrap(mlir::applyPatternsGreedily(unwrap(op), *unwrap(patterns),
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),
451 *unwrap(patterns), *unwrap(config)));
452}
453
455 MlirConversionTarget target,
456 MlirFrozenRewritePatternSet patterns,
457 MlirConversionConfig config) {
458 return wrap(mlir::applyFullConversion(unwrap(op), *unwrap(target),
459 *unwrap(patterns), *unwrap(config)));
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
474void mlirConversionConfigSetFoldingMode(MlirConversionConfig config,
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
492mlirConversionConfigGetFoldingMode(MlirConversionConfig config) {
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
531 MlirConversionPatternRewriter rewriter, MlirRegion region,
532 MlirTypeConverter typeConverter) {
533 return wrap(unwrap(rewriter)->convertRegionTypes(unwrap(region),
534 *unwrap(typeConverter)));
535}
536
537//===----------------------------------------------------------------------===//
538/// ConversionTarget API
539//===----------------------------------------------------------------------===//
540
541MlirConversionTarget mlirConversionTargetCreate(MlirContext context) {
542 return wrap(new mlir::ConversionTarget(*unwrap(context)));
543}
544
545void mlirConversionTargetDestroy(MlirConversionTarget target) {
546 delete unwrap(target);
547}
548
549void mlirConversionTargetAddLegalOp(MlirConversionTarget target,
550 MlirStringRef opName) {
551 unwrap(target)->addLegalOp(
553}
554
555void mlirConversionTargetAddIllegalOp(MlirConversionTarget target,
556 MlirStringRef opName) {
557 unwrap(target)->addIllegalOp(
559}
560
562 MlirStringRef dialectName) {
563 unwrap(target)->addLegalDialect(unwrap(dialectName));
564}
565
567 MlirStringRef dialectName) {
568 unwrap(target)->addIllegalDialect(unwrap(dialectName));
569}
570
571//===----------------------------------------------------------------------===//
572/// TypeConverter API
573//===----------------------------------------------------------------------===//
574
575MlirTypeConverter mlirTypeConverterCreate() {
576 return wrap(new mlir::TypeConverter());
577}
578
579void mlirTypeConverterDestroy(MlirTypeConverter typeConverter) {
580 delete unwrap(typeConverter);
581}
582
584 MlirTypeConverter typeConverter,
585 MlirTypeConverterConversionCallback convertType, void *userData) {
586 unwrap(typeConverter)
587 ->addConversion(
588 [convertType, userData](Type type) -> std::optional<Type> {
589 MlirType converted{nullptr};
591 convertType(wrap(type), &converted, userData);
593 return std::nullopt; // allowed to try another conversion function
594 if (mlirTypeIsNull(converted))
595 return nullptr;
596 return unwrap(converted);
597 });
598}
599
600MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter,
601 MlirType type) {
602 return wrap(unwrap(typeConverter)->convertType(unwrap(type)));
603}
604
605//===----------------------------------------------------------------------===//
606/// ConversionPattern API
607//===----------------------------------------------------------------------===//
608
609namespace mlir {
610
611class ExternalConversionPattern : public mlir::ConversionPattern {
612public:
614 void *userData, StringRef rootName,
615 PatternBenefit benefit, MLIRContext *context,
616 TypeConverter *typeConverter,
617 ArrayRef<StringRef> generatedNames)
618 : ConversionPattern(*typeConverter, rootName, benefit, context,
619 generatedNames),
620 callbacks(callbacks), userData(userData) {
621 if (callbacks.construct)
622 callbacks.construct(userData);
623 }
624
626 if (callbacks.destruct)
627 callbacks.destruct(userData);
628 }
629
630 LogicalResult
632 ConversionPatternRewriter &rewriter) const override {
633 std::vector<MlirValue> wrappedOperands;
634 for (Value val : operands)
635 wrappedOperands.push_back(wrap(val));
636 return unwrap(callbacks.matchAndRewrite(
637 wrap(static_cast<const mlir::ConversionPattern *>(this)), wrap(op),
638 wrappedOperands.size(), wrappedOperands.data(), wrap(&rewriter),
639 userData));
640 }
641
642private:
644 void *userData;
645};
646
647} // namespace mlir
648
649MlirConversionPattern mlirOpConversionPatternCreate(
650 MlirStringRef rootName, unsigned benefit, MlirContext context,
651 MlirTypeConverter typeConverter, MlirConversionPatternCallbacks callbacks,
652 void *userData, size_t nGeneratedNames, MlirStringRef *generatedNames) {
653 std::vector<mlir::StringRef> generatedNamesVec;
654 generatedNamesVec.reserve(nGeneratedNames);
655 for (size_t i = 0; i < nGeneratedNames; ++i)
656 generatedNamesVec.push_back(unwrap(generatedNames[i]));
658 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
659 unwrap(context), unwrap(typeConverter), generatedNamesVec));
660}
661
662MlirTypeConverter
663mlirConversionPatternGetTypeConverter(MlirConversionPattern pattern) {
664 return wrap(const_cast<TypeConverter *>(unwrap(pattern)->getTypeConverter()));
665}
666
667MlirRewritePattern
668mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern) {
669 return wrap(static_cast<const RewritePattern *>(unwrap(pattern)));
670}
671
672//===----------------------------------------------------------------------===//
673/// RewritePattern API
674//===----------------------------------------------------------------------===//
675
676namespace mlir {
677
679public:
681 StringRef rootName, PatternBenefit benefit,
682 MLIRContext *context,
683 ArrayRef<StringRef> generatedNames)
684 : RewritePattern(rootName, benefit, context, generatedNames),
685 callbacks(callbacks), userData(userData) {
686 if (callbacks.construct)
687 callbacks.construct(userData);
688 }
689
691 if (callbacks.destruct)
692 callbacks.destruct(userData);
693 }
694
695 LogicalResult matchAndRewrite(Operation *op,
696 PatternRewriter &rewriter) const override {
697 return unwrap(callbacks.matchAndRewrite(
698 wrap(static_cast<const mlir::RewritePattern *>(this)), wrap(op),
699 wrap(&rewriter), userData));
700 }
701
702private:
704 void *userData;
705};
706
707} // namespace mlir
708
709MlirRewritePattern mlirOpRewritePatternCreate(
710 MlirStringRef rootName, unsigned benefit, MlirContext context,
711 MlirRewritePatternCallbacks callbacks, void *userData,
712 size_t nGeneratedNames, MlirStringRef *generatedNames) {
713 std::vector<mlir::StringRef> generatedNamesVec;
714 generatedNamesVec.reserve(nGeneratedNames);
715 for (size_t i = 0; i < nGeneratedNames; ++i) {
716 generatedNamesVec.push_back(unwrap(generatedNames[i]));
717 }
719 callbacks, userData, unwrap(rootName), PatternBenefit(benefit),
720 unwrap(context), generatedNamesVec));
721}
722
723//===----------------------------------------------------------------------===//
724/// RewritePatternSet API
725//===----------------------------------------------------------------------===//
726
727MlirRewritePatternSet mlirRewritePatternSetCreate(MlirContext context) {
728 return wrap(new mlir::RewritePatternSet(unwrap(context)));
729}
730
731MlirContext mlirRewritePatternSetGetContext(MlirRewritePatternSet set) {
732 return wrap(unwrap(set)->getContext());
733}
734
735void mlirRewritePatternSetDestroy(MlirRewritePatternSet set) {
736 delete unwrap(set);
737}
738
739void mlirRewritePatternSetAdd(MlirRewritePatternSet set,
740 MlirRewritePattern pattern) {
741 std::unique_ptr<mlir::RewritePattern> patternPtr(
742 const_cast<mlir::RewritePattern *>(unwrap(pattern)));
743 pattern.ptr = nullptr;
744 unwrap(set)->add(std::move(patternPtr));
745}
746
747//===----------------------------------------------------------------------===//
748/// PDLPatternModule API
749//===----------------------------------------------------------------------===//
750
751#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
752MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
753 return wrap(new mlir::PDLPatternModule(
755}
756
757void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
758 delete unwrap(op);
759 op.ptr = nullptr;
760}
761
762MlirRewritePatternSet
763mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
764 auto *m = new mlir::RewritePatternSet(std::move(*unwrap(op)));
765 op.ptr = nullptr;
766 return wrap(m);
767}
768
769MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
770 return wrap(unwrap(value)->dyn_cast<mlir::Value>());
771}
772
773MlirType mlirPDLValueAsType(MlirPDLValue value) {
774 return wrap(unwrap(value)->dyn_cast<mlir::Type>());
775}
776
777MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
778 return wrap(unwrap(value)->dyn_cast<mlir::Operation *>());
779}
780
781MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
782 return wrap(unwrap(value)->dyn_cast<mlir::Attribute>());
783}
784
785void mlirPDLResultListPushBackValue(MlirPDLResultList results,
786 MlirValue value) {
787 unwrap(results)->push_back(unwrap(value));
788}
789
790void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
791 unwrap(results)->push_back(unwrap(value));
792}
793
794void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
795 MlirOperation value) {
796 unwrap(results)->push_back(unwrap(value));
797}
798
799void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
800 MlirAttribute value) {
801 unwrap(results)->push_back(unwrap(value));
802}
803
804inline std::vector<MlirPDLValue> wrap(ArrayRef<PDLValue> values) {
805 std::vector<MlirPDLValue> mlirValues;
806 mlirValues.reserve(values.size());
807 for (auto &value : values) {
808 mlirValues.push_back(wrap(&value));
809 }
810 return mlirValues;
811}
812
813void mlirPDLPatternModuleRegisterRewriteFunction(
814 MlirPDLPatternModule pdlModule, MlirStringRef name,
815 MlirPDLRewriteFunction rewriteFn, void *userData) {
816 unwrap(pdlModule)->registerRewriteFunction(
817 unwrap(name),
818 [userData, rewriteFn](PatternRewriter &rewriter, PDLResultList &results,
819 ArrayRef<PDLValue> values) -> LogicalResult {
820 std::vector<MlirPDLValue> mlirValues = wrap(values);
821 return unwrap(rewriteFn(wrap(&rewriter), wrap(&results),
822 mlirValues.size(), mlirValues.data(),
823 userData));
824 });
825}
826
827void mlirPDLPatternModuleRegisterConstraintFunction(
828 MlirPDLPatternModule pdlModule, MlirStringRef name,
829 MlirPDLConstraintFunction constraintFn, void *userData) {
830 unwrap(pdlModule)->registerConstraintFunction(
831 unwrap(name),
832 [userData, constraintFn](PatternRewriter &rewriter,
833 PDLResultList &results,
834 ArrayRef<PDLValue> values) -> LogicalResult {
835 std::vector<MlirPDLValue> mlirValues = wrap(values);
836 return unwrap(constraintFn(wrap(&rewriter), wrap(&results),
837 mlirValues.size(), mlirValues.data(),
838 userData));
839 });
840}
841#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:727
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
MlirLogicalResult mlirConversionPatternRewriterConvertRegionTypes(MlirConversionPatternRewriter rewriter, MlirRegion region, MlirTypeConverter typeConverter)
Apply a signature conversion to each block in the given region.
Definition Rewrite.cpp:530
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:575
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:549
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:663
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:709
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:555
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 mlirRewritePatternSetGetContext(MlirRewritePatternSet set)
Get the context associated with a MlirRewritePatternSet.
Definition Rewrite.cpp:731
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:649
MlirConversionTarget mlirConversionTargetCreate(MlirContext context)
ConversionTarget API.
Definition Rewrite.cpp:541
void mlirRewritePatternSetDestroy(MlirRewritePatternSet set)
Destruct the given MlirRewritePatternSet.
Definition Rewrite.cpp:735
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:579
void mlirConversionTargetAddLegalDialect(MlirConversionTarget target, MlirStringRef dialectName)
Register the operations of the given dialect as legal.
Definition Rewrite.cpp:561
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:545
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:739
MlirType mlirTypeConverterConvertType(MlirTypeConverter typeConverter, MlirType type)
Convert the given type using the given TypeConverter.
Definition Rewrite.cpp:600
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:566
MlirRewritePattern mlirConversionPatternAsRewritePattern(MlirConversionPattern pattern)
Cast the ConversionPattern to a RewritePattern.
Definition Rewrite.cpp:668
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:583
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:631
ExternalConversionPattern(MlirConversionPatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, TypeConverter *typeConverter, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:613
ExternalRewritePattern(MlirRewritePatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, ArrayRef< StringRef > generatedNames)
Definition Rewrite.cpp:680
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:695
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:546
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:1160
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:563
A logical result value, essentially a boolean with named states.
Definition Support.h:121
RewritePattern API.
Definition Rewrite.h:600
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:78