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