@@ -2336,17 +2336,6 @@ struct OperationConverter {
2336
2336
// / remaining artifacts and complete the conversion.
2337
2337
LogicalResult finalize (ConversionPatternRewriter &rewriter);
2338
2338
2339
- // / Legalize the types of converted block arguments.
2340
- LogicalResult
2341
- legalizeConvertedArgumentTypes (ConversionPatternRewriter &rewriter,
2342
- ConversionPatternRewriterImpl &rewriterImpl);
2343
-
2344
- // / Legalize the types of converted op results.
2345
- LogicalResult legalizeConvertedOpResultTypes (
2346
- ConversionPatternRewriter &rewriter,
2347
- ConversionPatternRewriterImpl &rewriterImpl,
2348
- DenseMap<Value, SmallVector<Value>> &inverseMapping);
2349
-
2350
2339
// / Dialect conversion configuration.
2351
2340
ConversionConfig config;
2352
2341
@@ -2510,19 +2499,6 @@ LogicalResult OperationConverter::convertOperations(ArrayRef<Operation *> ops) {
2510
2499
return success ();
2511
2500
}
2512
2501
2513
- LogicalResult
2514
- OperationConverter::finalize (ConversionPatternRewriter &rewriter) {
2515
- ConversionPatternRewriterImpl &rewriterImpl = rewriter.getImpl ();
2516
- if (failed (legalizeConvertedArgumentTypes (rewriter, rewriterImpl)))
2517
- return failure ();
2518
- DenseMap<Value, SmallVector<Value>> inverseMapping =
2519
- rewriterImpl.mapping .getInverse ();
2520
- if (failed (legalizeConvertedOpResultTypes (rewriter, rewriterImpl,
2521
- inverseMapping)))
2522
- return failure ();
2523
- return success ();
2524
- }
2525
-
2526
2502
// / Finds a user of the given value, or of any other value that the given value
2527
2503
// / replaced, that was not replaced in the conversion process.
2528
2504
static Operation *findLiveUserOfReplaced (
@@ -2546,87 +2522,61 @@ static Operation *findLiveUserOfReplaced(
2546
2522
return nullptr ;
2547
2523
}
2548
2524
2549
- LogicalResult OperationConverter::legalizeConvertedOpResultTypes (
2550
- ConversionPatternRewriter &rewriter,
2551
- ConversionPatternRewriterImpl &rewriterImpl,
2552
- DenseMap<Value, SmallVector<Value>> &inverseMapping) {
2553
- // Process requested operation replacements.
2554
- for (unsigned i = 0 ; i < rewriterImpl.rewrites .size (); ++i) {
2555
- auto *opReplacement =
2556
- dyn_cast<ReplaceOperationRewrite>(rewriterImpl.rewrites [i].get ());
2557
- if (!opReplacement)
2558
- continue ;
2559
- Operation *op = opReplacement->getOperation ();
2560
- for (OpResult result : op->getResults ()) {
2561
- // If the type of this op result changed and the result is still live,
2562
- // we need to materialize a conversion.
2563
- if (rewriterImpl.mapping .lookupOrNull (result, result.getType ()))
2525
+ // / Helper function that returns the replaced values and the type converter if
2526
+ // / the given rewrite object is an "operation replacement" or a "block type
2527
+ // / conversion" (which corresponds to a "block replacement"). Otherwise, return
2528
+ // / an empty ValueRange and a null type converter pointer.
2529
+ static std::pair<ValueRange, const TypeConverter *>
2530
+ getReplacedValues (IRRewrite *rewrite) {
2531
+ if (auto *opRewrite = dyn_cast<ReplaceOperationRewrite>(rewrite))
2532
+ return std::make_pair (opRewrite->getOperation ()->getResults (),
2533
+ opRewrite->getConverter ());
2534
+ if (auto *blockRewrite = dyn_cast<BlockTypeConversionRewrite>(rewrite))
2535
+ return std::make_pair (blockRewrite->getOrigBlock ()->getArguments (),
2536
+ blockRewrite->getConverter ());
2537
+ return std::make_pair (ValueRange (), nullptr );
2538
+ }
2539
+
2540
+ LogicalResult
2541
+ OperationConverter::finalize (ConversionPatternRewriter &rewriter) {
2542
+ ConversionPatternRewriterImpl &rewriterImpl = rewriter.getImpl ();
2543
+ DenseMap<Value, SmallVector<Value>> inverseMapping =
2544
+ rewriterImpl.mapping .getInverse ();
2545
+
2546
+ // Process requested value replacements.
2547
+ for (unsigned i = 0 , e = rewriterImpl.rewrites .size (); i < e; ++i) {
2548
+ ValueRange replacedValues;
2549
+ const TypeConverter *converter;
2550
+ std::tie (replacedValues, converter) =
2551
+ getReplacedValues (rewriterImpl.rewrites [i].get ());
2552
+ for (Value originalValue : replacedValues) {
2553
+ // If the type of this value changed and the value is still live, we need
2554
+ // to materialize a conversion.
2555
+ if (rewriterImpl.mapping .lookupOrNull (originalValue,
2556
+ originalValue.getType ()))
2564
2557
continue ;
2565
2558
Operation *liveUser =
2566
- findLiveUserOfReplaced (result , rewriterImpl, inverseMapping);
2559
+ findLiveUserOfReplaced (originalValue , rewriterImpl, inverseMapping);
2567
2560
if (!liveUser)
2568
2561
continue ;
2569
2562
2570
- // Legalize this result .
2571
- Value newValue = rewriterImpl.mapping .lookupOrNull (result );
2563
+ // Legalize this value replacement .
2564
+ Value newValue = rewriterImpl.mapping .lookupOrNull (originalValue );
2572
2565
assert (newValue && " replacement value not found" );
2573
2566
Value castValue = rewriterImpl.buildUnresolvedMaterialization (
2574
- MaterializationKind::Source, computeInsertPoint (result), op->getLoc (),
2575
- /* inputs=*/ newValue, /* outputType=*/ result.getType (),
2576
- opReplacement->getConverter ());
2577
- rewriterImpl.mapping .map (result, castValue);
2578
- inverseMapping[castValue].push_back (result);
2579
- llvm::erase (inverseMapping[newValue], result);
2567
+ MaterializationKind::Source, computeInsertPoint (newValue),
2568
+ originalValue.getLoc (),
2569
+ /* inputs=*/ newValue, /* outputType=*/ originalValue.getType (),
2570
+ converter);
2571
+ rewriterImpl.mapping .map (originalValue, castValue);
2572
+ inverseMapping[castValue].push_back (originalValue);
2573
+ llvm::erase (inverseMapping[newValue], originalValue);
2580
2574
}
2581
2575
}
2582
2576
2583
2577
return success ();
2584
2578
}
2585
2579
2586
- LogicalResult OperationConverter::legalizeConvertedArgumentTypes (
2587
- ConversionPatternRewriter &rewriter,
2588
- ConversionPatternRewriterImpl &rewriterImpl) {
2589
- // Functor used to check if all users of a value will be dead after
2590
- // conversion.
2591
- // TODO: This should probably query the inverse mapping, same as in
2592
- // `legalizeConvertedOpResultTypes`.
2593
- auto findLiveUser = [&](Value val) {
2594
- auto liveUserIt = llvm::find_if_not (val.getUsers (), [&](Operation *user) {
2595
- return rewriterImpl.isOpIgnored (user);
2596
- });
2597
- return liveUserIt == val.user_end () ? nullptr : *liveUserIt;
2598
- };
2599
- // Note: `rewrites` may be reallocated as the loop is running.
2600
- for (int64_t i = 0 ; i < static_cast <int64_t >(rewriterImpl.rewrites .size ());
2601
- ++i) {
2602
- auto &rewrite = rewriterImpl.rewrites [i];
2603
- if (auto *blockTypeConversionRewrite =
2604
- dyn_cast<BlockTypeConversionRewrite>(rewrite.get ())) {
2605
- // Process the remapping for each of the original arguments.
2606
- for (Value origArg :
2607
- blockTypeConversionRewrite->getOrigBlock ()->getArguments ()) {
2608
- // If the type of this argument changed and the argument is still live,
2609
- // we need to materialize a conversion.
2610
- if (rewriterImpl.mapping .lookupOrNull (origArg, origArg.getType ()))
2611
- continue ;
2612
- Operation *liveUser = findLiveUser (origArg);
2613
- if (!liveUser)
2614
- continue ;
2615
-
2616
- Value replacementValue = rewriterImpl.mapping .lookupOrNull (origArg);
2617
- assert (replacementValue && " replacement value not found" );
2618
- Value repl = rewriterImpl.buildUnresolvedMaterialization (
2619
- MaterializationKind::Source, computeInsertPoint (replacementValue),
2620
- origArg.getLoc (), /* inputs=*/ replacementValue,
2621
- /* outputType=*/ origArg.getType (),
2622
- blockTypeConversionRewrite->getConverter ());
2623
- rewriterImpl.mapping .map (origArg, repl);
2624
- }
2625
- }
2626
- }
2627
- return success ();
2628
- }
2629
-
2630
2580
// ===----------------------------------------------------------------------===//
2631
2581
// Reconcile Unrealized Casts
2632
2582
// ===----------------------------------------------------------------------===//
0 commit comments