================ @@ -1053,3 +1055,241 @@ LogicalResult mlir::applyOpPatternsAndFold( }); return converged; } + +//===----------------------------------------------------------------------===// +// One-Shot Dialect Conversion Infrastructure +//===----------------------------------------------------------------------===// + +namespace { +/// A conversion rewriter for the One-Shot Dialect Conversion. This rewriter +/// immediately materializes all IR changes. It derives from +/// `ConversionPatternRewriter` so that the existing conversion patterns can +/// be used with the One-Shot Dialect Conversion. +class OneShotConversionPatternRewriter : public ConversionPatternRewriter { +public: + OneShotConversionPatternRewriter(MLIRContext *ctx) + : ConversionPatternRewriter(ctx) {} + + bool canRecoverFromRewriteFailure() const override { return false; } + + void replaceOp(Operation *op, ValueRange newValues) override; + + void replaceOp(Operation *op, Operation *newOp) override { + replaceOp(op, newOp->getResults()); + } + + void eraseOp(Operation *op) override { PatternRewriter::eraseOp(op); } + + void eraseBlock(Block *block) override { PatternRewriter::eraseBlock(block); } + + void inlineBlockBefore(Block *source, Block *dest, Block::iterator before, + ValueRange argValues = std::nullopt) override { + PatternRewriter::inlineBlockBefore(source, dest, before, argValues); + } + using PatternRewriter::inlineBlockBefore; + + void startOpModification(Operation *op) override { + PatternRewriter::startOpModification(op); + } + + void finalizeOpModification(Operation *op) override { + PatternRewriter::finalizeOpModification(op); + } + + void cancelOpModification(Operation *op) override { + PatternRewriter::cancelOpModification(op); + } + + void setCurrentTypeConverter(const TypeConverter *converter) override { + typeConverter = converter; + } + + const TypeConverter *getCurrentTypeConverter() const override { + return typeConverter; + } + + LogicalResult getAdapterOperands(StringRef valueDiagTag, + std::optional<Location> inputLoc, + ValueRange values, + SmallVector<Value> &remapped) override; + +private: + /// Build an unrealized_conversion_cast op or look it up in the cache. + Value buildUnrealizedConversionCast(Location loc, Type type, Value value); + + /// The current type converter. + const TypeConverter *typeConverter; + + /// A cache for unrealized_conversion_casts. To ensure that identical casts + /// are not built multiple times. + DenseMap<std::pair<Value, Type>, Value> castCache; ---------------- ftynse wrote:
Hmm, is it possible that the same original value is casted to multiple _different_ types within the same conversion? Type converter is currently unaware of the surrounding context, so it's unclear to me how that could happen. https://github.com/llvm/llvm-project/pull/93412 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits