================
@@ -1376,14 +1423,36 @@ void 
ConversionPatternRewriterImpl::insertNTo1Materialization(
     legalOutputType = replacements[0].getType();
   }
   if (legalOutputType && legalOutputType != originalType) {
+    UnrealizedConversionCastOp targetCastOp;
     Value targetMat = buildUnresolvedMaterialization(
         MaterializationKind::Target, computeInsertPoint(argMat), loc,
         /*inputs=*/argMat, /*outputType=*/legalOutputType,
-        /*originalType=*/originalType, converter);
+        /*originalType=*/originalType, converter, &targetCastOp);
+    if (targetCastOp)
+      nTo1TempMaterializations.insert(targetCastOp);
     mapping.map(argMat, targetMat);
   }
 }
 
+SmallVector<Value>
+ConversionPatternRewriterImpl::unpackNTo1Materialization(Value value) {
+  // Unpack unrealized_conversion_cast ops that were inserted as a N:1
+  // workaround.
+  auto castOp = value.getDefiningOp<UnrealizedConversionCastOp>();
+  if (!castOp)
+    return {value};
+  if (!nTo1TempMaterializations.contains(castOp))
+    return {value};
+  assert(castOp->getNumResults() == 1 && "expected single result");
+
+  SmallVector<Value> result;
----------------
matthias-springer wrote:

`decompose-call-graph` decomposes nested tuples in one step. There is not 
recursive pattern application or materializations.

The recursion here is needed because the driver sometimes inserts a combination 
of argument materialization + target materialization (back-to-back). We want to 
skip both. You can see both being created in `insertNTo1Materialization`. I 
added a comment that clarifies this. I also added a test case to 
`TestPatterns.cpp`. As part of this, I also found an issue in `remapValues` 
that required updating a few more patterns in `TestPatterns.cpp` to 1:N. (I 
prefetched these fixes from #116524.)

The use case that you mentioned is not supported at the moment. The reason for 
that is that we cannot simplify traverse the use-def chain of 
`unrealized_conversion_cast` ops because op replacements are materialized in a 
delayed fashion. I.e., by traversing the `unrealized_conversion_cast` chain, we 
would see one op replacement, but not the replacement of the source value. This 
would be difficult to implement because we have to examine the `mapping` in 
this function. This issue will be fixed with #116524, when 1:N replacements are 
stored in the `mapping` and we no longer have to "unpack" materializations.


https://github.com/llvm/llvm-project/pull/116470
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to