@@ -2352,7 +2352,7 @@ struct OperationConverter {
2352
2352
LogicalResult legalizeUnresolvedMaterializations (
2353
2353
ConversionPatternRewriter &rewriter,
2354
2354
ConversionPatternRewriterImpl &rewriterImpl,
2355
- std::optional< DenseMap<Value, SmallVector<Value> >> &inverseMapping);
2355
+ DenseMap<Value, SmallVector<Value>> &inverseMapping);
2356
2356
2357
2357
// / Legalize an operation result that was marked as "erased".
2358
2358
LogicalResult
@@ -2454,10 +2454,12 @@ LogicalResult OperationConverter::convertOperations(ArrayRef<Operation *> ops) {
2454
2454
2455
2455
LogicalResult
2456
2456
OperationConverter::finalize (ConversionPatternRewriter &rewriter) {
2457
- std::optional<DenseMap<Value, SmallVector<Value>>> inverseMapping;
2458
2457
ConversionPatternRewriterImpl &rewriterImpl = rewriter.getImpl ();
2459
- if (failed (legalizeConvertedArgumentTypes (rewriter, rewriterImpl)) ||
2460
- failed (legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2458
+ if (failed (legalizeConvertedArgumentTypes (rewriter, rewriterImpl)))
2459
+ return failure ();
2460
+ DenseMap<Value, SmallVector<Value>> inverseMapping =
2461
+ rewriterImpl.mapping .getInverse ();
2462
+ if (failed (legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2461
2463
inverseMapping)))
2462
2464
return failure ();
2463
2465
@@ -2483,15 +2485,11 @@ OperationConverter::finalize(ConversionPatternRewriter &rewriter) {
2483
2485
if (result.getType () == newValue.getType ())
2484
2486
continue ;
2485
2487
2486
- // Compute the inverse mapping only if it is really needed.
2487
- if (!inverseMapping)
2488
- inverseMapping = rewriterImpl.mapping .getInverse ();
2489
-
2490
2488
// Legalize this result.
2491
2489
rewriter.setInsertionPoint (op);
2492
2490
if (failed (legalizeChangedResultType (
2493
2491
op, result, newValue, opReplacement->getConverter (), rewriter,
2494
- rewriterImpl, * inverseMapping)))
2492
+ rewriterImpl, inverseMapping)))
2495
2493
return failure ();
2496
2494
}
2497
2495
}
@@ -2503,6 +2501,8 @@ LogicalResult OperationConverter::legalizeConvertedArgumentTypes(
2503
2501
ConversionPatternRewriterImpl &rewriterImpl) {
2504
2502
// Functor used to check if all users of a value will be dead after
2505
2503
// conversion.
2504
+ // TODO: This should probably query the inverse mapping, same as in
2505
+ // `legalizeChangedResultType`.
2506
2506
auto findLiveUser = [&](Value val) {
2507
2507
auto liveUserIt = llvm::find_if_not (val.getUsers (), [&](Operation *user) {
2508
2508
return rewriterImpl.isOpIgnored (user);
@@ -2796,20 +2796,18 @@ static LogicalResult legalizeUnresolvedMaterialization(
2796
2796
LogicalResult OperationConverter::legalizeUnresolvedMaterializations (
2797
2797
ConversionPatternRewriter &rewriter,
2798
2798
ConversionPatternRewriterImpl &rewriterImpl,
2799
- std::optional<DenseMap<Value, SmallVector<Value>>> &inverseMapping) {
2800
- inverseMapping = rewriterImpl.mapping .getInverse ();
2801
-
2799
+ DenseMap<Value, SmallVector<Value>> &inverseMapping) {
2802
2800
// As an initial step, compute all of the inserted materializations that we
2803
2801
// expect to persist beyond the conversion process.
2804
2802
DenseMap<Operation *, UnresolvedMaterializationRewrite *> materializationOps;
2805
2803
SetVector<UnresolvedMaterializationRewrite *> necessaryMaterializations;
2806
2804
computeNecessaryMaterializations (materializationOps, rewriter, rewriterImpl,
2807
- * inverseMapping, necessaryMaterializations);
2805
+ inverseMapping, necessaryMaterializations);
2808
2806
2809
2807
// Once computed, legalize any necessary materializations.
2810
2808
for (auto *mat : necessaryMaterializations) {
2811
2809
if (failed (legalizeUnresolvedMaterialization (
2812
- *mat, materializationOps, rewriter, rewriterImpl, * inverseMapping)))
2810
+ *mat, materializationOps, rewriter, rewriterImpl, inverseMapping)))
2813
2811
return failure ();
2814
2812
}
2815
2813
return success ();
0 commit comments