43 unwrap(rewriter)->clearInsertionPoint();
58 unwrap(rewriter)->setInsertionPointAfterValue(
unwrap(value));
63 unwrap(rewriter)->setInsertionPointToStart(
unwrap(block));
72 return wrap(
unwrap(rewriter)->getInsertionBlock());
84 if (it == block->
end())
87 return wrap(std::addressof(*it));
95 MlirBlock insertBefore,
97 MlirType
const *argTypes,
98 MlirLocation
const *locations) {
103 return wrap(
unwrap(rewriter)->createBlock(
unwrap(insertBefore), unwrappedArgs,
126 MlirIRMapping mapping) {
131 MlirRegion region, MlirBlock before) {
141 MlirRegion region, MlirBlock before) {
147 MlirValue
const *values) {
155 MlirOperation newOp) {
168 MlirBlock source, MlirOperation op,
170 MlirValue
const *argValues) {
179 MlirBlock dest,
intptr_t nArgValues,
180 MlirValue
const *argValues) {
187 MlirOperation existingOp) {
192 MlirOperation existingOp) {
197 MlirBlock existingBlock) {
217 MlirValue from, MlirValue to) {
223 MlirValue
const *from,
224 MlirValue
const *to) {
229 unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
235 MlirValue
const *to) {
238 unwrap(rewriter)->replaceAllOpUsesWith(
unwrap(from), unwrappedToVals);
250 MlirValue
const *newValues,
254 unwrap(rewriter)->replaceOpUsesWithinBlock(
unwrap(op), unwrappedVals,
259 MlirValue from, MlirValue to,
260 MlirOperation exceptedUser) {
285MlirFrozenRewritePatternSet
302 assert(config.ptr &&
"unexpected null config");
315 MlirGreedyRewriteDriverConfig config) {
320 MlirGreedyRewriteDriverConfig config,
int64_t maxIterations) {
325 MlirGreedyRewriteDriverConfig config,
int64_t maxNumRewrites) {
330 MlirGreedyRewriteDriverConfig config,
bool useTopDownTraversal) {
335 MlirGreedyRewriteDriverConfig config,
bool enable) {
340 MlirGreedyRewriteDriverConfig config,
343 switch (strictness) {
375 MlirGreedyRewriteDriverConfig config,
bool enable) {
380 MlirGreedyRewriteDriverConfig config) {
385 MlirGreedyRewriteDriverConfig config) {
390 MlirGreedyRewriteDriverConfig config) {
395 MlirGreedyRewriteDriverConfig config) {
400 MlirGreedyRewriteDriverConfig config) {
402 switch (cppStrictness) {
410 llvm_unreachable(
"Unknown GreedyRewriteStrictness");
415 MlirGreedyRewriteDriverConfig config) {
426 llvm_unreachable(
"Unknown GreedySimplifyRegionLevel");
430 MlirGreedyRewriteDriverConfig config) {
436 MlirFrozenRewritePatternSet patterns,
437 MlirGreedyRewriteDriverConfig config) {
444 MlirFrozenRewritePatternSet patterns,
445 MlirGreedyRewriteDriverConfig config) {
451 MlirFrozenRewritePatternSet patterns) {
457 MlirFrozenRewritePatternSet patterns,
458 MlirConversionConfig config) {
464 MlirConversionTarget
target,
465 MlirFrozenRewritePatternSet patterns,
466 MlirConversionConfig config) {
476 return wrap(
new mlir::ConversionConfig());
485 mlir::DialectConversionFoldingMode cppMode;
488 cppMode = mlir::DialectConversionFoldingMode::Never;
491 cppMode = mlir::DialectConversionFoldingMode::BeforePatterns;
494 cppMode = mlir::DialectConversionFoldingMode::AfterPatterns;
497 unwrap(config)->foldingMode = cppMode;
502 switch (
unwrap(config)->foldingMode) {
503 case mlir::DialectConversionFoldingMode::Never:
505 case mlir::DialectConversionFoldingMode::BeforePatterns:
507 case mlir::DialectConversionFoldingMode::AfterPatterns:
513 MlirConversionConfig config,
bool enable) {
514 unwrap(config)->buildMaterializations = enable;
518 MlirConversionConfig config) {
519 return unwrap(config)->buildMaterializations;
535 MlirConversionPatternRewriter rewriter) {
540 MlirConversionPatternRewriter rewriter, MlirRegion region,
541 MlirTypeConverter typeConverter) {
551 return wrap(
new mlir::ConversionTarget(*
unwrap(context)));
584ConversionTarget::DynamicLegalityCallbackFn
587 return [callback, userData](
Operation *op) -> std::optional<bool> {
588 switch (callback(
wrap(op), userData)) {
596 llvm_unreachable(
"unknown MlirConversionTargetLegality");
604 assert(callback &&
"expected non-null legality callback");
608 name, wrapLegalityCallback(callback, userData));
614 assert(callback &&
"expected non-null legality callback");
616 wrapLegalityCallback(callback, userData),
unwrap(dialectName));
624 ConversionTarget::DynamicLegalityCallbackFn fn;
626 fn = wrapLegalityCallback(callback, userData);
631 MlirConversionTarget
target,
633 assert(callback &&
"expected non-null legality callback");
635 wrapLegalityCallback(callback, userData));
643 return wrap(
new mlir::TypeConverter());
647 delete unwrap(typeConverter);
651 MlirTypeConverter typeConverter,
655 [convertType, userData](
Type type) -> std::optional<Type> {
656 MlirType converted{
nullptr};
658 convertType(
wrap(type), &converted, userData);
681 void *userData, StringRef rootName,
685 : ConversionPattern(*typeConverter, rootName, benefit, context,
687 callbacks(callbacks), userData(userData) {
688 if (callbacks.construct)
689 callbacks.construct(userData);
693 if (callbacks.destruct)
694 callbacks.destruct(userData);
699 ConversionPatternRewriter &rewriter)
const override {
700 std::vector<MlirValue> wrappedOperands;
701 for (
Value val : operands)
702 wrappedOperands.push_back(
wrap(val));
703 return unwrap(callbacks.matchAndRewrite(
704 wrap(
static_cast<const mlir::ConversionPattern *
>(
this)),
wrap(op),
705 wrappedOperands.size(), wrappedOperands.data(),
wrap(&rewriter),
717 MlirStringRef rootName,
unsigned benefit, MlirContext context,
719 void *userData,
size_t nGeneratedNames,
MlirStringRef *generatedNames) {
720 std::vector<mlir::StringRef> generatedNamesVec;
721 generatedNamesVec.reserve(nGeneratedNames);
722 for (
size_t i = 0; i < nGeneratedNames; ++i)
723 generatedNamesVec.push_back(
unwrap(generatedNames[i]));
726 unwrap(context),
unwrap(typeConverter), generatedNamesVec));
752 callbacks(callbacks), userData(userData) {
753 if (callbacks.construct)
754 callbacks.construct(userData);
758 if (callbacks.destruct)
759 callbacks.destruct(userData);
764 return unwrap(callbacks.matchAndRewrite(
766 wrap(&rewriter), userData));
777 MlirStringRef rootName,
unsigned benefit, MlirContext context,
780 std::vector<mlir::StringRef> generatedNamesVec;
781 generatedNamesVec.reserve(nGeneratedNames);
782 for (
size_t i = 0; i < nGeneratedNames; ++i) {
783 generatedNamesVec.push_back(
unwrap(generatedNames[i]));
787 unwrap(context), generatedNamesVec));
807 MlirRewritePattern pattern) {
808 std::unique_ptr<mlir::RewritePattern> patternPtr(
810 pattern.ptr =
nullptr;
811 unwrap(set)->add(std::move(patternPtr));
818#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
819MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
820 return wrap(
new mlir::PDLPatternModule(
824void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
830mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
836MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
837 return wrap(
unwrap(value)->dyn_cast<mlir::Value>());
840MlirType mlirPDLValueAsType(MlirPDLValue value) {
841 return wrap(
unwrap(value)->dyn_cast<mlir::Type>());
844MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
845 return wrap(
unwrap(value)->dyn_cast<mlir::Operation *>());
848MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
849 return wrap(
unwrap(value)->dyn_cast<mlir::Attribute>());
852void mlirPDLResultListPushBackValue(MlirPDLResultList results,
857void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
861void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
862 MlirOperation value) {
866void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
867 MlirAttribute value) {
872 std::vector<MlirPDLValue> mlirValues;
873 mlirValues.reserve(values.size());
874 for (
auto &value : values) {
875 mlirValues.push_back(
wrap(&value));
880void mlirPDLPatternModuleRegisterRewriteFunction(
882 MlirPDLRewriteFunction rewriteFn,
void *userData) {
883 unwrap(pdlModule)->registerRewriteFunction(
885 [userData, rewriteFn](
PatternRewriter &rewriter, PDLResultList &results,
887 std::vector<MlirPDLValue> mlirValues =
wrap(values);
889 mlirValues.size(), mlirValues.data(),
894void mlirPDLPatternModuleRegisterConstraintFunction(
896 MlirPDLConstraintFunction constraintFn,
void *userData) {
897 unwrap(pdlModule)->registerConstraintFunction(
900 PDLResultList &results,
902 std::vector<MlirPDLValue> mlirValues =
wrap(values);
904 mlirValues.size(), mlirValues.data(),
static llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
Block represents an ordered list of Operations.
OpListType::iterator iterator
~ExternalConversionPattern()
LogicalResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const override
ExternalConversionPattern(MlirConversionPatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, TypeConverter *typeConverter, ArrayRef< StringRef > generatedNames)
ExternalRewritePattern(MlirRewritePatternCallbacks callbacks, void *userData, StringRef rootName, PatternBenefit benefit, MLIRContext *context, ArrayRef< StringRef > generatedNames)
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 ...
~ExternalRewritePattern()
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.
Block::iterator getInsertionPoint() const
Returns the current insertion point of the builder.
Block * getInsertionBlock() const
Return the block the current insertion point belongs to.
Operation is the basic unit of execution within MLIR.
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
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...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
MlirDialectConversionFoldingMode
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_AFTER_PATTERNS
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_BEFORE_PATTERNS
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_NEVER
@ MLIR_CONVERSION_TARGET_LEGALITY_LEGAL
The operation instance is legal.
@ MLIR_CONVERSION_TARGET_LEGALITY_NO_OPINION
The callback has no opinion on this instance.
@ MLIR_CONVERSION_TARGET_LEGALITY_ILLEGAL
The operation instance is illegal.
MlirLogicalResult(* MlirTypeConverterConversionCallback)(MlirType type, MlirType *convertedType, void *userData)
Callback type for type conversion functions.
MlirConversionTargetLegality(* MlirConversionTargetDynamicLegalityCallback)(MlirOperation op, void *userData)
Callback for dynamic legality checks.
MlirGreedySimplifyRegionLevel
Greedy simplify region levels.
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_DISABLED
Disable region control-flow simplification.
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_NORMAL
Run the normal simplification (e.g. dead args elimination).
@ MLIR_GREEDY_SIMPLIFY_REGION_LEVEL_AGGRESSIVE
Run extra simplifications (e.g. block merging).
MlirGreedyRewriteStrictness
Greedy rewrite strictness levels.
@ MLIR_GREEDY_REWRITE_STRICTNESS_EXISTING_AND_NEW_OPS
Only pre-existing and newly created ops are processed.
@ MLIR_GREEDY_REWRITE_STRICTNESS_EXISTING_OPS
Only pre-existing ops are processed.
@ MLIR_GREEDY_REWRITE_STRICTNESS_ANY_OP
No restrictions wrt. which ops are processed.
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
static bool mlirTypeIsNull(MlirType type)
Checks whether a type is null.
static bool mlirLogicalResultIsFailure(MlirLogicalResult res)
Checks if the given logical result represents a failure.
Include the generated interface declarations.
GreedySimplifyRegionLevel
@ 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 ®ion, 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.
A logical result value, essentially a boolean with named states.
A pointer to a sized fragment of a string, not necessarily null-terminated.