https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/158075
>From 8931f7667eb1a533f67cf3f97db771315f356c6c Mon Sep 17 00:00:00 2001 From: Matthias Springer <m...@m-sp.org> Date: Wed, 3 Sep 2025 07:35:47 +0000 Subject: [PATCH] proto --- .../Transforms/Utils/DialectConversion.cpp | 46 +++++++------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp index a286c8d9705dd..4964b69bfa70c 100644 --- a/mlir/lib/Transforms/Utils/DialectConversion.cpp +++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp @@ -1618,6 +1618,8 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion( if (!inputMap) { // This block argument was dropped and no replacement value was provided. // Materialize a replacement value "out of thin air". + // Note: Materialization must be built here because we cannot find a + // valid insertion point in the new block. (Will point to the old block.) Value mat = buildUnresolvedMaterialization( MaterializationKind::Source, @@ -1725,15 +1727,6 @@ Value ConversionPatternRewriterImpl::findOrBuildReplacementValue( // (regardless of the type) and build a source materialization to the // original type. repl = lookupOrNull(value); - if (repl.empty()) { - // No replacement value is registered in the mapping. This means that the - // value is dropped and no longer needed. (If the value were still needed, - // a source materialization producing a replacement value "out of thin air" - // would have already been created during `replaceOp` or - // `applySignatureConversion`.) - return Value(); - } - // Note: `computeInsertPoint` computes the "earliest" insertion point at // which all values in `repl` are defined. It is important to emit the // materialization at that location because the same materialization may be @@ -1741,13 +1734,19 @@ Value ConversionPatternRewriterImpl::findOrBuildReplacementValue( // in the conversion value mapping.) The insertion point of the // materialization must be valid for all future users that may be created // later in the conversion process. - Value castValue = - buildUnresolvedMaterialization(MaterializationKind::Source, - computeInsertPoint(repl), value.getLoc(), - /*valuesToMap=*/repl, /*inputs=*/repl, - /*outputTypes=*/value.getType(), - /*originalType=*/Type(), converter) - .front(); + OpBuilder::InsertPoint ip; + if (repl.empty()) { + ip = computeInsertPoint(value); + } else { + ip = computeInsertPoint(repl); + } + Value castValue = buildUnresolvedMaterialization( + MaterializationKind::Source, ip, value.getLoc(), + /*valuesToMap=*/repl, /*inputs=*/repl, + /*outputTypes=*/value.getType(), + /*originalType=*/Type(), converter, + /*isPureTypeConversion=*/!repl.empty()) + .front(); return castValue; } @@ -1897,21 +1896,8 @@ void ConversionPatternRewriterImpl::replaceOp( } // Create mappings for each of the new result values. - for (auto [repl, result] : llvm::zip_equal(newValues, op->getResults())) { - if (repl.empty()) { - // This result was dropped and no replacement value was provided. - // Materialize a replacement value "out of thin air". - buildUnresolvedMaterialization( - MaterializationKind::Source, computeInsertPoint(result), - result.getLoc(), /*valuesToMap=*/{result}, /*inputs=*/ValueRange(), - /*outputTypes=*/result.getType(), /*originalType=*/Type(), - currentTypeConverter, /*isPureTypeConversion=*/false); - continue; - } - - // Remap result to replacement value. + for (auto [repl, result] : llvm::zip_equal(newValues, op->getResults())) mapping.map(static_cast<Value>(result), std::move(repl)); - } appendRewrite<ReplaceOperationRewrite>(op, currentTypeConverter); // Mark this operation and all nested ops as replaced. _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits