Skip to content

Commit b30cdb1

Browse files
committed
move version
1 parent 1b6eddf commit b30cdb1

File tree

3 files changed

+38
-22
lines changed

3 files changed

+38
-22
lines changed

llvm/include/llvm/ADT/SmallVector.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,11 @@ class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl<T>,
12381238
SmallVectorImpl<T>::operator=(RHS);
12391239
}
12401240

1241+
SmallVector(const SmallVectorImpl<T> &RHS) : SmallVectorImpl<T>(N) {
1242+
if (!RHS.empty())
1243+
SmallVectorImpl<T>::operator=(RHS);
1244+
}
1245+
12411246
SmallVector &operator=(const SmallVector &RHS) {
12421247
SmallVectorImpl<T>::operator=(RHS);
12431248
return *this;

mlir/include/mlir/Transforms/DialectConversion.h

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -898,28 +898,24 @@ class ConversionPatternRewriter final : public PatternRewriter {
898898
/// Replace the given operation with the new value ranges. The number of op
899899
/// results and value ranges must match. The given operation is erased.
900900
void replaceOpWithMultiple(Operation *op,
901-
ArrayRef<SmallVector<Value, 1>> newValues);
901+
SmallVector<SmallVector<Value>> &&newValues);
902+
902903
// Note: This overload matches SmallVector<ValueRange>,
903904
// SmallVector<SmallVector<Value>>, etc.
904905
template <typename RangeRangeT>
905906
void replaceOpWithMultiple(Operation *op, RangeRangeT &&newValues) {
906-
// Note: Prefer the ArrayRef<SmallVector<Value, 1>> overload because it
907-
// does not copy the replacements vector.
908-
auto vals = llvm::map_to_vector(newValues, [](const auto &r) {
909-
return SmallVector<Value, 1>(std::begin(r), std::end(r));
910-
});
911-
replaceOpWithMultiple(op, ArrayRef(vals));
907+
replaceOpWithMultiple(op, llvm::map_to_vector(newValues, [](const auto &r) {
908+
return llvm::to_vector(r);
909+
}));
912910
}
911+
913912
// Note: This overload matches initializer list of ValueRange,
914913
// SmallVector<Value>, etc.
915914
template <typename RangeT = ValueRange>
916915
void replaceOpWithMultiple(Operation *op, ArrayRef<RangeT> newValues) {
917-
// Note: Prefer the ArrayRef<SmallVector<Value, 1>> overload because it
918-
// does not copy the replacements vector.
919-
auto vals = llvm::map_to_vector(newValues, [](const RangeT &r) {
920-
return SmallVector<Value, 1>(std::begin(r), std::end(r));
921-
});
922-
replaceOpWithMultiple(op, ArrayRef(vals));
916+
replaceOpWithMultiple(op, llvm::map_to_vector(newValues, [](const RangeT &r) {
917+
return SmallVector<Value>(std::begin(r), std::end(r));
918+
}));
923919
}
924920

925921
/// PatternRewriter hook for erasing a dead operation. The uses of this

mlir/lib/Transforms/Utils/DialectConversion.cpp

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,20 @@ struct ConversionValueMapping {
137137
/// as `lookupOrDefault`.
138138
ValueVector lookupOrNull(Value from, TypeRange desiredTypes = {}) const;
139139

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 {};
142154

143155
/// Map a value vector to the one provided.
144156
template <typename OldVal, typename NewVal>
@@ -947,7 +959,9 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
947959
OpBuilder::InsertPoint previous) override;
948960

949961
/// 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);
951965

952966
/// Notifies that a block is about to be erased.
953967
void notifyBlockIsBeingErased(Block *block);
@@ -1519,8 +1533,9 @@ void ConversionPatternRewriterImpl::notifyOperationInserted(
15191533
appendRewrite<MoveOperationRewrite>(op, previous.getBlock(), prevOp);
15201534
}
15211535

1536+
template <unsigned N>
15221537
void ConversionPatternRewriterImpl::notifyOpReplaced(
1523-
Operation *op, ArrayRef<ValueVector> newValues) {
1538+
Operation *op, SmallVector<SmallVector<Value, N>> &&newValues) {
15241539
assert(newValues.size() == op->getNumResults());
15251540
assert(!ignoredOps.contains(op) && "operation was already replaced");
15261541

@@ -1562,7 +1577,7 @@ void ConversionPatternRewriterImpl::notifyOpReplaced(
15621577
// Remap result to replacement value.
15631578
if (repl.empty())
15641579
continue;
1565-
mapping.map(result, repl);
1580+
mapping.map(result, std::move(repl));
15661581
}
15671582

15681583
appendRewrite<ReplaceOperationRewrite>(op, currentTypeConverter);
@@ -1644,18 +1659,18 @@ void ConversionPatternRewriter::replaceOp(Operation *op, ValueRange newValues) {
16441659
llvm::map_to_vector(newValues, [](Value v) -> ValueVector {
16451660
return v ? ValueVector{v} : ValueVector();
16461661
});
1647-
impl->notifyOpReplaced(op, newVals);
1662+
impl->notifyOpReplaced(op, std::move(newVals));
16481663
}
16491664

16501665
void ConversionPatternRewriter::replaceOpWithMultiple(
1651-
Operation *op, ArrayRef<SmallVector<Value, 1>> newValues) {
1666+
Operation *op, SmallVector<SmallVector<Value>> &&newValues) {
16521667
assert(op->getNumResults() == newValues.size() &&
16531668
"incorrect # of replacement values");
16541669
LLVM_DEBUG({
16551670
impl->logger.startLine()
16561671
<< "** Replace : '" << op->getName() << "'(" << op << ")\n";
16571672
});
1658-
impl->notifyOpReplaced(op, newValues);
1673+
impl->notifyOpReplaced(op, std::move(newValues));
16591674
}
16601675

16611676
void ConversionPatternRewriter::eraseOp(Operation *op) {
@@ -1664,7 +1679,7 @@ void ConversionPatternRewriter::eraseOp(Operation *op) {
16641679
<< "** Erase : '" << op->getName() << "'(" << op << ")\n";
16651680
});
16661681
SmallVector<ValueVector> nullRepls(op->getNumResults(), ValueVector());
1667-
impl->notifyOpReplaced(op, nullRepls);
1682+
impl->notifyOpReplaced(op, std::move(nullRepls));
16681683
}
16691684

16701685
void ConversionPatternRewriter::eraseBlock(Block *block) {

0 commit comments

Comments
 (0)