@@ -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
// ===----------------------------------------------------------------------===//
@@ -444,11 +454,9 @@ class BlockTypeConversionRewrite : public BlockRewrite {
444
454
return rewrite->getKind () == Kind::BlockTypeConversion;
445
455
}
446
456
447
- // / Materialize any necessary conversions for converted arguments that have
448
- // / live users, using the provided `findLiveUser` to search for a user that
449
- // / survives the conversion process.
450
- LogicalResult
451
- materializeLiveConversions (function_ref<Operation *(Value)> findLiveUser);
457
+ Block *getOrigBlock () const { return origBlock; }
458
+
459
+ const TypeConverter *getConverter () const { return converter; }
452
460
453
461
void commit (RewriterBase &rewriter) override ;
454
462
@@ -829,15 +837,10 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
829
837
// / Build an unresolved materialization operation given an output type and set
830
838
// / of input operands.
831
839
Value buildUnresolvedMaterialization (MaterializationKind kind,
832
- Block *insertBlock,
833
- Block::iterator insertPt, Location loc,
840
+ OpBuilder::InsertPoint ip, Location loc,
834
841
ValueRange inputs, Type outputType,
835
842
const TypeConverter *converter);
836
843
837
- Value buildUnresolvedTargetMaterialization (Location loc, Value input,
838
- Type outputType,
839
- const TypeConverter *converter);
840
-
841
844
// ===--------------------------------------------------------------------===//
842
845
// Rewriter Notification Hooks
843
846
// ===--------------------------------------------------------------------===//
@@ -969,49 +972,6 @@ void BlockTypeConversionRewrite::rollback() {
969
972
block->replaceAllUsesWith (origBlock);
970
973
}
971
974
972
- LogicalResult BlockTypeConversionRewrite::materializeLiveConversions (
973
- function_ref<Operation *(Value)> findLiveUser) {
974
- // Process the remapping for each of the original arguments.
975
- for (auto it : llvm::enumerate (origBlock->getArguments ())) {
976
- BlockArgument origArg = it.value ();
977
- // Note: `block` may be detached, so OpBuilder::atBlockBegin cannot be used.
978
- OpBuilder builder (it.value ().getContext (), /* listener=*/ &rewriterImpl);
979
- builder.setInsertionPointToStart (block);
980
-
981
- // If the type of this argument changed and the argument is still live, we
982
- // need to materialize a conversion.
983
- if (rewriterImpl.mapping .lookupOrNull (origArg, origArg.getType ()))
984
- continue ;
985
- Operation *liveUser = findLiveUser (origArg);
986
- if (!liveUser)
987
- continue ;
988
-
989
- Value replacementValue = rewriterImpl.mapping .lookupOrDefault (origArg);
990
- assert (replacementValue && " replacement value not found" );
991
- Value newArg;
992
- if (converter) {
993
- builder.setInsertionPointAfterValue (replacementValue);
994
- newArg = converter->materializeSourceConversion (
995
- builder, origArg.getLoc (), origArg.getType (), replacementValue);
996
- assert ((!newArg || newArg.getType () == origArg.getType ()) &&
997
- " materialization hook did not provide a value of the expected "
998
- " type" );
999
- }
1000
- if (!newArg) {
1001
- InFlightDiagnostic diag =
1002
- emitError (origArg.getLoc ())
1003
- << " failed to materialize conversion for block argument #"
1004
- << it.index () << " that remained live after conversion, type was "
1005
- << origArg.getType ();
1006
- diag.attachNote (liveUser->getLoc ())
1007
- << " see existing live user here: " << *liveUser;
1008
- return failure ();
1009
- }
1010
- rewriterImpl.mapping .map (origArg, newArg);
1011
- }
1012
- return success ();
1013
- }
1014
-
1015
975
void ReplaceBlockArgRewrite::commit (RewriterBase &rewriter) {
1016
976
Value repl = rewriterImpl.mapping .lookupOrNull (arg, arg.getType ());
1017
977
if (!repl)
@@ -1184,8 +1144,10 @@ LogicalResult ConversionPatternRewriterImpl::remapValues(
1184
1144
Type newOperandType = newOperand.getType ();
1185
1145
if (currentTypeConverter && desiredType && newOperandType != desiredType) {
1186
1146
Location operandLoc = inputLoc ? *inputLoc : operand.getLoc ();
1187
- Value castValue = buildUnresolvedTargetMaterialization (
1188
- operandLoc, newOperand, desiredType, currentTypeConverter);
1147
+ Value castValue = buildUnresolvedMaterialization (
1148
+ MaterializationKind::Target, computeInsertPoint (newOperand),
1149
+ operandLoc, /* inputs=*/ newOperand, /* outputType=*/ desiredType,
1150
+ currentTypeConverter);
1189
1151
mapping.map (mapping.lookupOrDefault (newOperand), castValue);
1190
1152
newOperand = castValue;
1191
1153
}
@@ -1298,8 +1260,9 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1298
1260
// This block argument was dropped and no replacement value was provided.
1299
1261
// Materialize a replacement value "out of thin air".
1300
1262
Value repl = buildUnresolvedMaterialization (
1301
- MaterializationKind::Source, newBlock, newBlock->begin (),
1302
- origArg.getLoc (), /* inputs=*/ ValueRange (),
1263
+ MaterializationKind::Source,
1264
+ OpBuilder::InsertPoint (newBlock, newBlock->begin ()), origArg.getLoc (),
1265
+ /* inputs=*/ ValueRange (),
1303
1266
/* outputType=*/ origArgType, converter);
1304
1267
mapping.map (origArg, repl);
1305
1268
appendRewrite<ReplaceBlockArgRewrite>(block, origArg);
@@ -1323,8 +1286,9 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1323
1286
auto replArgs =
1324
1287
newBlock->getArguments ().slice (inputMap->inputNo , inputMap->size );
1325
1288
Value argMat = buildUnresolvedMaterialization (
1326
- MaterializationKind::Argument, newBlock, newBlock->begin (),
1327
- origArg.getLoc (), /* inputs=*/ replArgs, origArgType, converter);
1289
+ MaterializationKind::Argument,
1290
+ OpBuilder::InsertPoint (newBlock, newBlock->begin ()), origArg.getLoc (),
1291
+ /* inputs=*/ replArgs, origArgType, converter);
1328
1292
mapping.map (origArg, argMat);
1329
1293
appendRewrite<ReplaceBlockArgRewrite>(block, origArg);
1330
1294
@@ -1342,7 +1306,8 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1342
1306
legalOutputType = replArgs[0 ].getType ();
1343
1307
}
1344
1308
if (legalOutputType && legalOutputType != origArgType) {
1345
- Value targetMat = buildUnresolvedTargetMaterialization (
1309
+ Value targetMat = buildUnresolvedMaterialization (
1310
+ MaterializationKind::Target, computeInsertPoint (argMat),
1346
1311
origArg.getLoc (), argMat, legalOutputType, converter);
1347
1312
mapping.map (argMat, targetMat);
1348
1313
}
@@ -1365,34 +1330,21 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1365
1330
// / Build an unresolved materialization operation given an output type and set
1366
1331
// / of input operands.
1367
1332
Value ConversionPatternRewriterImpl::buildUnresolvedMaterialization (
1368
- MaterializationKind kind, Block *insertBlock, Block::iterator insertPt,
1369
- Location loc, ValueRange inputs, Type outputType,
1370
- const TypeConverter *converter) {
1333
+ MaterializationKind kind, OpBuilder::InsertPoint ip, Location loc,
1334
+ ValueRange inputs, Type outputType, const TypeConverter *converter) {
1371
1335
// Avoid materializing an unnecessary cast.
1372
1336
if (inputs.size () == 1 && inputs.front ().getType () == outputType)
1373
1337
return inputs.front ();
1374
1338
1375
1339
// Create an unresolved materialization. We use a new OpBuilder to avoid
1376
1340
// tracking the materialization like we do for other operations.
1377
1341
OpBuilder builder (outputType.getContext ());
1378
- builder.setInsertionPoint (insertBlock, insertPt );
1342
+ builder.setInsertionPoint (ip. getBlock (), ip. getPoint () );
1379
1343
auto convertOp =
1380
1344
builder.create <UnrealizedConversionCastOp>(loc, outputType, inputs);
1381
1345
appendRewrite<UnresolvedMaterializationRewrite>(convertOp, converter, kind);
1382
1346
return convertOp.getResult (0 );
1383
1347
}
1384
- Value ConversionPatternRewriterImpl::buildUnresolvedTargetMaterialization (
1385
- Location loc, Value input, Type outputType,
1386
- const TypeConverter *converter) {
1387
- Block *insertBlock = input.getParentBlock ();
1388
- Block::iterator insertPt = insertBlock->begin ();
1389
- if (OpResult inputRes = dyn_cast<OpResult>(input))
1390
- insertPt = ++inputRes.getOwner ()->getIterator ();
1391
-
1392
- return buildUnresolvedMaterialization (MaterializationKind::Target,
1393
- insertBlock, insertPt, loc, input,
1394
- outputType, converter);
1395
- }
1396
1348
1397
1349
// ===----------------------------------------------------------------------===//
1398
1350
// Rewriter Notification Hooks
@@ -2504,9 +2456,9 @@ LogicalResult
2504
2456
OperationConverter::finalize (ConversionPatternRewriter &rewriter) {
2505
2457
std::optional<DenseMap<Value, SmallVector<Value>>> inverseMapping;
2506
2458
ConversionPatternRewriterImpl &rewriterImpl = rewriter.getImpl ();
2507
- if (failed (legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2508
- inverseMapping)) ||
2509
- failed ( legalizeConvertedArgumentTypes (rewriter, rewriterImpl )))
2459
+ if (failed (legalizeConvertedArgumentTypes (rewriter, rewriterImpl)) ||
2460
+ failed ( legalizeUnresolvedMaterializations (rewriter, rewriterImpl,
2461
+ inverseMapping )))
2510
2462
return failure ();
2511
2463
2512
2464
// Process requested operation replacements.
@@ -2562,10 +2514,28 @@ LogicalResult OperationConverter::legalizeConvertedArgumentTypes(
2562
2514
++i) {
2563
2515
auto &rewrite = rewriterImpl.rewrites [i];
2564
2516
if (auto *blockTypeConversionRewrite =
2565
- dyn_cast<BlockTypeConversionRewrite>(rewrite.get ()))
2566
- if (failed (blockTypeConversionRewrite->materializeLiveConversions (
2567
- findLiveUser)))
2568
- return failure ();
2517
+ dyn_cast<BlockTypeConversionRewrite>(rewrite.get ())) {
2518
+ // Process the remapping for each of the original arguments.
2519
+ for (Value origArg :
2520
+ blockTypeConversionRewrite->getOrigBlock ()->getArguments ()) {
2521
+ // If the type of this argument changed and the argument is still live,
2522
+ // we need to materialize a conversion.
2523
+ if (rewriterImpl.mapping .lookupOrNull (origArg, origArg.getType ()))
2524
+ continue ;
2525
+ Operation *liveUser = findLiveUser (origArg);
2526
+ if (!liveUser)
2527
+ continue ;
2528
+
2529
+ Value replacementValue = rewriterImpl.mapping .lookupOrNull (origArg);
2530
+ assert (replacementValue && " replacement value not found" );
2531
+ Value repl = rewriterImpl.buildUnresolvedMaterialization (
2532
+ MaterializationKind::Source, computeInsertPoint (replacementValue),
2533
+ origArg.getLoc (), /* inputs=*/ replacementValue,
2534
+ /* outputType=*/ origArg.getType (),
2535
+ blockTypeConversionRewrite->getConverter ());
2536
+ rewriterImpl.mapping .map (origArg, repl);
2537
+ }
2538
+ }
2569
2539
}
2570
2540
return success ();
2571
2541
}
0 commit comments