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));
94 return {{
nullptr}, {
nullptr}};
96 MlirOperation operationAfter = ip.
getPoint() == block->
end()
97 ? MlirOperation{
nullptr}
99 return {
wrap(block), operationAfter};
105 unwrap(rewriter)->clearInsertionPoint();
110 unwrap(rewriter)->setInsertionPointToEnd(block);
112 unwrap(rewriter)->setInsertionPoint(
121 MlirBlock insertBefore,
123 MlirType
const *argTypes,
124 MlirLocation
const *locations) {
129 return wrap(
unwrap(rewriter)->createBlock(
unwrap(insertBefore), unwrappedArgs,
152 MlirIRMapping mapping) {
157 MlirRegion region, MlirBlock before) {
167 MlirRegion region, MlirBlock before) {
173 MlirValue
const *values) {
181 MlirOperation newOp) {
194 MlirBlock source, MlirOperation op,
196 MlirValue
const *argValues) {
205 MlirBlock dest,
intptr_t nArgValues,
206 MlirValue
const *argValues) {
213 MlirOperation existingOp) {
218 MlirOperation existingOp) {
223 MlirBlock existingBlock) {
243 MlirValue from, MlirValue to) {
249 MlirValue
const *from,
250 MlirValue
const *to) {
255 unwrap(rewriter)->replaceAllUsesWith(unwrappedFromVals, unwrappedToVals);
261 MlirValue
const *to) {
264 unwrap(rewriter)->replaceAllOpUsesWith(
unwrap(from), unwrappedToVals);
276 MlirValue
const *newValues,
280 unwrap(rewriter)->replaceOpUsesWithinBlock(
unwrap(op), unwrappedVals,
285 MlirValue from, MlirValue to,
286 MlirOperation exceptedUser) {
313 MlirAttribute value, MlirType type,
323MlirFrozenRewritePatternSet
340 assert(config.ptr &&
"unexpected null config");
353 MlirGreedyRewriteDriverConfig config) {
358 MlirGreedyRewriteDriverConfig config,
int64_t maxIterations) {
363 MlirGreedyRewriteDriverConfig config,
int64_t maxNumRewrites) {
368 MlirGreedyRewriteDriverConfig config,
bool useTopDownTraversal) {
373 MlirGreedyRewriteDriverConfig config,
bool enable) {
378 MlirGreedyRewriteDriverConfig config,
381 switch (strictness) {
413 MlirGreedyRewriteDriverConfig config,
bool enable) {
418 MlirGreedyRewriteDriverConfig config) {
423 MlirGreedyRewriteDriverConfig config) {
428 MlirGreedyRewriteDriverConfig config) {
433 MlirGreedyRewriteDriverConfig config) {
438 MlirGreedyRewriteDriverConfig config) {
440 switch (cppStrictness) {
448 llvm_unreachable(
"Unknown GreedyRewriteStrictness");
453 MlirGreedyRewriteDriverConfig config) {
464 llvm_unreachable(
"Unknown GreedySimplifyRegionLevel");
468 MlirGreedyRewriteDriverConfig config) {
474 MlirFrozenRewritePatternSet patterns,
475 MlirGreedyRewriteDriverConfig config) {
482 MlirFrozenRewritePatternSet patterns,
483 MlirGreedyRewriteDriverConfig config) {
489 MlirFrozenRewritePatternSet patterns) {
495 MlirFrozenRewritePatternSet patterns,
496 MlirConversionConfig config) {
502 MlirConversionTarget
target,
503 MlirFrozenRewritePatternSet patterns,
504 MlirConversionConfig config) {
514 return wrap(
new mlir::ConversionConfig());
523 mlir::DialectConversionFoldingMode cppMode;
526 cppMode = mlir::DialectConversionFoldingMode::Never;
529 cppMode = mlir::DialectConversionFoldingMode::BeforePatterns;
532 cppMode = mlir::DialectConversionFoldingMode::AfterPatterns;
535 unwrap(config)->foldingMode = cppMode;
540 switch (
unwrap(config)->foldingMode) {
541 case mlir::DialectConversionFoldingMode::Never:
543 case mlir::DialectConversionFoldingMode::BeforePatterns:
545 case mlir::DialectConversionFoldingMode::AfterPatterns:
551 MlirConversionConfig config,
bool enable) {
552 unwrap(config)->buildMaterializations = enable;
556 MlirConversionConfig config) {
557 return unwrap(config)->buildMaterializations;
573 MlirConversionPatternRewriter rewriter) {
578 MlirConversionPatternRewriter rewriter, MlirRegion region,
579 MlirTypeConverter typeConverter) {
585 MlirConversionPatternRewriter rewriter, MlirOperation op,
intptr_t nRanges,
586 intptr_t *rangeSizes, MlirValue *values) {
588 ranges.reserve(nRanges);
589 MlirValue *cur = values;
590 for (
intptr_t i = 0; i < nRanges; ++i) {
593 range.reserve(rangeSize);
595 range.push_back(
unwrap(*cur));
596 ranges.push_back(std::move(range));
598 unwrap(rewriter)->replaceOpWithMultiple(
unwrap(op), std::move(ranges));
606 return wrap(
new mlir::ConversionTarget(*
unwrap(context)));
639ConversionTarget::DynamicLegalityCallbackFn
642 return [callback, userData](
Operation *op) -> std::optional<bool> {
643 switch (callback(
wrap(op), userData)) {
651 llvm_unreachable(
"unknown MlirConversionTargetLegality");
659 assert(callback &&
"expected non-null legality callback");
663 name, wrapLegalityCallback(callback, userData));
669 assert(callback &&
"expected non-null legality callback");
671 wrapLegalityCallback(callback, userData),
unwrap(dialectName));
679 ConversionTarget::DynamicLegalityCallbackFn fn;
681 fn = wrapLegalityCallback(callback, userData);
686 MlirConversionTarget
target,
688 assert(callback &&
"expected non-null legality callback");
690 wrapLegalityCallback(callback, userData));
698 return wrap(
new mlir::TypeConverter());
702 delete unwrap(typeConverter);
706 MlirTypeConverter typeConverter,
711 -> std::optional<LogicalResult> {
712 MlirType converted{
nullptr};
714 convertType(
wrap(type), &converted, userData);
717 results.push_back(
unwrap(converted));
727 llvm_unreachable(
"unknown MlirTypeConverterConversionStatus");
737 MlirTypeConverter typeConverter,
742 -> std::optional<LogicalResult> {
743 size_t numPriorResults = results.size();
746 convertType(
wrap(type), wrappedResults, userData);
754 results.truncate(numPriorResults);
760 results.truncate(numPriorResults);
763 llvm_unreachable(
"unknown MlirTypeConverterConversionStatus");
775 wrappedInputs.reserve(inputs.size());
776 for (
Value v : inputs)
777 wrappedInputs.push_back(
wrap(v));
778 return wrappedInputs;
782wrapSourceMaterializationCallback(
789 static_cast<intptr_t>(wrappedInputs.size()),
790 wrappedInputs.data(),
wrap(loc), userData);
796wrapTargetMaterializationCallback(
803 static_cast<intptr_t>(wrappedInputs.size()),
804 wrappedInputs.data(),
wrap(loc),
wrap(originalType), userData);
811wrap1ToNTargetMaterializationCallback(
818 wrappedOutputTypes.reserve(outputTypes.size());
819 for (
Type t : outputTypes)
820 wrappedOutputTypes.push_back(
wrap(t));
826 static_cast<intptr_t>(wrappedOutputTypes.size()),
827 wrappedOutputTypes.data(),
static_cast<intptr_t>(wrappedInputs.size()),
828 wrappedInputs.data(),
wrap(loc),
wrap(originalType),
829 wrappedOutputs.data(), userData);
833 outputs.reserve(wrappedOutputs.size());
834 for (MlirValue v : wrappedOutputs) {
837 assert(!mlirValueIsNull(v) &&
838 "1:N target materialization succeeded but left one of the outputs "
840 outputs.push_back(
unwrap(v));
848 MlirTypeConverter typeConverter,
850 assert(callback &&
"expected non-null materialization callback");
852 ->addSourceMaterialization(
853 wrapSourceMaterializationCallback(callback, userData));
857 MlirTypeConverter typeConverter,
859 assert(callback &&
"expected non-null materialization callback");
861 ->addTargetMaterialization(
862 wrapTargetMaterializationCallback(callback, userData));
866 MlirTypeConverter typeConverter,
869 assert(callback &&
"expected non-null materialization callback");
871 ->addTargetMaterialization(
872 wrap1ToNTargetMaterializationCallback(callback, userData));
884 void *userData, StringRef rootName,
888 : ConversionPattern(*typeConverter, rootName, benefit, context,
890 callbacks(callbacks), userData(userData) {
891 if (callbacks.construct)
892 callbacks.construct(userData);
896 if (callbacks.destruct)
897 callbacks.destruct(userData);
902 ConversionPatternRewriter &rewriter)
const override {
903 std::vector<MlirValue> wrappedOperands;
904 for (
Value val : operands)
905 wrappedOperands.push_back(
wrap(val));
906 return unwrap(callbacks.matchAndRewrite(
907 wrap(
static_cast<const mlir::ConversionPattern *
>(
this)),
wrap(op),
908 wrappedOperands.size(), wrappedOperands.data(),
wrap(&rewriter),
914 ConversionPatternRewriter &rewriter)
const override {
917 if (!callbacks.matchAndRewrite1ToN)
918 return dispatchTo1To1(*
this, op, operands, rewriter);
920 rangeSizes.reserve(operands.size());
921 std::vector<MlirValue> wrappedOperands;
923 rangeSizes.push_back(
static_cast<intptr_t>(range.size()));
924 for (
Value val : range)
925 wrappedOperands.push_back(
wrap(val));
927 return unwrap(callbacks.matchAndRewrite1ToN(
928 wrap(
static_cast<const mlir::ConversionPattern *
>(
this)),
wrap(op),
929 static_cast<intptr_t>(rangeSizes.size()), rangeSizes.data(),
930 static_cast<intptr_t>(wrappedOperands.size()), wrappedOperands.data(),
931 wrap(&rewriter), userData));
942 MlirStringRef rootName,
unsigned benefit, MlirContext context,
944 void *userData,
size_t nGeneratedNames,
MlirStringRef *generatedNames) {
945 std::vector<mlir::StringRef> generatedNamesVec;
946 generatedNamesVec.reserve(nGeneratedNames);
947 for (
size_t i = 0; i < nGeneratedNames; ++i)
948 generatedNamesVec.push_back(
unwrap(generatedNames[i]));
951 unwrap(context),
unwrap(typeConverter), generatedNamesVec));
977 callbacks(callbacks), userData(userData) {
978 if (callbacks.construct)
979 callbacks.construct(userData);
983 if (callbacks.destruct)
984 callbacks.destruct(userData);
989 return unwrap(callbacks.matchAndRewrite(
991 wrap(&rewriter), userData));
1002 MlirStringRef rootName,
unsigned benefit, MlirContext context,
1005 std::vector<mlir::StringRef> generatedNamesVec;
1006 generatedNamesVec.reserve(nGeneratedNames);
1007 for (
size_t i = 0; i < nGeneratedNames; ++i) {
1008 generatedNamesVec.push_back(
unwrap(generatedNames[i]));
1012 unwrap(context), generatedNamesVec));
1032 MlirRewritePattern pattern) {
1033 std::unique_ptr<mlir::RewritePattern> patternPtr(
1035 pattern.ptr =
nullptr;
1036 unwrap(set)->add(std::move(patternPtr));
1043#if MLIR_ENABLE_PDL_IN_PATTERNMATCH
1044MlirPDLPatternModule mlirPDLPatternModuleFromModule(MlirModule op) {
1045 return wrap(
new mlir::PDLPatternModule(
1049void mlirPDLPatternModuleDestroy(MlirPDLPatternModule op) {
1054MlirRewritePatternSet
1055mlirRewritePatternSetFromPDLPatternModule(MlirPDLPatternModule op) {
1061MlirValue mlirPDLValueAsValue(MlirPDLValue value) {
1062 return wrap(
unwrap(value)->dyn_cast<mlir::Value>());
1065MlirType mlirPDLValueAsType(MlirPDLValue value) {
1066 return wrap(
unwrap(value)->dyn_cast<mlir::Type>());
1069MlirOperation mlirPDLValueAsOperation(MlirPDLValue value) {
1070 return wrap(
unwrap(value)->dyn_cast<mlir::Operation *>());
1073MlirAttribute mlirPDLValueAsAttribute(MlirPDLValue value) {
1074 return wrap(
unwrap(value)->dyn_cast<mlir::Attribute>());
1077void mlirPDLResultListPushBackValue(MlirPDLResultList results,
1082void mlirPDLResultListPushBackType(MlirPDLResultList results, MlirType value) {
1086void mlirPDLResultListPushBackOperation(MlirPDLResultList results,
1087 MlirOperation value) {
1091void mlirPDLResultListPushBackAttribute(MlirPDLResultList results,
1092 MlirAttribute value) {
1097 std::vector<MlirPDLValue> mlirValues;
1098 mlirValues.reserve(values.size());
1099 for (
auto &value : values) {
1100 mlirValues.push_back(
wrap(&value));
1105void mlirPDLPatternModuleRegisterRewriteFunction(
1107 MlirPDLRewriteFunction rewriteFn,
void *userData) {
1108 unwrap(pdlModule)->registerRewriteFunction(
1110 [userData, rewriteFn](
PatternRewriter &rewriter, PDLResultList &results,
1112 std::vector<MlirPDLValue> mlirValues =
wrap(values);
1114 mlirValues.size(), mlirValues.data(),
1119void mlirPDLPatternModuleRegisterConstraintFunction(
1121 MlirPDLConstraintFunction constraintFn,
void *userData) {
1122 unwrap(pdlModule)->registerConstraintFunction(
1125 PDLResultList &results,
1127 std::vector<MlirPDLValue> mlirValues =
wrap(values);
1129 mlirValues.size(), mlirValues.data(),
static Operation * materializeConstant(Dialect *dialect, OpBuilder &builder, Attribute value, Type type, Location loc)
A utility function used to materialize a constant for a given attribute and type.
memberIdxs push_back(ArrayAttr::get(parser.getContext(), values))
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
LogicalResult matchAndRewrite(Operation *op, ArrayRef< ValueRange > 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 ...
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
This class represents a saved insertion point.
Block::iterator getPoint() const
bool isSet() const
Returns true if this insert point is set.
This class helps build 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...
This class provides an abstraction over the various different ranges of value types.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
MlirTypeConverterConversionStatus(* MlirTypeConverterConversionCallback)(MlirType type, MlirType *convertedType, void *userData)
Callback type for type conversion functions.
MlirLogicalResult(* MlirTypeConverter1ToNTargetMaterializationCallback)(MlirRewriterBase rewriter, intptr_t nOutputTypes, MlirType *outputTypes, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, MlirType originalType, MlirValue *outputs, void *userData)
Callback type for 1:N target materializations.
MlirDialectConversionFoldingMode
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_AFTER_PATTERNS
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_BEFORE_PATTERNS
@ MLIR_DIALECT_CONVERSION_FOLDING_MODE_NEVER
MlirValue(* MlirTypeConverterSourceMaterializationCallback)(MlirRewriterBase rewriter, MlirType outputType, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, void *userData)
Callback type for source materializations.
MlirTypeConverterConversionStatus
Outcome of a type conversion callback.
@ MlirTypeConverterConversionStatusFailure
The conversion failed; no further conversion function will be tried.
@ MlirTypeConverterConversionStatusDeclined
The conversion was declined; another registered conversion function may be tried.
@ MlirTypeConverterConversionStatusSuccess
The type was converted successfully.
@ 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.
MlirTypeConverterConversionStatus(* MlirTypeConverter1ToNConversionCallback)(MlirType type, MlirTypeConverterConversionResults results, void *userData)
Callback type for 1:N type conversion functions.
MlirValue(* MlirTypeConverterTargetMaterializationCallback)(MlirRewriterBase rewriter, MlirType outputType, intptr_t nInputs, MlirValue *inputs, MlirLocation loc, MlirType originalType, void *userData)
Callback type for 1:1 target materializations.
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 mlirBlockIsNull(MlirBlock block)
Checks whether a block 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 saved insertion point: a (block, operationAfter) pair.
MlirOperation operationAfter
A pointer to a sized fragment of a string, not necessarily null-terminated.
Opaque accumulator for the result types of a 1:N type conversion.
Eliminates variable at the specified position using Fourier-Motzkin variable elimination.