forked from OSchip/llvm-project
[llvm][STLExtras] Move the algorithm `interleave*` methods from MLIR to LLVM
These have proved incredibly useful for interleaving values between a range w.r.t to streams. After this revision, the mlir/Support/STLExtras.h is empty. A followup revision will remove it from the tree. Differential Revision: https://reviews.llvm.org/D78067
This commit is contained in:
parent
204c3b5516
commit
2f21a57966
|
|
@ -248,14 +248,7 @@ class fir_AllocatableOp<string mnemonic, list<OpTrait> traits =[]> :
|
|||
p << getOperationName() << ' ' << getAttr(inType());
|
||||
if (hasLenParams()) {
|
||||
// print the LEN parameters to a derived type in parens
|
||||
p << '(';
|
||||
p.printOperands(getLenParams());
|
||||
p << " : ";
|
||||
mlir::interleaveComma(getLenParams(), p.getStream(),
|
||||
[&](const auto &opnd) {
|
||||
p.printType(opnd.getType());
|
||||
});
|
||||
p << ')';
|
||||
p << '(' << getLenParams() << " : " << getLenParams().getTypes() << ')';
|
||||
}
|
||||
// print the shape of the allocation (if any); all must be index type
|
||||
for (auto sh : getShapeOperands()) {
|
||||
|
|
|
|||
|
|
@ -50,6 +50,10 @@ namespace detail {
|
|||
template <typename RangeT>
|
||||
using IterOfRange = decltype(std::begin(std::declval<RangeT &>()));
|
||||
|
||||
template <typename RangeT>
|
||||
using ValueOfRange = typename std::remove_reference<decltype(
|
||||
*std::begin(std::declval<RangeT &>()))>::type;
|
||||
|
||||
} // end namespace detail
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
@ -1674,6 +1678,69 @@ void replace(Container &Cont, typename Container::iterator ContIt,
|
|||
replace(Cont, ContIt, ContEnd, R.begin(), R.end());
|
||||
}
|
||||
|
||||
/// An STL-style algorithm similar to std::for_each that applies a second
|
||||
/// functor between every pair of elements.
|
||||
///
|
||||
/// This provides the control flow logic to, for example, print a
|
||||
/// comma-separated list:
|
||||
/// \code
|
||||
/// interleave(names.begin(), names.end(),
|
||||
/// [&](StringRef name) { os << name; },
|
||||
/// [&] { os << ", "; });
|
||||
/// \endcode
|
||||
template <typename ForwardIterator, typename UnaryFunctor,
|
||||
typename NullaryFunctor,
|
||||
typename = typename std::enable_if<
|
||||
!std::is_constructible<StringRef, UnaryFunctor>::value &&
|
||||
!std::is_constructible<StringRef, NullaryFunctor>::value>::type>
|
||||
inline void interleave(ForwardIterator begin, ForwardIterator end,
|
||||
UnaryFunctor each_fn, NullaryFunctor between_fn) {
|
||||
if (begin == end)
|
||||
return;
|
||||
each_fn(*begin);
|
||||
++begin;
|
||||
for (; begin != end; ++begin) {
|
||||
between_fn();
|
||||
each_fn(*begin);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Container, typename UnaryFunctor, typename NullaryFunctor,
|
||||
typename = typename std::enable_if<
|
||||
!std::is_constructible<StringRef, UnaryFunctor>::value &&
|
||||
!std::is_constructible<StringRef, NullaryFunctor>::value>::type>
|
||||
inline void interleave(const Container &c, UnaryFunctor each_fn,
|
||||
NullaryFunctor between_fn) {
|
||||
interleave(c.begin(), c.end(), each_fn, between_fn);
|
||||
}
|
||||
|
||||
/// Overload of interleave for the common case of string separator.
|
||||
template <typename Container, typename UnaryFunctor, typename StreamT,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleave(const Container &c, StreamT &os, UnaryFunctor each_fn,
|
||||
const StringRef &separator) {
|
||||
interleave(c.begin(), c.end(), each_fn, [&] { os << separator; });
|
||||
}
|
||||
template <typename Container, typename StreamT,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleave(const Container &c, StreamT &os,
|
||||
const StringRef &separator) {
|
||||
interleave(
|
||||
c, os, [&](const T &a) { os << a; }, separator);
|
||||
}
|
||||
|
||||
template <typename Container, typename UnaryFunctor, typename StreamT,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleaveComma(const Container &c, StreamT &os,
|
||||
UnaryFunctor each_fn) {
|
||||
interleave(c, os, each_fn, ", ");
|
||||
}
|
||||
template <typename Container, typename StreamT,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleaveComma(const Container &c, StreamT &os) {
|
||||
interleaveComma(c, os, [&](const T &a) { os << a; });
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Extra additions to <memory>
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ everything to the LLVM dialect.
|
|||
|
||||
```c++
|
||||
mlir::ConversionTarget target(getContext());
|
||||
target.addLegalDialect<mlir::LLVM::LLVMDialect>();
|
||||
target.addLegalDialect<mlir::LLVMDialect>();
|
||||
target.addLegalOp<mlir::ModuleOp, mlir::ModuleTerminatorOp>();
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -319,7 +319,7 @@ void ToyDialect::printType(mlir::Type type,
|
|||
|
||||
// Print the struct type according to the parser format.
|
||||
printer << "struct<";
|
||||
mlir::interleaveComma(structType.getElementTypes(), printer);
|
||||
llvm::interleaveComma(structType.getElementTypes(), printer);
|
||||
printer << '>';
|
||||
}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -194,7 +194,7 @@ void ASTDumper::dump(PrintExprAST *node) {
|
|||
/// Print type: only the shape is printed in between '<' and '>'
|
||||
void ASTDumper::dump(const VarType &type) {
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -537,7 +537,7 @@ void ToyDialect::printType(mlir::Type type,
|
|||
|
||||
// Print the struct type according to the parser format.
|
||||
printer << "struct<";
|
||||
mlir::interleaveComma(structType.getElementTypes(), printer);
|
||||
llvm::interleaveComma(structType.getElementTypes(), printer);
|
||||
printer << '>';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -130,12 +130,12 @@ void printLitHelper(ExprAST *litOrNum) {
|
|||
|
||||
// Print the dimension for this literal first
|
||||
llvm::errs() << "<";
|
||||
mlir::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::interleaveComma(literal->getDims(), llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
|
||||
// Now print the content, recursing on every element of the list
|
||||
llvm::errs() << "[ ";
|
||||
mlir::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
llvm::interleaveComma(literal->getValues(), llvm::errs(),
|
||||
[&](auto &elt) { printLitHelper(elt.get()); });
|
||||
llvm::errs() << "]";
|
||||
}
|
||||
|
|
@ -210,7 +210,7 @@ void ASTDumper::dump(const VarType &type) {
|
|||
if (!type.name.empty())
|
||||
llvm::errs() << type.name;
|
||||
else
|
||||
mlir::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::interleaveComma(type.shape, llvm::errs());
|
||||
llvm::errs() << ">";
|
||||
}
|
||||
|
||||
|
|
@ -221,7 +221,7 @@ void ASTDumper::dump(PrototypeAST *node) {
|
|||
llvm::errs() << "Proto '" << node->getName() << "' " << loc(node) << "'\n";
|
||||
indent();
|
||||
llvm::errs() << "Params: [";
|
||||
mlir::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
llvm::interleaveComma(node->getArgs(), llvm::errs(),
|
||||
[](auto &arg) { llvm::errs() << arg->getName(); });
|
||||
llvm::errs() << "]\n";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -232,9 +232,8 @@ public:
|
|||
/// is ','.
|
||||
template <typename T, template <typename> class Container>
|
||||
Diagnostic &appendRange(const Container<T> &c, const char *delim = ", ") {
|
||||
interleave(
|
||||
c, [&](const detail::ValueOfRange<Container<T>> &a) { *this << a; },
|
||||
[&]() { *this << delim; });
|
||||
llvm::interleave(
|
||||
c, [this](const auto &a) { *this << a; }, [&]() { *this << delim; });
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ public:
|
|||
(*types.begin()).template isa<FunctionType>();
|
||||
if (wrapped)
|
||||
os << '(';
|
||||
interleaveComma(types, *this);
|
||||
llvm::interleaveComma(types, *this);
|
||||
if (wrapped)
|
||||
os << ')';
|
||||
}
|
||||
|
|
@ -131,7 +131,7 @@ public:
|
|||
void printFunctionalType(InputRangeT &&inputs, ResultRangeT &&results) {
|
||||
auto &os = getStream();
|
||||
os << "(";
|
||||
interleaveComma(inputs, *this);
|
||||
llvm::interleaveComma(inputs, *this);
|
||||
os << ")";
|
||||
printArrowTypeList(results);
|
||||
}
|
||||
|
|
@ -199,11 +199,11 @@ inline OpAsmPrinter &operator<<(OpAsmPrinter &p, Block *value) {
|
|||
template <typename ValueRangeT>
|
||||
inline OpAsmPrinter &operator<<(OpAsmPrinter &p,
|
||||
const ValueTypeRange<ValueRangeT> &types) {
|
||||
interleaveComma(types, p);
|
||||
llvm::interleaveComma(types, p);
|
||||
return p;
|
||||
}
|
||||
inline OpAsmPrinter &operator<<(OpAsmPrinter &p, ArrayRef<Type> types) {
|
||||
interleaveComma(types, p);
|
||||
llvm::interleaveComma(types, p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ public:
|
|||
auto printElementFn = [&](const DataType &value) {
|
||||
printValue(os, this->getParser(), value);
|
||||
};
|
||||
interleave(*this, os, printElementFn, ",");
|
||||
llvm::interleave(*this, os, printElementFn, ",");
|
||||
}
|
||||
|
||||
/// Copy the value from the given option into this one.
|
||||
|
|
|
|||
|
|
@ -19,75 +19,6 @@
|
|||
|
||||
namespace mlir {
|
||||
|
||||
namespace detail {
|
||||
template <typename RangeT>
|
||||
using ValueOfRange = typename std::remove_reference<decltype(
|
||||
*std::begin(std::declval<RangeT &>()))>::type;
|
||||
} // end namespace detail
|
||||
|
||||
/// An STL-style algorithm similar to std::for_each that applies a second
|
||||
/// functor between every pair of elements.
|
||||
///
|
||||
/// This provides the control flow logic to, for example, print a
|
||||
/// comma-separated list:
|
||||
/// \code
|
||||
/// interleave(names.begin(), names.end(),
|
||||
/// [&](StringRef name) { os << name; },
|
||||
/// [&] { os << ", "; });
|
||||
/// \endcode
|
||||
template <typename ForwardIterator, typename UnaryFunctor,
|
||||
typename NullaryFunctor,
|
||||
typename = typename std::enable_if<
|
||||
!std::is_constructible<StringRef, UnaryFunctor>::value &&
|
||||
!std::is_constructible<StringRef, NullaryFunctor>::value>::type>
|
||||
inline void interleave(ForwardIterator begin, ForwardIterator end,
|
||||
UnaryFunctor each_fn, NullaryFunctor between_fn) {
|
||||
if (begin == end)
|
||||
return;
|
||||
each_fn(*begin);
|
||||
++begin;
|
||||
for (; begin != end; ++begin) {
|
||||
between_fn();
|
||||
each_fn(*begin);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Container, typename UnaryFunctor, typename NullaryFunctor,
|
||||
typename = typename std::enable_if<
|
||||
!std::is_constructible<StringRef, UnaryFunctor>::value &&
|
||||
!std::is_constructible<StringRef, NullaryFunctor>::value>::type>
|
||||
inline void interleave(const Container &c, UnaryFunctor each_fn,
|
||||
NullaryFunctor between_fn) {
|
||||
interleave(c.begin(), c.end(), each_fn, between_fn);
|
||||
}
|
||||
|
||||
/// Overload of interleave for the common case of string separator.
|
||||
template <typename Container, typename UnaryFunctor, typename raw_ostream,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleave(const Container &c, raw_ostream &os,
|
||||
UnaryFunctor each_fn, const StringRef &separator) {
|
||||
interleave(c.begin(), c.end(), each_fn, [&] { os << separator; });
|
||||
}
|
||||
template <typename Container, typename raw_ostream,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleave(const Container &c, raw_ostream &os,
|
||||
const StringRef &separator) {
|
||||
interleave(
|
||||
c, os, [&](const T &a) { os << a; }, separator);
|
||||
}
|
||||
|
||||
template <typename Container, typename UnaryFunctor, typename raw_ostream,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleaveComma(const Container &c, raw_ostream &os,
|
||||
UnaryFunctor each_fn) {
|
||||
interleave(c, os, each_fn, ", ");
|
||||
}
|
||||
template <typename Container, typename raw_ostream,
|
||||
typename T = detail::ValueOfRange<Container>>
|
||||
inline void interleaveComma(const Container &c, raw_ostream &os) {
|
||||
interleaveComma(c, os, [&](const T &a) { os << a; });
|
||||
}
|
||||
|
||||
} // end namespace mlir
|
||||
|
||||
#endif // MLIR_SUPPORT_STLEXTRAS_H
|
||||
|
|
|
|||
|
|
@ -2304,7 +2304,7 @@ static void print(OpAsmPrinter &p, AffineParallelOp op) {
|
|||
}
|
||||
if (!elideSteps) {
|
||||
p << " step (";
|
||||
interleaveComma(steps, p);
|
||||
llvm::interleaveComma(steps, p);
|
||||
p << ')';
|
||||
}
|
||||
p.printRegion(op.region(), /*printEntryBlockArgs=*/false,
|
||||
|
|
|
|||
|
|
@ -610,8 +610,8 @@ static void printAttributions(OpAsmPrinter &p, StringRef keyword,
|
|||
return;
|
||||
|
||||
p << ' ' << keyword << '(';
|
||||
interleaveComma(values, p,
|
||||
[&p](BlockArgument v) { p << v << " : " << v.getType(); });
|
||||
llvm::interleaveComma(
|
||||
values, p, [&p](BlockArgument v) { p << v << " : " << v.getType(); });
|
||||
p << ')';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1056,7 +1056,7 @@ static void appendMangledType(llvm::raw_string_ostream &ss, Type t) {
|
|||
appendMangledType(ss, memref.getElementType());
|
||||
} else if (auto vec = t.dyn_cast<VectorType>()) {
|
||||
ss << "vector";
|
||||
interleave(
|
||||
llvm::interleave(
|
||||
vec.getShape(), [&](int64_t i) { ss << i; }, [&]() { ss << "x"; });
|
||||
appendMangledType(ss, vec.getElementType());
|
||||
} else if (t.isSignlessIntOrIndexOrFloat()) {
|
||||
|
|
@ -1074,7 +1074,7 @@ std::string mlir::linalg::generateLibraryCallName(Operation *op) {
|
|||
llvm::raw_string_ostream ss(name);
|
||||
ss << "_";
|
||||
auto types = op->getOperandTypes();
|
||||
interleave(
|
||||
llvm::interleave(
|
||||
types.begin(), types.end(), [&](Type t) { appendMangledType(ss, t); },
|
||||
[&]() { ss << "_"; });
|
||||
return ss.str();
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ static void print(OpAsmPrinter &p, ForOp op) {
|
|||
auto regionArgs = op.getRegionIterArgs();
|
||||
auto operands = op.getIterOperands();
|
||||
|
||||
mlir::interleaveComma(llvm::zip(regionArgs, operands), p, [&](auto it) {
|
||||
llvm::interleaveComma(llvm::zip(regionArgs, operands), p, [&](auto it) {
|
||||
p << std::get<0>(it) << " = " << std::get<1>(it);
|
||||
});
|
||||
p << ")";
|
||||
|
|
|
|||
|
|
@ -354,7 +354,7 @@ static void printUniformQuantizedPerAxisType(UniformQuantizedPerAxisType type,
|
|||
ArrayRef<double> scales = type.getScales();
|
||||
ArrayRef<int64_t> zeroPoints = type.getZeroPoints();
|
||||
out << "{";
|
||||
interleave(
|
||||
llvm::interleave(
|
||||
llvm::seq<size_t>(0, scales.size()), out,
|
||||
[&](size_t index) {
|
||||
printQuantParams(scales[index], zeroPoints[index], out);
|
||||
|
|
|
|||
|
|
@ -587,12 +587,12 @@ static void print(StructType type, DialectAsmPrinter &os) {
|
|||
auto eachFn = [&os](spirv::Decoration decoration) {
|
||||
os << stringifyDecoration(decoration);
|
||||
};
|
||||
interleaveComma(decorations, os, eachFn);
|
||||
llvm::interleaveComma(decorations, os, eachFn);
|
||||
os << "]";
|
||||
}
|
||||
};
|
||||
interleaveComma(llvm::seq<unsigned>(0, type.getNumElements()), os,
|
||||
printMember);
|
||||
llvm::interleaveComma(llvm::seq<unsigned>(0, type.getNumElements()), os,
|
||||
printMember);
|
||||
os << ">";
|
||||
}
|
||||
|
||||
|
|
@ -856,11 +856,11 @@ static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer) {
|
|||
auto &os = printer.getStream();
|
||||
printer << spirv::VerCapExtAttr::getKindName() << "<"
|
||||
<< spirv::stringifyVersion(triple.getVersion()) << ", [";
|
||||
interleaveComma(triple.getCapabilities(), os, [&](spirv::Capability cap) {
|
||||
os << spirv::stringifyCapability(cap);
|
||||
});
|
||||
llvm::interleaveComma(
|
||||
triple.getCapabilities(), os,
|
||||
[&](spirv::Capability cap) { os << spirv::stringifyCapability(cap); });
|
||||
printer << "], [";
|
||||
interleaveComma(triple.getExtensionsAttr(), os, [&](Attribute attr) {
|
||||
llvm::interleaveComma(triple.getExtensionsAttr(), os, [&](Attribute attr) {
|
||||
os << attr.cast<StringAttr>().getValue();
|
||||
});
|
||||
printer << "]>";
|
||||
|
|
|
|||
|
|
@ -1064,7 +1064,7 @@ static void print(spirv::BranchConditionalOp branchOp, OpAsmPrinter &printer) {
|
|||
|
||||
if (auto weights = branchOp.branch_weights()) {
|
||||
printer << " [";
|
||||
interleaveComma(weights->getValue(), printer, [&](Attribute a) {
|
||||
llvm::interleaveComma(weights->getValue(), printer, [&](Attribute a) {
|
||||
printer << a.cast<IntegerAttr>().getInt();
|
||||
});
|
||||
printer << "]";
|
||||
|
|
@ -1465,7 +1465,7 @@ static void print(spirv::EntryPointOp entryPointOp, OpAsmPrinter &printer) {
|
|||
auto interfaceVars = entryPointOp.interface().getValue();
|
||||
if (!interfaceVars.empty()) {
|
||||
printer << ", ";
|
||||
interleaveComma(interfaceVars, printer);
|
||||
llvm::interleaveComma(interfaceVars, printer);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1521,7 +1521,7 @@ static void print(spirv::ExecutionModeOp execModeOp, OpAsmPrinter &printer) {
|
|||
if (!values.size())
|
||||
return;
|
||||
printer << ", ";
|
||||
interleaveComma(values, printer, [&](Attribute a) {
|
||||
llvm::interleaveComma(values, printer, [&](Attribute a) {
|
||||
printer << a.cast<IntegerAttr>().getInt();
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1512,7 +1512,7 @@ static void print(OpAsmPrinter &p, TupleOp op) {
|
|||
p.printOperands(op.getOperands());
|
||||
p.printOptionalAttrDict(op.getAttrs());
|
||||
p << " : ";
|
||||
interleaveComma(op.getOperation()->getOperandTypes(), p);
|
||||
llvm::interleaveComma(op.getOperation()->getOperandTypes(), p);
|
||||
}
|
||||
|
||||
static LogicalResult verify(TupleOp op) { return success(); }
|
||||
|
|
|
|||
|
|
@ -933,7 +933,7 @@ public:
|
|||
|
||||
template <typename Container, typename UnaryFunctor>
|
||||
inline void interleaveComma(const Container &c, UnaryFunctor each_fn) const {
|
||||
mlir::interleaveComma(c, os, each_fn);
|
||||
llvm::interleaveComma(c, os, each_fn);
|
||||
}
|
||||
|
||||
/// This enum describes the different kinds of elision for the type of an
|
||||
|
|
|
|||
|
|
@ -216,11 +216,12 @@ static void printFunctionResultList(OpAsmPrinter &p, ArrayRef<Type> types,
|
|||
types.size() > 1 || types[0].isa<FunctionType>() || !attrs[0].empty();
|
||||
if (needsParens)
|
||||
os << '(';
|
||||
interleaveComma(llvm::zip(types, attrs), os,
|
||||
[&](const std::tuple<Type, ArrayRef<NamedAttribute>> &t) {
|
||||
p.printType(std::get<0>(t));
|
||||
p.printOptionalAttrDict(std::get<1>(t));
|
||||
});
|
||||
llvm::interleaveComma(
|
||||
llvm::zip(types, attrs), os,
|
||||
[&](const std::tuple<Type, ArrayRef<NamedAttribute>> &t) {
|
||||
p.printType(std::get<0>(t));
|
||||
p.printOptionalAttrDict(std::get<1>(t));
|
||||
});
|
||||
if (needsParens)
|
||||
os << ')';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,11 +52,12 @@ void Pass::copyOptionValuesFrom(const Pass *other) {
|
|||
void Pass::printAsTextualPipeline(raw_ostream &os) {
|
||||
// Special case for adaptors to use the 'op_name(sub_passes)' format.
|
||||
if (auto *adaptor = getAdaptorPassBase(this)) {
|
||||
interleaveComma(adaptor->getPassManagers(), os, [&](OpPassManager &pm) {
|
||||
os << pm.getOpName() << "(";
|
||||
pm.printAsTextualPipeline(os);
|
||||
os << ")";
|
||||
});
|
||||
llvm::interleaveComma(adaptor->getPassManagers(), os,
|
||||
[&](OpPassManager &pm) {
|
||||
os << pm.getOpName() << "(";
|
||||
pm.printAsTextualPipeline(os);
|
||||
os << ")";
|
||||
});
|
||||
return;
|
||||
}
|
||||
// Otherwise, print the pass argument followed by its options. If the pass
|
||||
|
|
@ -295,9 +296,10 @@ void OpPassManager::printAsTextualPipeline(raw_ostream &os) {
|
|||
impl->passes, [](const std::unique_ptr<Pass> &pass) {
|
||||
return !isa<VerifierPass>(pass);
|
||||
});
|
||||
interleaveComma(filteredPasses, os, [&](const std::unique_ptr<Pass> &pass) {
|
||||
pass->printAsTextualPipeline(os);
|
||||
});
|
||||
llvm::interleaveComma(filteredPasses, os,
|
||||
[&](const std::unique_ptr<Pass> &pass) {
|
||||
pass->printAsTextualPipeline(os);
|
||||
});
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
@ -358,7 +360,7 @@ void OpToOpPassAdaptorBase::mergeInto(OpToOpPassAdaptorBase &rhs) {
|
|||
std::string OpToOpPassAdaptorBase::getName() {
|
||||
std::string name = "Pipeline Collection : [";
|
||||
llvm::raw_string_ostream os(name);
|
||||
interleaveComma(getPassManagers(), os, [&](OpPassManager &pm) {
|
||||
llvm::interleaveComma(getPassManagers(), os, [&](OpPassManager &pm) {
|
||||
os << '\'' << pm.getOpName() << '\'';
|
||||
});
|
||||
os << ']';
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ void detail::PassOptions::print(raw_ostream &os) {
|
|||
|
||||
// Interleave the options with ' '.
|
||||
os << '{';
|
||||
interleave(
|
||||
llvm::interleave(
|
||||
orderedOps, os, [&](OptionBase *option) { option->print(os); }, " ");
|
||||
os << '}';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1250,7 +1250,7 @@ OperationLegalizer::legalizePattern(Operation *op, RewritePattern *pattern,
|
|||
auto &os = rewriterImpl.logger;
|
||||
os.getOStream() << "\n";
|
||||
os.startLine() << "* Pattern : '" << pattern->getRootKind() << " -> (";
|
||||
interleaveComma(pattern->getGeneratedOps(), llvm::dbgs());
|
||||
llvm::interleaveComma(pattern->getGeneratedOps(), llvm::dbgs());
|
||||
os.getOStream() << ")' {\n";
|
||||
os.indent();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ std::string DOTGraphTraits<Block *>::getNodeLabel(Operation *op, Block *b) {
|
|||
}
|
||||
|
||||
// Print resultant types
|
||||
interleaveComma(op->getResultTypes(), os);
|
||||
llvm::interleaveComma(op->getResultTypes(), os);
|
||||
os << "\n";
|
||||
|
||||
// A value used to elide large container attribute.
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ void VectorizerTestPass::testVectorShapeRatio(llvm::raw_ostream &outs) {
|
|||
opInst->emitRemark("NOT MATCHED");
|
||||
} else {
|
||||
outs << "\nmatched: " << *opInst << " with shape ratio: ";
|
||||
interleaveComma(MutableArrayRef<int64_t>(*ratio), outs);
|
||||
llvm::interleaveComma(MutableArrayRef<int64_t>(*ratio), outs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ void PrintOpAvailability::runOnFunction() {
|
|||
os << opName << " extensions: [";
|
||||
for (const auto &exts : extension.getExtensions()) {
|
||||
os << " [";
|
||||
interleaveComma(exts, os, [&](spirv::Extension ext) {
|
||||
llvm::interleaveComma(exts, os, [&](spirv::Extension ext) {
|
||||
os << spirv::stringifyExtension(ext);
|
||||
});
|
||||
os << "]";
|
||||
|
|
@ -63,7 +63,7 @@ void PrintOpAvailability::runOnFunction() {
|
|||
os << opName << " capabilities: [";
|
||||
for (const auto &caps : capability.getCapabilities()) {
|
||||
os << " [";
|
||||
interleaveComma(caps, os, [&](spirv::Capability cap) {
|
||||
llvm::interleaveComma(caps, os, [&](spirv::Capability cap) {
|
||||
os << spirv::stringifyCapability(cap);
|
||||
});
|
||||
os << "]";
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ void TestMemRefStrideCalculation::runOnFunction() {
|
|||
else
|
||||
llvm::outs() << offset;
|
||||
llvm::outs() << " strides: ";
|
||||
interleaveComma(strides, llvm::outs(), [&](int64_t v) {
|
||||
llvm::interleaveComma(strides, llvm::outs(), [&](int64_t v) {
|
||||
if (v == MemRefType::getDynamicStrideOrOffset())
|
||||
llvm::outs() << "?";
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1480,22 +1480,23 @@ void TCParser::printReferenceIterators(llvm::raw_ostream &os, StringRef opId,
|
|||
std::string iteratorsStr;
|
||||
llvm::raw_string_ostream ss(iteratorsStr);
|
||||
unsigned pos = 0;
|
||||
interleaveComma(state.dims, ss, [&](std::pair<StringRef, AffineExpr> p) {
|
||||
bool reduction = false;
|
||||
for (auto &expr : state.expressions) {
|
||||
visitPostorder(*expr, [&](const Expression &e) {
|
||||
if (auto *pTensorExpr = dyn_cast<TensorExpr>(&e)) {
|
||||
if (pTensorExpr->reductionDimensions.count(pos) > 0)
|
||||
reduction = true;
|
||||
llvm::interleaveComma(
|
||||
state.dims, ss, [&](std::pair<StringRef, AffineExpr> p) {
|
||||
bool reduction = false;
|
||||
for (auto &expr : state.expressions) {
|
||||
visitPostorder(*expr, [&](const Expression &e) {
|
||||
if (auto *pTensorExpr = dyn_cast<TensorExpr>(&e)) {
|
||||
if (pTensorExpr->reductionDimensions.count(pos) > 0)
|
||||
reduction = true;
|
||||
}
|
||||
});
|
||||
if (reduction)
|
||||
break;
|
||||
}
|
||||
ss << (reduction ? "getReductionIteratorTypeName()"
|
||||
: "getParallelIteratorTypeName()");
|
||||
pos++;
|
||||
});
|
||||
if (reduction)
|
||||
break;
|
||||
}
|
||||
ss << (reduction ? "getReductionIteratorTypeName()"
|
||||
: "getParallelIteratorTypeName()");
|
||||
pos++;
|
||||
});
|
||||
ss.flush();
|
||||
|
||||
os << llvm::formatv(referenceReferenceIteratorsFmt, opId, iteratorsStr);
|
||||
|
|
@ -1515,8 +1516,9 @@ void TCParser::printReferenceIndexingMaps(llvm::raw_ostream &os, StringRef opId,
|
|||
|
||||
std::string dimsStr;
|
||||
llvm::raw_string_ostream ss(dimsStr);
|
||||
interleaveComma(state.dims, ss,
|
||||
[&](std::pair<StringRef, AffineExpr> p) { ss << p.second; });
|
||||
llvm::interleaveComma(
|
||||
state.dims, ss,
|
||||
[&](std::pair<StringRef, AffineExpr> p) { ss << p.second; });
|
||||
ss.flush();
|
||||
|
||||
std::string mapsStr;
|
||||
|
|
@ -1524,7 +1526,7 @@ void TCParser::printReferenceIndexingMaps(llvm::raw_ostream &os, StringRef opId,
|
|||
SmallVector<TensorUse, 4> orderedUses(state.orderedTensorArgs.size());
|
||||
for (auto it : state.orderedTensorArgs)
|
||||
orderedUses[it.second] = it.first;
|
||||
interleaveComma(orderedUses, mapsStringStream, [&](TensorUse u) {
|
||||
llvm::interleaveComma(orderedUses, mapsStringStream, [&](TensorUse u) {
|
||||
assert(u.indexingMap);
|
||||
const char *mapFmt = "\n\tAffineMap::get({0}, 0, {1})";
|
||||
if (u.indexingMap.isEmpty()) {
|
||||
|
|
@ -1535,7 +1537,7 @@ void TCParser::printReferenceIndexingMaps(llvm::raw_ostream &os, StringRef opId,
|
|||
std::string exprsStr;
|
||||
llvm::raw_string_ostream exprsStringStream(exprsStr);
|
||||
exprsStringStream << "{";
|
||||
interleaveComma(u.indexingMap.getResults(), exprsStringStream);
|
||||
llvm::interleaveComma(u.indexingMap.getResults(), exprsStringStream);
|
||||
exprsStringStream << "}";
|
||||
exprsStringStream.flush();
|
||||
|
||||
|
|
@ -1563,10 +1565,10 @@ void TCParser::printRegionBuilder(llvm::raw_ostream &os, StringRef opId,
|
|||
} else {
|
||||
std::string subExprs;
|
||||
llvm::raw_string_ostream subExprsStringStream(subExprs);
|
||||
interleaveComma(pTensorExpr->expressions, subExprsStringStream,
|
||||
[&](const std::unique_ptr<Expression> &e) {
|
||||
printExpr(subExprsStringStream, *e);
|
||||
});
|
||||
llvm::interleaveComma(pTensorExpr->expressions, subExprsStringStream,
|
||||
[&](const std::unique_ptr<Expression> &e) {
|
||||
printExpr(subExprsStringStream, *e);
|
||||
});
|
||||
subExprsStringStream.flush();
|
||||
const char *tensorExprFmt = "\n ValueHandle _{0} = {1}({2});";
|
||||
os << llvm::formatv(tensorExprFmt, ++count, pTensorExpr->opId, subExprs);
|
||||
|
|
@ -1586,10 +1588,11 @@ void TCParser::printRegionBuilder(llvm::raw_ostream &os, StringRef opId,
|
|||
unsigned idx = 0;
|
||||
std::string valueHandleStr;
|
||||
llvm::raw_string_ostream valueHandleStringStream(valueHandleStr);
|
||||
interleaveComma(state.orderedTensorArgs, valueHandleStringStream, [&](auto) {
|
||||
valueHandleStringStream << "_" << idx << "(args[" << idx << "])";
|
||||
idx++;
|
||||
});
|
||||
llvm::interleaveComma(
|
||||
state.orderedTensorArgs, valueHandleStringStream, [&](auto) {
|
||||
valueHandleStringStream << "_" << idx << "(args[" << idx << "])";
|
||||
idx++;
|
||||
});
|
||||
|
||||
std::string expressionsStr;
|
||||
llvm::raw_string_ostream expressionStringStream(expressionsStr);
|
||||
|
|
@ -1601,10 +1604,10 @@ void TCParser::printRegionBuilder(llvm::raw_ostream &os, StringRef opId,
|
|||
|
||||
std::string yieldStr;
|
||||
llvm::raw_string_ostream yieldStringStream(yieldStr);
|
||||
interleaveComma(state.expressions, yieldStringStream,
|
||||
[&](const std::unique_ptr<Expression> &e) {
|
||||
printExpr(yieldStringStream, *e);
|
||||
});
|
||||
llvm::interleaveComma(state.expressions, yieldStringStream,
|
||||
[&](const std::unique_ptr<Expression> &e) {
|
||||
printExpr(yieldStringStream, *e);
|
||||
});
|
||||
|
||||
valueHandleStringStream.flush();
|
||||
expressionStringStream.flush();
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ private:
|
|||
template <typename Range>
|
||||
void printBracketedRange(const Range &range, llvm::raw_ostream &os) {
|
||||
os << '[';
|
||||
mlir::interleaveComma(range, os);
|
||||
llvm::interleaveComma(range, os);
|
||||
os << ']';
|
||||
}
|
||||
|
||||
|
|
@ -213,7 +213,7 @@ static bool emitIntrinsic(const llvm::Record &record, llvm::raw_ostream &os) {
|
|||
printBracketedRange(traits, os);
|
||||
os << ", " << (intr.getNumResults() == 0 ? 0 : 1) << ">, Arguments<(ins"
|
||||
<< (operands.empty() ? "" : " ");
|
||||
mlir::interleaveComma(operands, os);
|
||||
llvm::interleaveComma(operands, os);
|
||||
os << ")>;\n\n";
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1107,14 +1107,16 @@ void OpEmitter::genCodeForAddingArgAndRegionForBuilder(OpMethodBody &body,
|
|||
body << " " << builderOpState
|
||||
<< ".addAttribute(\"operand_segment_sizes\", "
|
||||
"odsBuilder->getI32VectorAttr({";
|
||||
interleaveComma(llvm::seq<int>(0, op.getNumOperands()), body, [&](int i) {
|
||||
if (op.getOperand(i).isOptional())
|
||||
body << "(" << getArgumentName(op, i) << " ? 1 : 0)";
|
||||
else if (op.getOperand(i).isVariadic())
|
||||
body << "static_cast<int32_t>(" << getArgumentName(op, i) << ".size())";
|
||||
else
|
||||
body << "1";
|
||||
});
|
||||
llvm::interleaveComma(
|
||||
llvm::seq<int>(0, op.getNumOperands()), body, [&](int i) {
|
||||
if (op.getOperand(i).isOptional())
|
||||
body << "(" << getArgumentName(op, i) << " ? 1 : 0)";
|
||||
else if (op.getOperand(i).isVariadic())
|
||||
body << "static_cast<int32_t>(" << getArgumentName(op, i)
|
||||
<< ".size())";
|
||||
else
|
||||
body << "1";
|
||||
});
|
||||
body << "}));\n";
|
||||
}
|
||||
|
||||
|
|
@ -1212,7 +1214,7 @@ void OpEmitter::genOpInterfaceMethods() {
|
|||
continue;
|
||||
std::string args;
|
||||
llvm::raw_string_ostream os(args);
|
||||
mlir::interleaveComma(method.getArguments(), os,
|
||||
llvm::interleaveComma(method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) {
|
||||
os << arg.type << " " << arg.name;
|
||||
});
|
||||
|
|
@ -1766,7 +1768,7 @@ static void emitOpClasses(const std::vector<Record *> &defs, raw_ostream &os,
|
|||
static void emitOpList(const std::vector<Record *> &defs, raw_ostream &os) {
|
||||
IfDefScope scope("GET_OP_LIST", os);
|
||||
|
||||
interleave(
|
||||
llvm::interleave(
|
||||
// TODO: We are constructing the Operator wrapper instance just for
|
||||
// getting it's qualified class name here. Reduce the overhead by having a
|
||||
// lightweight version of Operator class just for that purpose.
|
||||
|
|
|
|||
|
|
@ -795,7 +795,7 @@ void OperationFormat::genParserTypeResolution(Operator &op,
|
|||
body << " if (parser.resolveOperands(";
|
||||
if (op.getNumOperands() > 1) {
|
||||
body << "llvm::concat<const OpAsmParser::OperandType>(";
|
||||
interleaveComma(op.getOperands(), body, [&](auto &operand) {
|
||||
llvm::interleaveComma(op.getOperands(), body, [&](auto &operand) {
|
||||
body << operand.name << "Operands";
|
||||
});
|
||||
body << ")";
|
||||
|
|
@ -815,11 +815,12 @@ void OperationFormat::genParserTypeResolution(Operator &op,
|
|||
// the case of a single range, so guard it here.
|
||||
if (op.getNumOperands() > 1) {
|
||||
body << "llvm::concat<const Type>(";
|
||||
interleaveComma(llvm::seq<int>(0, op.getNumOperands()), body, [&](int i) {
|
||||
body << "ArrayRef<Type>(";
|
||||
emitTypeResolver(operandTypes[i], op.getOperand(i).name);
|
||||
body << ")";
|
||||
});
|
||||
llvm::interleaveComma(
|
||||
llvm::seq<int>(0, op.getNumOperands()), body, [&](int i) {
|
||||
body << "ArrayRef<Type>(";
|
||||
emitTypeResolver(operandTypes[i], op.getOperand(i).name);
|
||||
body << ")";
|
||||
});
|
||||
body << ")";
|
||||
} else {
|
||||
emitTypeResolver(operandTypes.front(), op.getOperand(0).name);
|
||||
|
|
@ -875,7 +876,7 @@ void OperationFormat::genParserVariadicSegmentResolution(Operator &op,
|
|||
else
|
||||
body << "1";
|
||||
};
|
||||
interleaveComma(op.getOperands(), body, interleaveFn);
|
||||
llvm::interleaveComma(op.getOperands(), body, interleaveFn);
|
||||
body << "}));\n";
|
||||
}
|
||||
}
|
||||
|
|
@ -897,7 +898,7 @@ static void genAttrDictPrinter(OperationFormat &fmt, Operator &op,
|
|||
// Elide the variadic segment size attributes if necessary.
|
||||
if (!fmt.allOperands && op.getTrait("OpTrait::AttrSizedOperandSegments"))
|
||||
body << "\"operand_segment_sizes\", ";
|
||||
interleaveComma(usedAttributes, body, [&](const NamedAttribute *attr) {
|
||||
llvm::interleaveComma(usedAttributes, body, [&](const NamedAttribute *attr) {
|
||||
body << "\"" << attr->name << "\"";
|
||||
});
|
||||
body << "});\n";
|
||||
|
|
@ -1016,13 +1017,13 @@ static void genElementPrinter(Element *element, OpMethodBody &body,
|
|||
} else if (auto *successor = dyn_cast<SuccessorVariable>(element)) {
|
||||
const NamedSuccessor *var = successor->getVar();
|
||||
if (var->isVariadic())
|
||||
body << " interleaveComma(" << var->name << "(), p);\n";
|
||||
body << " llvm::interleaveComma(" << var->name << "(), p);\n";
|
||||
else
|
||||
body << " p << " << var->name << "();\n";
|
||||
} else if (isa<OperandsDirective>(element)) {
|
||||
body << " p << getOperation()->getOperands();\n";
|
||||
} else if (isa<SuccessorsDirective>(element)) {
|
||||
body << " interleaveComma(getOperation()->getSuccessors(), p);\n";
|
||||
body << " llvm::interleaveComma(getOperation()->getSuccessors(), p);\n";
|
||||
} else if (auto *dir = dyn_cast<TypeDirective>(element)) {
|
||||
body << " p << ";
|
||||
genTypeOperandPrinter(dir->getOperand(), body) << ";\n";
|
||||
|
|
|
|||
|
|
@ -36,10 +36,10 @@ static void emitMethodNameAndArgs(const OpInterfaceMethod &method,
|
|||
os << method.getName() << '(';
|
||||
if (addOperationArg)
|
||||
os << "Operation *tablegen_opaque_op" << (method.arg_empty() ? "" : ", ");
|
||||
interleaveComma(method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) {
|
||||
os << arg.type << " " << arg.name;
|
||||
});
|
||||
llvm::interleaveComma(method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) {
|
||||
os << arg.type << " " << arg.name;
|
||||
});
|
||||
os << ')';
|
||||
}
|
||||
|
||||
|
|
@ -72,7 +72,7 @@ static void emitInterfaceDef(OpInterface &interface, raw_ostream &os) {
|
|||
os << " {\n return getImpl()->" << method.getName() << '(';
|
||||
if (!method.isStatic())
|
||||
os << "getOperation()" << (method.arg_empty() ? "" : ", ");
|
||||
interleaveComma(
|
||||
llvm::interleaveComma(
|
||||
method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) { os << arg.name; });
|
||||
os << ");\n }\n";
|
||||
|
|
@ -135,7 +135,7 @@ static void emitModelDecl(OpInterface &interface, raw_ostream &os) {
|
|||
|
||||
// Add the arguments to the call.
|
||||
os << method.getName() << '(';
|
||||
interleaveComma(
|
||||
llvm::interleaveComma(
|
||||
method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) { os << arg.name; });
|
||||
os << ");\n }\n";
|
||||
|
|
@ -255,10 +255,10 @@ static void emitInterfaceDoc(const Record &interfaceDef, raw_ostream &os) {
|
|||
if (method.isStatic())
|
||||
os << "static ";
|
||||
emitCPPType(method.getReturnType(), os) << method.getName() << '(';
|
||||
interleaveComma(method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) {
|
||||
emitCPPType(arg.type, os) << arg.name;
|
||||
});
|
||||
llvm::interleaveComma(method.getArguments(), os,
|
||||
[&](const OpInterfaceMethod::Argument &arg) {
|
||||
emitCPPType(arg.type, os) << arg.name;
|
||||
});
|
||||
os << ");\n```\n";
|
||||
|
||||
// Emit the description.
|
||||
|
|
|
|||
|
|
@ -500,7 +500,7 @@ void PatternEmitter::emit(StringRef rewriteName) {
|
|||
llvm::sort(sortedResultOps, [&](const Operator *lhs, const Operator *rhs) {
|
||||
return lhs->getOperationName() < rhs->getOperationName();
|
||||
});
|
||||
interleaveComma(sortedResultOps, os, [&](const Operator *op) {
|
||||
llvm::interleaveComma(sortedResultOps, os, [&](const Operator *op) {
|
||||
os << '"' << op->getOperationName() << '"';
|
||||
});
|
||||
os << formatv(R"(}, {0}, context) {{})", pattern.getBenefit()) << "\n";
|
||||
|
|
|
|||
|
|
@ -1305,7 +1305,7 @@ static bool emitCapabilityImplication(const RecordKeeper &recordKeeper,
|
|||
os << " case Capability::" << enumerant.getSymbol()
|
||||
<< ": {static const Capability implies[" << impliedCapsDefs.size()
|
||||
<< "] = {";
|
||||
mlir::interleaveComma(impliedCapsDefs, os, [&](const Record *capDef) {
|
||||
llvm::interleaveComma(impliedCapsDefs, os, [&](const Record *capDef) {
|
||||
os << "Capability::" << EnumAttrCase(capDef).getSymbol();
|
||||
});
|
||||
os << "}; return ArrayRef<Capability>(implies, " << impliedCapsDefs.size()
|
||||
|
|
|
|||
Loading…
Reference in New Issue