@@ -137,8 +137,20 @@ struct ConversionValueMapping {
137
137
// / as `lookupOrDefault`.
138
138
ValueVector lookupOrNull (Value from, TypeRange desiredTypes = {}) const ;
139
139
140
- template <typename T>
141
- struct IsValueVector : std::is_same<std::decay_t <T>, ValueVector> {};
140
+ template <typename >
141
+ struct IsValueVector : std::false_type {};
142
+
143
+ template <typename T, size_t n>
144
+ struct IsValueVector <SmallVector<T, n>> : std::true_type {};
145
+
146
+ template <typename T, size_t n>
147
+ struct IsValueVector <SmallVector<T, n> &> : std::true_type {};
148
+
149
+ template <typename T, size_t n>
150
+ struct IsValueVector <SmallVector<T, n> &&> : std::true_type {};
151
+
152
+ template <typename T, size_t n>
153
+ struct IsValueVector <const SmallVector<T, n> &> : std::true_type {};
142
154
143
155
// / Map a value vector to the one provided.
144
156
template <typename OldVal, typename NewVal>
@@ -947,7 +959,9 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
947
959
OpBuilder::InsertPoint previous) override ;
948
960
949
961
// / Notifies that an op is about to be replaced with the given values.
950
- void notifyOpReplaced (Operation *op, ArrayRef<ValueVector> newValues);
962
+ template <unsigned N>
963
+ void notifyOpReplaced (Operation *op,
964
+ SmallVector<SmallVector<Value, N>> &&newValues);
951
965
952
966
// / Notifies that a block is about to be erased.
953
967
void notifyBlockIsBeingErased (Block *block);
@@ -1519,8 +1533,9 @@ void ConversionPatternRewriterImpl::notifyOperationInserted(
1519
1533
appendRewrite<MoveOperationRewrite>(op, previous.getBlock (), prevOp);
1520
1534
}
1521
1535
1536
+ template <unsigned N>
1522
1537
void ConversionPatternRewriterImpl::notifyOpReplaced (
1523
- Operation *op, ArrayRef<ValueVector> newValues) {
1538
+ Operation *op, SmallVector<SmallVector<Value, N>> && newValues) {
1524
1539
assert (newValues.size () == op->getNumResults ());
1525
1540
assert (!ignoredOps.contains (op) && " operation was already replaced" );
1526
1541
@@ -1562,7 +1577,7 @@ void ConversionPatternRewriterImpl::notifyOpReplaced(
1562
1577
// Remap result to replacement value.
1563
1578
if (repl.empty ())
1564
1579
continue ;
1565
- mapping.map (result, repl);
1580
+ mapping.map (result, std::move ( repl) );
1566
1581
}
1567
1582
1568
1583
appendRewrite<ReplaceOperationRewrite>(op, currentTypeConverter);
@@ -1644,18 +1659,18 @@ void ConversionPatternRewriter::replaceOp(Operation *op, ValueRange newValues) {
1644
1659
llvm::map_to_vector (newValues, [](Value v) -> ValueVector {
1645
1660
return v ? ValueVector{v} : ValueVector ();
1646
1661
});
1647
- impl->notifyOpReplaced (op, newVals);
1662
+ impl->notifyOpReplaced (op, std::move ( newVals) );
1648
1663
}
1649
1664
1650
1665
void ConversionPatternRewriter::replaceOpWithMultiple (
1651
- Operation *op, ArrayRef <SmallVector<Value, 1 >> newValues) {
1666
+ Operation *op, SmallVector <SmallVector<Value>> && newValues) {
1652
1667
assert (op->getNumResults () == newValues.size () &&
1653
1668
" incorrect # of replacement values" );
1654
1669
LLVM_DEBUG ({
1655
1670
impl->logger .startLine ()
1656
1671
<< " ** Replace : '" << op->getName () << " '(" << op << " )\n " ;
1657
1672
});
1658
- impl->notifyOpReplaced (op, newValues);
1673
+ impl->notifyOpReplaced (op, std::move ( newValues) );
1659
1674
}
1660
1675
1661
1676
void ConversionPatternRewriter::eraseOp (Operation *op) {
@@ -1664,7 +1679,7 @@ void ConversionPatternRewriter::eraseOp(Operation *op) {
1664
1679
<< " ** Erase : '" << op->getName () << " '(" << op << " )\n " ;
1665
1680
});
1666
1681
SmallVector<ValueVector> nullRepls (op->getNumResults (), ValueVector ());
1667
- impl->notifyOpReplaced (op, nullRepls);
1682
+ impl->notifyOpReplaced (op, std::move ( nullRepls) );
1668
1683
}
1669
1684
1670
1685
void ConversionPatternRewriter::eraseBlock (Block *block) {
0 commit comments