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