My Project
DialectConversion.h
Go to the documentation of this file.
1 //===- DialectConversion.h - MLIR dialect conversion pass -------*- C++ -*-===//
2 //
3 // Part of the MLIR 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 // This file declares a generic pass for converting between MLIR dialects.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_TRANSFORMS_DIALECTCONVERSION_H_
14 #define MLIR_TRANSFORMS_DIALECTCONVERSION_H_
15 
16 #include "mlir/IR/PatternMatch.h"
17 #include "mlir/Support/LLVM.h"
19 #include "llvm/ADT/MapVector.h"
20 #include "llvm/ADT/StringMap.h"
21 
22 namespace mlir {
23 
24 // Forward declarations.
25 class Block;
26 class ConversionPatternRewriter;
27 class FuncOp;
28 class MLIRContext;
29 class Operation;
30 class Type;
31 class Value;
32 
33 //===----------------------------------------------------------------------===//
34 // Type Conversion
35 //===----------------------------------------------------------------------===//
36 
40 public:
41  virtual ~TypeConverter() = default;
42 
46  public:
47  SignatureConversion(unsigned numOrigInputs)
48  : remappedInputs(numOrigInputs) {}
49 
52  struct InputMapping {
53  size_t inputNo, size;
55  };
56 
58  ArrayRef<Type> getConvertedTypes() const { return argTypes; }
59 
61  Optional<InputMapping> getInputMapping(unsigned input) const {
62  return remappedInputs[input];
63  }
64 
65  //===------------------------------------------------------------------===//
66  // Conversion Hooks
67  //===------------------------------------------------------------------===//
68 
71  void addInputs(unsigned origInputNo, ArrayRef<Type> types);
72 
75  void addInputs(ArrayRef<Type> types);
76 
79  void remapInput(unsigned origInputNo, unsigned newInputNo,
80  unsigned newInputCount = 1);
81 
84  void remapInput(unsigned origInputNo, Value replacement);
85 
86  private:
88  SmallVector<Optional<InputMapping>, 4> remappedInputs;
89 
91  SmallVector<Type, 4> argTypes;
92  };
93 
99 
102  virtual Type convertType(Type t) { return t; }
103 
108  SmallVectorImpl<Type> &results);
109 
112  bool isLegal(Type type);
113 
116  bool isSignatureLegal(FunctionType funcType);
117 
121  virtual LogicalResult convertSignatureArg(unsigned inputNo, Type type,
122  SignatureConversion &result);
123 
128 
136  Type resultType,
137  ArrayRef<Value> inputs,
138  Location loc) {
139  llvm_unreachable("expected 'materializeConversion' to be overridden");
140  }
141 };
142 
143 //===----------------------------------------------------------------------===//
144 // Conversion Patterns
145 //===----------------------------------------------------------------------===//
146 
152 public:
155  ConversionPattern(StringRef rootName, PatternBenefit benefit,
156  MLIRContext *ctx)
157  : RewritePattern(rootName, benefit, ctx) {}
158 
166  virtual void rewrite(Operation *op, ArrayRef<Value> operands,
167  ConversionPatternRewriter &rewriter) const {
168  llvm_unreachable("unimplemented rewrite");
169  }
170 
181  virtual void rewrite(Operation *op, ArrayRef<Value> properOperands,
182  ArrayRef<Block *> destinations,
183  ArrayRef<ArrayRef<Value>> operands,
184  ConversionPatternRewriter &rewriter) const {
185  llvm_unreachable("unimplemented rewrite for terminators");
186  }
187 
189  virtual PatternMatchResult
191  ArrayRef<Block *> destinations,
192  ArrayRef<ArrayRef<Value>> operands,
193  ConversionPatternRewriter &rewriter) const {
194  if (!match(op))
195  return matchFailure();
196  rewrite(op, properOperands, destinations, operands, rewriter);
197  return matchSuccess();
198  }
199 
201  virtual PatternMatchResult
203  ConversionPatternRewriter &rewriter) const {
204  if (!match(op))
205  return matchFailure();
206  rewrite(op, operands, rewriter);
207  return matchSuccess();
208  }
209 
211  PatternMatchResult matchAndRewrite(Operation *op,
212  PatternRewriter &rewriter) const final;
213 
214 private:
216 };
217 
221 template <typename SourceOp>
224  : ConversionPattern(SourceOp::getOperationName(), benefit, context) {}
225 
228  void rewrite(Operation *op, ArrayRef<Value> operands,
229  ConversionPatternRewriter &rewriter) const final {
230  rewrite(cast<SourceOp>(op), operands, rewriter);
231  }
232  void rewrite(Operation *op, ArrayRef<Value> properOperands,
233  ArrayRef<Block *> destinations,
234  ArrayRef<ArrayRef<Value>> operands,
235  ConversionPatternRewriter &rewriter) const final {
236  rewrite(cast<SourceOp>(op), properOperands, destinations, operands,
237  rewriter);
238  }
241  ArrayRef<Block *> destinations,
242  ArrayRef<ArrayRef<Value>> operands,
243  ConversionPatternRewriter &rewriter) const final {
244  return matchAndRewrite(cast<SourceOp>(op), properOperands, destinations,
245  operands, rewriter);
246  }
249  ConversionPatternRewriter &rewriter) const final {
250  return matchAndRewrite(cast<SourceOp>(op), operands, rewriter);
251  }
252 
253  // TODO(b/142763075): Use OperandAdaptor when it supports access to unnamed
254  // operands.
255 
258  virtual void rewrite(SourceOp op, ArrayRef<Value> operands,
259  ConversionPatternRewriter &rewriter) const {
260  llvm_unreachable("must override matchAndRewrite or a rewrite method");
261  }
262 
263  virtual void rewrite(SourceOp op, ArrayRef<Value> properOperands,
264  ArrayRef<Block *> destinations,
265  ArrayRef<ArrayRef<Value>> operands,
266  ConversionPatternRewriter &rewriter) const {
267  llvm_unreachable("unimplemented rewrite for terminators");
268  }
269 
270  virtual PatternMatchResult
271  matchAndRewrite(SourceOp op, ArrayRef<Value> properOperands,
272  ArrayRef<Block *> destinations,
273  ArrayRef<ArrayRef<Value>> operands,
274  ConversionPatternRewriter &rewriter) const {
275  if (!match(op))
276  return matchFailure();
277  rewrite(op, properOperands, destinations, operands, rewriter);
278  return matchSuccess();
279  }
280 
281  virtual PatternMatchResult
282  matchAndRewrite(SourceOp op, ArrayRef<Value> operands,
283  ConversionPatternRewriter &rewriter) const {
284  if (!match(op))
285  return matchFailure();
286  rewrite(op, operands, rewriter);
287  return matchSuccess();
288  }
289 
290 private:
292 };
293 
297  MLIRContext *ctx,
298  TypeConverter &converter);
299 
300 //===----------------------------------------------------------------------===//
301 // Conversion PatternRewriter
302 //===----------------------------------------------------------------------===//
303 
304 namespace detail {
305 struct ConversionPatternRewriterImpl;
306 } // end namespace detail
307 
312 public:
314  ~ConversionPatternRewriter() override;
315 
319  Block *
320  applySignatureConversion(Region *region,
322 
324  void replaceUsesOfBlockArgument(BlockArgument from, Value to);
325 
328  Value getRemappedValue(Value key);
329 
330  //===--------------------------------------------------------------------===//
331  // PatternRewriter Hooks
332  //===--------------------------------------------------------------------===//
333 
335  void replaceOp(Operation *op, ValueRange newValues,
336  ValueRange valuesToRemoveIfDead) override;
338 
342  void eraseOp(Operation *op) override;
343 
345  Block *splitBlock(Block *block, Block::iterator before) override;
346 
348  void mergeBlocks(Block *source, Block *dest, ValueRange argValues) override;
349 
351  void inlineRegionBefore(Region &region, Region &parent,
352  Region::iterator before) override;
354 
359  void cloneRegionBefore(Region &region, Region &parent,
360  Region::iterator before,
361  BlockAndValueMapping &mapping) override;
363 
365  Operation *insert(Operation *op) override;
366 
371  void startRootUpdate(Operation *op) override;
372 
374  void finalizeRootUpdate(Operation *op) override;
375 
377  void cancelRootUpdate(Operation *op) override;
378 
381 
382 private:
383  std::unique_ptr<detail::ConversionPatternRewriterImpl> impl;
384 };
385 
386 //===----------------------------------------------------------------------===//
387 // ConversionTarget
388 //===----------------------------------------------------------------------===//
389 
392 public:
395  enum class LegalizationAction {
397  Legal,
398 
401  Dynamic,
402 
404  Illegal,
405  };
406 
409  struct LegalOpDetails {
413  bool isRecursivelyLegal = false;
414  };
415 
418  using DynamicLegalityCallbackFn = std::function<bool(Operation *)>;
419 
420  ConversionTarget(MLIRContext &ctx) : ctx(ctx) {}
421  virtual ~ConversionTarget() = default;
422 
423  //===--------------------------------------------------------------------===//
424  // Legality Registration
425  //===--------------------------------------------------------------------===//
426 
428  void setOpAction(OperationName op, LegalizationAction action);
429  template <typename OpT> void setOpAction(LegalizationAction action) {
430  setOpAction(OperationName(OpT::getOperationName(), &ctx), action);
431  }
432 
434  template <typename OpT> void addLegalOp() {
435  setOpAction<OpT>(LegalizationAction::Legal);
436  }
437  template <typename OpT, typename OpT2, typename... OpTs> void addLegalOp() {
438  addLegalOp<OpT>();
439  addLegalOp<OpT2, OpTs...>();
440  }
441 
444  template <typename OpT> void addDynamicallyLegalOp() {
445  setOpAction<OpT>(LegalizationAction::Dynamic);
446  }
447  template <typename OpT, typename OpT2, typename... OpTs>
449  addDynamicallyLegalOp<OpT>();
450  addDynamicallyLegalOp<OpT2, OpTs...>();
451  }
452 
455  template <typename OpT>
457  OperationName opName(OpT::getOperationName(), &ctx);
458  setOpAction(opName, LegalizationAction::Dynamic);
459  setLegalityCallback(opName, callback);
460  }
461  template <typename OpT, typename OpT2, typename... OpTs>
463  addDynamicallyLegalOp<OpT>(callback);
464  addDynamicallyLegalOp<OpT2, OpTs...>(callback);
465  }
466  template <typename OpT, class Callable>
467  typename std::enable_if<!is_invocable<Callable, Operation *>::value>::type
468  addDynamicallyLegalOp(Callable &&callback) {
469  addDynamicallyLegalOp<OpT>(
470  [=](Operation *op) { return callback(cast<OpT>(op)); });
471  }
472 
475  template <typename OpT> void addIllegalOp() {
476  setOpAction<OpT>(LegalizationAction::Illegal);
477  }
478  template <typename OpT, typename OpT2, typename... OpTs> void addIllegalOp() {
479  addIllegalOp<OpT>();
480  addIllegalOp<OpT2, OpTs...>();
481  }
482 
488  template <typename OpT>
490  OperationName opName(OpT::getOperationName(), &ctx);
491  markOpRecursivelyLegal(opName, callback);
492  }
493  template <typename OpT, typename OpT2, typename... OpTs>
495  markOpRecursivelyLegal<OpT>(callback);
496  markOpRecursivelyLegal<OpT2, OpTs...>(callback);
497  }
498  template <typename OpT, class Callable>
499  typename std::enable_if<!is_invocable<Callable, Operation *>::value>::type
500  markOpRecursivelyLegal(Callable &&callback) {
501  markOpRecursivelyLegal<OpT>(
502  [=](Operation *op) { return callback(cast<OpT>(op)); });
503  }
504 
506  void setDialectAction(ArrayRef<StringRef> dialectNames,
507  LegalizationAction action);
508 
510  template <typename... Names>
511  void addLegalDialect(StringRef name, Names... names) {
512  SmallVector<StringRef, 2> dialectNames({name, names...});
513  setDialectAction(dialectNames, LegalizationAction::Legal);
514  }
515  template <typename... Args> void addLegalDialect() {
516  SmallVector<StringRef, 2> dialectNames({Args::getDialectNamespace()...});
517  setDialectAction(dialectNames, LegalizationAction::Legal);
518  }
519 
522  template <typename... Names>
523  void addDynamicallyLegalDialect(StringRef name, Names... names) {
524  SmallVector<StringRef, 2> dialectNames({name, names...});
525  setDialectAction(dialectNames, LegalizationAction::Dynamic);
526  }
527  template <typename... Args>
530  SmallVector<StringRef, 2> dialectNames({Args::getDialectNamespace()...});
531  setDialectAction(dialectNames, LegalizationAction::Dynamic);
532  if (callback)
533  setLegalityCallback(dialectNames, *callback);
534  }
535 
538  template <typename... Names>
539  void addIllegalDialect(StringRef name, Names... names) {
540  SmallVector<StringRef, 2> dialectNames({name, names...});
541  setDialectAction(dialectNames, LegalizationAction::Illegal);
542  }
543  template <typename... Args> void addIllegalDialect() {
544  SmallVector<StringRef, 2> dialectNames({Args::getDialectNamespace()...});
545  setDialectAction(dialectNames, LegalizationAction::Illegal);
546  }
547 
548  //===--------------------------------------------------------------------===//
549  // Legality Querying
550  //===--------------------------------------------------------------------===//
551 
553  Optional<LegalizationAction> getOpAction(OperationName op) const;
554 
559 
560 protected:
563  virtual bool isDynamicallyLegal(Operation *op) const {
564  llvm_unreachable(
565  "targets with custom legalization must override 'isDynamicallyLegal'");
566  }
567 
568 private:
570  void setLegalityCallback(OperationName name,
571  const DynamicLegalityCallbackFn &callback);
572 
574  void setLegalityCallback(ArrayRef<StringRef> dialects,
575  const DynamicLegalityCallbackFn &callback);
576 
579  void markOpRecursivelyLegal(OperationName name,
580  const DynamicLegalityCallbackFn &callback);
581 
583  struct LegalizationInfo {
585  LegalizationAction action;
586 
588  bool isRecursivelyLegal;
589  };
590 
592  Optional<LegalizationInfo> getOpInfo(OperationName op) const;
593 
596  llvm::MapVector<OperationName, LegalizationInfo> legalOperations;
597 
600 
604 
607  llvm::StringMap<LegalizationAction> legalDialects;
608 
610  llvm::StringMap<DynamicLegalityCallbackFn> dialectLegalityFns;
611 
613  MLIRContext &ctx;
614 };
615 
616 //===----------------------------------------------------------------------===//
617 // Op Conversion Entry Points
618 //===----------------------------------------------------------------------===//
619 
625 
632 LLVM_NODISCARD LogicalResult
634  const OwningRewritePatternList &patterns,
635  TypeConverter *converter = nullptr);
636 LLVM_NODISCARD LogicalResult
638  const OwningRewritePatternList &patterns,
639  TypeConverter *converter = nullptr);
640 
646 LLVM_NODISCARD LogicalResult
648  const OwningRewritePatternList &patterns,
649  TypeConverter *converter = nullptr);
650 LLVM_NODISCARD LogicalResult
652  const OwningRewritePatternList &patterns,
653  TypeConverter *converter = nullptr);
654 
667  const OwningRewritePatternList &patterns,
668  DenseSet<Operation *> &convertedOps, TypeConverter *converter = nullptr);
670  Operation *op, ConversionTarget &target,
671  const OwningRewritePatternList &patterns,
672  DenseSet<Operation *> &convertedOps, TypeConverter *converter = nullptr);
673 } // end namespace mlir
674 
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
Definition: Region.h:23
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
Definition: LLVM.h:46
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
Definition: LLVM.h:48
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: LLVM.h:40
Definition: DialectConversion.h:409
void addDynamicallyLegalDialect(StringRef name, Names... names)
Definition: DialectConversion.h:523
Definition: DialectConversion.h:222
virtual void cloneRegionBefore(Region &region, 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: LLVM.h:34
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
Value replacementValue
Definition: DialectConversion.h:54
Definition: PatternMatch.h:142
Definition: LogicalResult.h:18
Definition: DialectConversion.h:45
Definition: LLVM.h:37
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
Definition: Types.h:84
void addIllegalOp()
Definition: DialectConversion.h:475
Definition: Value.h:38
virtual void inlineRegionBefore(Region &region, 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
Definition: LLVM.h:35
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
size_t size
Definition: DialectConversion.h:53
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
size_t inputNo
Definition: DialectConversion.h:53
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