@@ -53,6 +53,16 @@ static void logFailure(llvm::ScopedPrinter &os, StringRef fmt, Args &&...args) {
53
53
});
54
54
}
55
55
56
+ // / Helper function that computes an insertion point where the given value is
57
+ // / defined and can be used without a dominance violation.
58
+ static OpBuilder::InsertPoint computeInsertPoint (Value value) {
59
+ Block *insertBlock = value.getParentBlock ();
60
+ Block::iterator insertPt = insertBlock->begin ();
61
+ if (OpResult inputRes = dyn_cast<OpResult>(value))
62
+ insertPt = ++inputRes.getOwner ()->getIterator ();
63
+ return OpBuilder::InsertPoint (insertBlock, insertPt);
64
+ }
65
+
56
66
// ===----------------------------------------------------------------------===//
57
67
// ConversionValueMapping
58
68
// ===----------------------------------------------------------------------===//
@@ -445,11 +455,9 @@ class BlockTypeConversionRewrite : public BlockRewrite {
445
455
return rewrite->getKind () == Kind::BlockTypeConversion;
446
456
}
447
457
448
- // / Materialize any necessary conversions for converted arguments that have
449
- // / live users, using the provided `findLiveUser` to search for a user that
450
- // / survives the conversion process.
451
- LogicalResult
452
- materializeLiveConversions (function_ref<Operation *(Value)> findLiveUser);
458
+ Block *getOrigBlock () const { return origBlock; }
459
+
460
+ const TypeConverter *getConverter () const { return converter; }
453
461
454
462
void commit (RewriterBase &rewriter) override ;
455
463
@@ -841,14 +849,10 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
841
849
// / Build an unresolved materialization operation given an output type and set
842
850
// / of input operands.
843
851
Value buildUnresolvedMaterialization (MaterializationKind kind,
844
- Block *insertBlock,
845
- Block::iterator insertPt, Location loc,
852
+ OpBuilder::InsertPoint ip, Location loc,
846
853
ValueRange inputs, Type outputType,
847
854
Type origOutputType,
848
855
const TypeConverter *converter);
849
- Value buildUnresolvedTargetMaterialization (Location loc, Value input,
850
- Type outputType,
851
- const TypeConverter *converter);
852
856
853
857
// ===--------------------------------------------------------------------===//
854
858
// Rewriter Notification Hooks
@@ -981,49 +985,6 @@ void BlockTypeConversionRewrite::rollback() {
981
985
block->replaceAllUsesWith (origBlock);
982
986
}
983
987
984
- LogicalResult BlockTypeConversionRewrite::materializeLiveConversions (
985
- function_ref<Operation *(Value)> findLiveUser) {
986
- // Process the remapping for each of the original arguments.
987
- for (auto it : llvm::enumerate (origBlock->getArguments ())) {
988
- BlockArgument origArg = it.value ();
989
- // Note: `block` may be detached, so OpBuilder::atBlockBegin cannot be used.
990
- OpBuilder builder (it.value ().getContext (), /* listener=*/ &rewriterImpl);
991
- builder.setInsertionPointToStart (block);
992
-
993
- // If the type of this argument changed and the argument is still live, we
994
- // need to materialize a conversion.
995
- if (rewriterImpl.mapping .lookupOrNull (origArg, origArg.getType ()))
996
- continue ;
997
- Operation *liveUser = findLiveUser (origArg);
998
- if (!liveUser)
999
- continue ;
1000
-
1001
- Value replacementValue = rewriterImpl.mapping .lookupOrNull (origArg);
1002
- assert (replacementValue && " replacement value not found" );
1003
- Value newArg;
1004
- if (converter) {
1005
- builder.setInsertionPointAfterValue (replacementValue);
1006
- newArg = converter->materializeSourceConversion (
1007
- builder, origArg.getLoc (), origArg.getType (), replacementValue);
1008
- assert ((!newArg || newArg.getType () == origArg.getType ()) &&
1009
- " materialization hook did not provide a value of the expected "
1010
- " type" );
1011
- }
1012
- if (!newArg) {
1013
- InFlightDiagnostic diag =
1014
- emitError (origArg.getLoc ())
1015
- << " failed to materialize conversion for block argument #"
1016
- << it.index () << " that remained live after conversion, type was "
1017
- << origArg.getType ();
1018
- diag.attachNote (liveUser->getLoc ())
1019
- << " see existing live user here: " << *liveUser;
1020
- return failure ();
1021
- }
1022
- rewriterImpl.mapping .map (origArg, newArg);
1023
- }
1024
- return success ();
1025
- }
1026
-
1027
988
void ReplaceBlockArgRewrite::commit (RewriterBase &rewriter) {
1028
989
Value repl = rewriterImpl.mapping .lookupOrNull (arg, arg.getType ());
1029
990
if (!repl)
@@ -1196,8 +1157,10 @@ LogicalResult ConversionPatternRewriterImpl::remapValues(
1196
1157
Type newOperandType = newOperand.getType ();
1197
1158
if (currentTypeConverter && desiredType && newOperandType != desiredType) {
1198
1159
Location operandLoc = inputLoc ? *inputLoc : operand.getLoc ();
1199
- Value castValue = buildUnresolvedTargetMaterialization (
1200
- operandLoc, newOperand, desiredType, currentTypeConverter);
1160
+ Value castValue = buildUnresolvedMaterialization (
1161
+ MaterializationKind::Target, computeInsertPoint (newOperand),
1162
+ operandLoc, /* inputs=*/ newOperand, /* outputType=*/ desiredType,
1163
+ /* origArgType=*/ {}, currentTypeConverter);
1201
1164
mapping.map (mapping.lookupOrDefault (newOperand), castValue);
1202
1165
newOperand = castValue;
1203
1166
}
@@ -1325,8 +1288,9 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1325
1288
// This block argument was dropped and no replacement value was provided.
1326
1289
// Materialize a replacement value "out of thin air".
1327
1290
Value repl = buildUnresolvedMaterialization (
1328
- MaterializationKind::Source, newBlock, newBlock->begin (),
1329
- origArg.getLoc (), /* inputs=*/ ValueRange (),
1291
+ MaterializationKind::Source,
1292
+ OpBuilder::InsertPoint (newBlock, newBlock->begin ()), origArg.getLoc (),
1293
+ /* inputs=*/ ValueRange (),
1330
1294
/* outputType=*/ origArgType, /* origArgType=*/ {}, converter);
1331
1295
mapping.map (origArg, repl);
1332
1296
appendRewrite<ReplaceBlockArgRewrite>(block, origArg);
@@ -1351,8 +1315,9 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1351
1315
auto replArgs =
1352
1316
newBlock->getArguments ().slice (inputMap->inputNo , inputMap->size );
1353
1317
Value repl = buildUnresolvedMaterialization (
1354
- MaterializationKind::Argument, newBlock, newBlock->begin (),
1355
- origArg.getLoc (), /* inputs=*/ replArgs,
1318
+ MaterializationKind::Argument,
1319
+ OpBuilder::InsertPoint (newBlock, newBlock->begin ()), origArg.getLoc (),
1320
+ /* inputs=*/ replArgs,
1356
1321
/* outputType=*/ tryLegalizeType (origArgType), origArgType, converter);
1357
1322
mapping.map (origArg, repl);
1358
1323
appendRewrite<ReplaceBlockArgRewrite>(block, origArg);
@@ -1374,34 +1339,22 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1374
1339
// / Build an unresolved materialization operation given an output type and set
1375
1340
// / of input operands.
1376
1341
Value ConversionPatternRewriterImpl::buildUnresolvedMaterialization (
1377
- MaterializationKind kind, Block *insertBlock, Block::iterator insertPt ,
1378
- Location loc, ValueRange inputs, Type outputType, Type origArgType,
1342
+ MaterializationKind kind, OpBuilder::InsertPoint ip, Location loc ,
1343
+ ValueRange inputs, Type outputType, Type origArgType,
1379
1344
const TypeConverter *converter) {
1380
1345
// Avoid materializing an unnecessary cast.
1381
1346
if (inputs.size () == 1 && inputs.front ().getType () == outputType)
1382
1347
return inputs.front ();
1383
1348
1384
1349
// Create an unresolved materialization. We use a new OpBuilder to avoid
1385
1350
// tracking the materialization like we do for other operations.
1386
- OpBuilder builder (insertBlock, insertPt );
1351
+ OpBuilder builder (ip. getBlock (), ip. getPoint () );
1387
1352
auto convertOp =
1388
1353
builder.create <UnrealizedConversionCastOp>(loc, outputType, inputs);
1389
1354
appendRewrite<UnresolvedMaterializationRewrite>(convertOp, converter, kind,
1390
1355
origArgType);
1391
1356
return convertOp.getResult (0 );
1392
1357
}
1393
- Value ConversionPatternRewriterImpl::buildUnresolvedTargetMaterialization (
1394
- Location loc, Value input, Type outputType,
1395
- const TypeConverter *converter) {
1396
- Block *insertBlock = input.getParentBlock ();
1397
- Block::iterator insertPt = insertBlock->begin ();
1398
- if (OpResult inputRes = dyn_cast<OpResult>(input))
1399
- insertPt = ++inputRes.getOwner ()->getIterator ();
1400
-
1401
- return buildUnresolvedMaterialization (
1402
- MaterializationKind::Target, insertBlock, insertPt, loc, input,
1403
- outputType, /* origArgType=*/ {}, converter);
1404
- }
1405
1358
1406
1359
// ===----------------------------------------------------------------------===//
1407
1360
// Rewriter Notification Hooks
@@ -2515,9 +2468,9 @@ LogicalResult
2515
2468
OperationConverter::finalize (ConversionPatternRewriter &rewriter) {
2516
2469
std::optional<DenseMap<Value, SmallVector<Value>>> inverseMapping;
2517
2470
ConversionPatternRewriterImpl &rewriterImpl = rewriter.getImpl ();
2518
- if (failed (legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2519
- inverseMapping)) ||
2520
- failed ( legalizeConvertedArgumentTypes (rewriter, rewriterImpl )))
2471
+ if (failed (legalizeConvertedArgumentTypes (rewriter, rewriterImpl)) ||
2472
+ failed ( legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2473
+ inverseMapping )))
2521
2474
return failure ();
2522
2475
2523
2476
// Process requested operation replacements.
@@ -2573,10 +2526,28 @@ LogicalResult OperationConverter::legalizeConvertedArgumentTypes(
2573
2526
++i) {
2574
2527
auto &rewrite = rewriterImpl.rewrites [i];
2575
2528
if (auto *blockTypeConversionRewrite =
2576
- dyn_cast<BlockTypeConversionRewrite>(rewrite.get ()))
2577
- if (failed (blockTypeConversionRewrite->materializeLiveConversions (
2578
- findLiveUser)))
2579
- return failure ();
2529
+ dyn_cast<BlockTypeConversionRewrite>(rewrite.get ())) {
2530
+ // Process the remapping for each of the original arguments.
2531
+ for (Value origArg :
2532
+ blockTypeConversionRewrite->getOrigBlock ()->getArguments ()) {
2533
+ // If the type of this argument changed and the argument is still live,
2534
+ // we need to materialize a conversion.
2535
+ if (rewriterImpl.mapping .lookupOrNull (origArg, origArg.getType ()))
2536
+ continue ;
2537
+ Operation *liveUser = findLiveUser (origArg);
2538
+ if (!liveUser)
2539
+ continue ;
2540
+
2541
+ Value replacementValue = rewriterImpl.mapping .lookupOrNull (origArg);
2542
+ assert (replacementValue && " replacement value not found" );
2543
+ Value repl = rewriterImpl.buildUnresolvedMaterialization (
2544
+ MaterializationKind::Source, computeInsertPoint (replacementValue),
2545
+ origArg.getLoc (), /* inputs=*/ replacementValue,
2546
+ /* outputType=*/ origArg.getType (), /* origArgType=*/ {},
2547
+ blockTypeConversionRewrite->getConverter ());
2548
+ rewriterImpl.mapping .map (origArg, repl);
2549
+ }
2550
+ }
2580
2551
}
2581
2552
return success ();
2582
2553
}
0 commit comments