13 #ifndef MLIR_TRANSFORMS_DIALECTCONVERSION_H_ 14 #define MLIR_TRANSFORMS_DIALECTCONVERSION_H_ 19 #include "llvm/ADT/MapVector.h" 20 #include "llvm/ADT/StringMap.h" 26 class ConversionPatternRewriter;
48 : remappedInputs(numOrigInputs) {}
62 return remappedInputs[input];
79 void remapInput(
unsigned origInputNo,
unsigned newInputNo,
80 unsigned newInputCount = 1);
139 llvm_unreachable(
"expected 'materializeConversion' to be overridden");
168 llvm_unreachable(
"unimplemented rewrite");
185 llvm_unreachable(
"unimplemented rewrite for terminators");
195 return matchFailure();
196 rewrite(op, properOperands, destinations, operands, rewriter);
197 return matchSuccess();
205 return matchFailure();
206 rewrite(op, operands, rewriter);
207 return matchSuccess();
221 template <
typename SourceOp>
230 rewrite(cast<SourceOp>(op), operands, rewriter);
236 rewrite(cast<SourceOp>(op), properOperands, destinations, operands,
244 return matchAndRewrite(cast<SourceOp>(op), properOperands, destinations,
250 return matchAndRewrite(cast<SourceOp>(op), operands, rewriter);
260 llvm_unreachable(
"must override matchAndRewrite or a rewrite method");
267 llvm_unreachable(
"unimplemented rewrite for terminators");
276 return matchFailure();
277 rewrite(op, properOperands, destinations, operands, rewriter);
278 return matchSuccess();
285 return matchFailure();
286 rewrite(op, operands, rewriter);
287 return matchSuccess();
305 struct ConversionPatternRewriterImpl;
320 applySignatureConversion(
Region *region,
371 void startRootUpdate(
Operation *op)
override;
374 void finalizeRootUpdate(
Operation *op)
override;
377 void cancelRootUpdate(
Operation *op)
override;
383 std::unique_ptr<detail::ConversionPatternRewriterImpl> impl;
413 bool isRecursivelyLegal =
false;
430 setOpAction(
OperationName(OpT::getOperationName(), &ctx), action);
435 setOpAction<OpT>(LegalizationAction::Legal);
437 template <
typename OpT,
typename OpT2,
typename... OpTs>
void addLegalOp() {
439 addLegalOp<OpT2, OpTs...>();
445 setOpAction<OpT>(LegalizationAction::Dynamic);
447 template <
typename OpT,
typename OpT2,
typename... OpTs>
449 addDynamicallyLegalOp<OpT>();
450 addDynamicallyLegalOp<OpT2, OpTs...>();
455 template <
typename OpT>
458 setOpAction(opName, LegalizationAction::Dynamic);
459 setLegalityCallback(opName, callback);
461 template <
typename OpT,
typename OpT2,
typename... OpTs>
463 addDynamicallyLegalOp<OpT>(callback);
464 addDynamicallyLegalOp<OpT2, OpTs...>(callback);
466 template <
typename OpT,
class Callable>
467 typename std::enable_if<!is_invocable<Callable, Operation *>::value>::type
469 addDynamicallyLegalOp<OpT>(
470 [=](
Operation *op) {
return callback(cast<OpT>(op)); });
476 setOpAction<OpT>(LegalizationAction::Illegal);
478 template <
typename OpT,
typename OpT2,
typename... OpTs>
void addIllegalOp() {
480 addIllegalOp<OpT2, OpTs...>();
488 template <
typename OpT>
491 markOpRecursivelyLegal(opName, callback);
493 template <
typename OpT,
typename OpT2,
typename... OpTs>
495 markOpRecursivelyLegal<OpT>(callback);
496 markOpRecursivelyLegal<OpT2, OpTs...>(callback);
498 template <
typename OpT,
class Callable>
499 typename std::enable_if<!is_invocable<Callable, Operation *>::value>::type
501 markOpRecursivelyLegal<OpT>(
502 [=](
Operation *op) {
return callback(cast<OpT>(op)); });
510 template <
typename... Names>
513 setDialectAction(dialectNames, LegalizationAction::Legal);
517 setDialectAction(dialectNames, LegalizationAction::Legal);
522 template <
typename... Names>
525 setDialectAction(dialectNames, LegalizationAction::Dynamic);
527 template <
typename... Args>
531 setDialectAction(dialectNames, LegalizationAction::Dynamic);
533 setLegalityCallback(dialectNames, *callback);
538 template <
typename... Names>
541 setDialectAction(dialectNames, LegalizationAction::Illegal);
545 setDialectAction(dialectNames, LegalizationAction::Illegal);
565 "targets with custom legalization must override 'isDynamicallyLegal'");
583 struct LegalizationInfo {
588 bool isRecursivelyLegal;
596 llvm::MapVector<OperationName, LegalizationInfo> legalOperations;
607 llvm::StringMap<LegalizationAction> legalDialects;
610 llvm::StringMap<DynamicLegalityCallbackFn> dialectLegalityFns;
675 #endif // MLIR_TRANSFORMS_DIALECTCONVERSION_H_ Definition: InferTypeOpInterface.cpp:20
void addDynamicallyLegalOp(const DynamicLegalityCallbackFn &callback)
Definition: DialectConversion.h:462
virtual Type convertType(Type t)
Definition: DialectConversion.h:102
virtual Operation * materializeConversion(PatternRewriter &rewriter, Type resultType, ArrayRef< Value > inputs, Location loc)
Definition: DialectConversion.h:135
ArrayRef< Type > getConvertedTypes() const
Return the argument types for the new signature.
Definition: DialectConversion.h:58
void addDynamicallyLegalOp()
Definition: DialectConversion.h:444
void rewrite(Operation *op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const final
Definition: DialectConversion.h:232
Definition: PatternMatch.h:260
Definition: Operation.h:27
void addDynamicallyLegalOp()
Definition: DialectConversion.h:448
Definition: Attributes.h:139
LLVM_NODISCARD LogicalResult applyAnalysisConversion(ArrayRef< Operation *> ops, ConversionTarget &target, const OwningRewritePatternList &patterns, DenseSet< Operation *> &convertedOps, TypeConverter *converter=nullptr)
Definition: DialectConversion.cpp:1831
virtual LogicalResult convertType(Type t, SmallVectorImpl< Type > &results)
This hooks allows for converting a type.
Definition: DialectConversion.cpp:1564
void populateFuncOpTypeConversionPattern(OwningRewritePatternList &patterns, MLIRContext *ctx, TypeConverter &converter)
Definition: DialectConversion.cpp:1655
Block represents an ordered list of Operations.
Definition: Block.h:21
std::enable_if<!is_invocable< Callable, Operation * >::value >::type markOpRecursivelyLegal(Callable &&callback)
Definition: DialectConversion.h:500
std::function< bool(Operation *)> DynamicLegalityCallbackFn
Definition: DialectConversion.h:418
void addIllegalDialect()
Definition: DialectConversion.h:543
virtual PatternMatchResult matchAndRewrite(Operation *op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const
Hook for derived classes to implement combined matching and rewriting.
Definition: DialectConversion.h:190
Definition: DialectConversion.h:151
void addDynamicallyLegalDialect(Optional< DynamicLegalityCallbackFn > callback=llvm::None)
Definition: DialectConversion.h:528
Function types map from a list of inputs to a list of results.
Definition: Types.h:190
BlockListType::iterator iterator
Definition: Region.h:41
PatternMatchResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const final
Hook for derived classes to implement combined matching and rewriting.
Definition: DialectConversion.h:248
void addDynamicallyLegalOp(const DynamicLegalityCallbackFn &callback)
Definition: DialectConversion.h:456
bool isSignatureLegal(FunctionType funcType)
Definition: DialectConversion.cpp:1594
void addLegalDialect()
Definition: DialectConversion.h:515
void setOpAction(LegalizationAction action)
Definition: DialectConversion.h:429
Definition: DialectConversion.h:409
void addDynamicallyLegalDialect(StringRef name, Names... names)
Definition: DialectConversion.h:523
Definition: DialectConversion.h:222
virtual void cloneRegionBefore(Region ®ion, Region &parent, Region::iterator before, BlockAndValueMapping &mapping)
Definition: PatternMatch.cpp:159
virtual PatternMatchResult matchAndRewrite(SourceOp op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:271
Definition: Location.h:52
ConversionTarget(MLIRContext &ctx)
Definition: DialectConversion.h:420
virtual LogicalResult convertSignatureArg(unsigned inputNo, Type type, SignatureConversion &result)
This hook allows for converting a specific argument of a signature.
Definition: DialectConversion.cpp:1601
void addLegalOp()
Definition: DialectConversion.h:437
Definition: PatternMatch.h:142
Definition: LogicalResult.h:18
Definition: DialectConversion.h:45
virtual void rewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:166
OpListType::iterator iterator
Definition: Block.h:107
PatternMatchResult matchAndRewrite(Operation *op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const final
Hook for derived classes to implement combined matching and rewriting.
Definition: DialectConversion.h:240
void remapInput(unsigned origInputNo, unsigned newInputNo, unsigned newInputCount=1)
Definition: DialectConversion.cpp:1545
LegalizationAction
Definition: DialectConversion.h:395
Definition: PatternMatch.h:29
LLVM_NODISCARD LogicalResult applyPartialConversion(ArrayRef< Operation *> ops, ConversionTarget &target, const OwningRewritePatternList &patterns, TypeConverter *converter=nullptr)
Definition: DialectConversion.cpp:1793
Definition: DialectConversion.cpp:468
Optional< InputMapping > getInputMapping(unsigned input) const
Get the input mapping for the given argument.
Definition: DialectConversion.h:61
virtual bool isDynamicallyLegal(Operation *op) const
Definition: DialectConversion.h:563
virtual void rewrite(Operation *op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:181
bool isLegal(Type type)
Definition: DialectConversion.cpp:1586
Block arguments are values.
Definition: Value.h:235
virtual ~TypeConverter()=default
void addLegalDialect(StringRef name, Names... names)
Register the operations of the given dialects as legal.
Definition: DialectConversion.h:511
LLVM_NODISCARD LogicalResult applyFullConversion(ArrayRef< Operation *> ops, ConversionTarget &target, const OwningRewritePatternList &patterns, TypeConverter *converter=nullptr)
Definition: DialectConversion.cpp:1811
void addIllegalOp()
Definition: DialectConversion.h:475
virtual void inlineRegionBefore(Region ®ion, Region &parent, Region::iterator before)
Definition: PatternMatch.cpp:147
virtual PatternMatchResult matchAndRewrite(SourceOp op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:282
Definition: BlockAndValueMapping.h:26
void markOpRecursivelyLegal(const DynamicLegalityCallbackFn &callback={})
Definition: DialectConversion.h:489
LogicalResult convertTypes(ArrayRef< Type > types, SmallVectorImpl< Type > &results)
Definition: DialectConversion.cpp:1576
OpConversionPattern(MLIRContext *context, PatternBenefit benefit=1)
Definition: DialectConversion.h:223
virtual void rewrite(SourceOp op, ArrayRef< Value > properOperands, ArrayRef< Block *> destinations, ArrayRef< ArrayRef< Value >> operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:263
void addIllegalOp()
Definition: DialectConversion.h:478
Definition: PatternMatch.h:418
void addIllegalDialect(StringRef name, Names... names)
Definition: DialectConversion.h:539
Definition: DialectConversion.h:39
virtual void rewrite(SourceOp op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const
Definition: DialectConversion.h:258
Optional< SignatureConversion > convertBlockSignature(Block *block)
Definition: DialectConversion.cpp:1664
void addLegalOp()
Register the given operations as legal.
Definition: DialectConversion.h:434
Definition: MLIRContext.h:34
std::enable_if<!is_invocable< Callable, Operation * >::value >::type addDynamicallyLegalOp(Callable &&callback)
Definition: DialectConversion.h:468
Definition: DialectConversion.h:311
void rewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const final
Definition: DialectConversion.h:228
virtual PatternMatchResult matchAndRewrite(Operation *op, ArrayRef< Value > operands, ConversionPatternRewriter &rewriter) const
Hook for derived classes to implement combined matching and rewriting.
Definition: DialectConversion.h:202
virtual void replaceOp(Operation *op, ValueRange newValues, ValueRange valuesToRemoveIfDead)
Definition: PatternMatch.cpp:79
Definition: StandardTypes.h:63
void markOpRecursivelyLegal(const DynamicLegalityCallbackFn &callback={})
Definition: DialectConversion.h:494
This class describes a specific conversion target.
Definition: DialectConversion.h:391
SignatureConversion(unsigned numOrigInputs)
Definition: DialectConversion.h:47
Definition: OperationSupport.h:203
Definition: OperationSupport.h:640
void addInputs(unsigned origInputNo, ArrayRef< Type > types)
Definition: DialectConversion.cpp:1528
virtual void rewrite(Operation *op, std::unique_ptr< PatternState > state, PatternRewriter &rewriter) const
Definition: PatternMatch.cpp:41
ConversionPattern(StringRef rootName, PatternBenefit benefit, MLIRContext *ctx)
Definition: DialectConversion.h:155