@@ -169,10 +169,15 @@ struct ConversionValueMapping {
169
169
ValueVector lookupOrNull (const ValueVector &from,
170
170
TypeRange desiredTypes = {}) const ;
171
171
172
+ template <typename T>
173
+ struct IsValueVector : std::is_same<std::decay_t <T>, ValueVector> {};
174
+
172
175
// / Map a value to the one provided.
173
- void map (const ValueVector &oldVal, const ValueVector &newVal) {
176
+ template <typename OldVal, typename NewVal>
177
+ std::enable_if_t <IsValueVector<OldVal>{} && IsValueVector<NewVal>{}>
178
+ map (OldVal &&oldVal, NewVal &&newVal) {
174
179
LLVM_DEBUG ({
175
- ValueVector next = newVal;
180
+ ValueVector next ( newVal) ;
176
181
while (true ) {
177
182
assert (next != oldVal && " inserting cyclic mapping" );
178
183
auto it = mapping.find (next);
@@ -181,9 +186,22 @@ struct ConversionValueMapping {
181
186
next = it->second ;
182
187
}
183
188
});
184
- mapping[oldVal] = newVal;
185
189
for (Value v : newVal)
186
190
mappedTo.insert (v);
191
+
192
+ mapping[std::forward<OldVal>(oldVal)] = std::forward<NewVal>(newVal);
193
+ }
194
+
195
+ template <typename OldVal, typename NewVal>
196
+ std::enable_if_t <!IsValueVector<OldVal>{} || !IsValueVector<NewVal>{}>
197
+ map (OldVal &&oldVal, NewVal &&newVal) {
198
+ if constexpr (IsValueVector<OldVal>{}) {
199
+ map (std::forward<OldVal>(oldVal), ValueVector{newVal});
200
+ } else if constexpr (IsValueVector<NewVal>{}) {
201
+ map (ValueVector{oldVal}, std::forward<NewVal>(newVal));
202
+ } else {
203
+ map (ValueVector{oldVal}, ValueVector{newVal});
204
+ }
187
205
}
188
206
189
207
// / Drop the last mapping for the given values.
@@ -1405,7 +1423,7 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1405
1423
assert (inputMap->size == 0 &&
1406
1424
" invalid to provide a replacement value when the argument isn't "
1407
1425
" dropped" );
1408
- mapping.map ({ origArg}, { repl} );
1426
+ mapping.map (origArg, repl);
1409
1427
appendRewrite<ReplaceBlockArgRewrite>(block, origArg, converter);
1410
1428
continue ;
1411
1429
}
@@ -1417,7 +1435,7 @@ Block *ConversionPatternRewriterImpl::applySignatureConversion(
1417
1435
auto replArgs =
1418
1436
newBlock->getArguments ().slice (inputMap->inputNo , inputMap->size );
1419
1437
ValueVector replArgVals = llvm::to_vector_of<Value, 1 >(replArgs);
1420
- mapping.map ({ origArg}, replArgVals);
1438
+ mapping.map (origArg, std::move ( replArgVals) );
1421
1439
appendRewrite<ReplaceBlockArgRewrite>(block, origArg, converter);
1422
1440
}
1423
1441
@@ -1447,7 +1465,7 @@ ValueRange ConversionPatternRewriterImpl::buildUnresolvedMaterialization(
1447
1465
// Avoid materializing an unnecessary cast.
1448
1466
if (TypeRange (inputs) == outputTypes) {
1449
1467
if (!valuesToMap.empty ())
1450
- mapping.map (valuesToMap, inputs);
1468
+ mapping.map (std::move ( valuesToMap) , inputs);
1451
1469
return inputs;
1452
1470
}
1453
1471
@@ -1501,7 +1519,7 @@ Value ConversionPatternRewriterImpl::findOrBuildReplacementValue(
1501
1519
/* outputType=*/ value.getType (),
1502
1520
/* originalType=*/ Type (), converter)
1503
1521
.front ();
1504
- mapping.map ({ value}, { castValue} );
1522
+ mapping.map (value, castValue);
1505
1523
return castValue;
1506
1524
}
1507
1525
@@ -1571,7 +1589,7 @@ void ConversionPatternRewriterImpl::notifyOpReplaced(
1571
1589
// Remap result to replacement value.
1572
1590
if (repl.empty ())
1573
1591
continue ;
1574
- mapping.map ({ result} , repl);
1592
+ mapping.map (result, repl);
1575
1593
}
1576
1594
1577
1595
appendRewrite<ReplaceOperationRewrite>(op, currentTypeConverter);
@@ -1724,7 +1742,7 @@ void ConversionPatternRewriter::replaceUsesOfBlockArgument(BlockArgument from,
1724
1742
});
1725
1743
impl->appendRewrite <ReplaceBlockArgRewrite>(from.getOwner (), from,
1726
1744
impl->currentTypeConverter );
1727
- impl->mapping .map (impl->mapping .lookupOrDefault ({from}), {to} );
1745
+ impl->mapping .map (impl->mapping .lookupOrDefault ({from}), to );
1728
1746
}
1729
1747
1730
1748
Value ConversionPatternRewriter::getRemappedValue (Value key) {
0 commit comments