aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Transforms/Utils/DialectConversion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Transforms/Utils/DialectConversion.cpp')
-rw-r--r--mlir/lib/Transforms/Utils/DialectConversion.cpp46
1 files changed, 38 insertions, 8 deletions
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index bf0136b..3a23bbf 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -1856,6 +1856,44 @@ void ConversionPatternRewriterImpl::replaceOp(
Operation *op, SmallVector<SmallVector<Value>> &&newValues) {
assert(newValues.size() == op->getNumResults() &&
"incorrect number of replacement values");
+ LLVM_DEBUG({
+ logger.startLine() << "** Replace : '" << op->getName() << "'(" << op
+ << ")\n";
+ if (currentTypeConverter) {
+ // If the user-provided replacement types are different from the
+ // legalized types, as per the current type converter, print a note.
+ // In most cases, the replacement types are expected to match the types
+ // produced by the type converter, so this could indicate a bug in the
+ // user code.
+ for (auto [result, repls] :
+ llvm::zip_equal(op->getResults(), newValues)) {
+ Type resultType = result.getType();
+ auto logProlog = [&, repls = repls]() {
+ logger.startLine() << " Note: Replacing op result of type "
+ << resultType << " with value(s) of type (";
+ llvm::interleaveComma(repls, logger.getOStream(), [&](Value v) {
+ logger.getOStream() << v.getType();
+ });
+ logger.getOStream() << ")";
+ };
+ SmallVector<Type> convertedTypes;
+ if (failed(currentTypeConverter->convertTypes(resultType,
+ convertedTypes))) {
+ logProlog();
+ logger.getOStream() << ", but the type converter failed to legalize "
+ "the original type.\n";
+ continue;
+ }
+ if (TypeRange(convertedTypes) != TypeRange(ValueRange(repls))) {
+ logProlog();
+ logger.getOStream() << ", but the legalized type(s) is/are (";
+ llvm::interleaveComma(convertedTypes, logger.getOStream(),
+ [&](Type t) { logger.getOStream() << t; });
+ logger.getOStream() << ")\n";
+ }
+ }
+ }
+ });
if (!config.allowPatternRollback) {
// Pattern rollback is not allowed: materialize all IR changes immediately.
@@ -2072,10 +2110,6 @@ void ConversionPatternRewriter::replaceOp(Operation *op, Operation *newOp) {
void ConversionPatternRewriter::replaceOp(Operation *op, ValueRange newValues) {
assert(op->getNumResults() == newValues.size() &&
"incorrect # of replacement values");
- LLVM_DEBUG({
- impl->logger.startLine()
- << "** Replace : '" << op->getName() << "'(" << op << ")\n";
- });
// If the current insertion point is before the erased operation, we adjust
// the insertion point to be after the operation.
@@ -2093,10 +2127,6 @@ void ConversionPatternRewriter::replaceOpWithMultiple(
Operation *op, SmallVector<SmallVector<Value>> &&newValues) {
assert(op->getNumResults() == newValues.size() &&
"incorrect # of replacement values");
- LLVM_DEBUG({
- impl->logger.startLine()
- << "** Replace : '" << op->getName() << "'(" << op << ")\n";
- });
// If the current insertion point is before the erased operation, we adjust
// the insertion point to be after the operation.