diff --git a/mlir/docs/PassManagement.md b/mlir/docs/PassManagement.md --- a/mlir/docs/PassManagement.md +++ b/mlir/docs/PassManagement.md @@ -705,8 +705,7 @@ llvm::cl::desc("An example option"), llvm::cl::init(true)}; ListOption listOption{ *this, "example-list", - llvm::cl::desc("An example list option"), llvm::cl::ZeroOrMore, - llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::desc("An example list option"), llvm::cl::ZeroOrMore}; // Specify any statistics. Statistic statistic{this, "example-statistic", "An example statistic"}; @@ -742,8 +741,7 @@ Option<"option", "example-option", "bool", /*default=*/"true", "An example option">, ListOption<"listOption", "example-list", "int64_t", - "An example list option", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated"> + "An example list option", "llvm::cl::ZeroOrMore"> ]; // Specify any statistics. @@ -879,8 +877,7 @@ def MyPass : Pass<"my-pass"> { let options = [ ListOption<"listOption", "example-list", "int64_t", - "An example list option", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated"> + "An example list option", "llvm::cl::ZeroOrMore"> ]; } ``` diff --git a/mlir/docs/PatternRewriter.md b/mlir/docs/PatternRewriter.md --- a/mlir/docs/PatternRewriter.md +++ b/mlir/docs/PatternRewriter.md @@ -439,12 +439,10 @@ ```tablegen ListOption<"disabledPatterns", "disable-patterns", "std::string", - "Labels of patterns that should be filtered out during application", - "llvm::cl::MiscFlags::CommaSeparated">, + "Labels of patterns that should be filtered out during application">, ListOption<"enabledPatterns", "enable-patterns", "std::string", "Labels of patterns that should be used during application, all " - "other patterns are filtered out", - "llvm::cl::MiscFlags::CommaSeparated">, + "other patterns are filtered out">, ``` These options may be used to provide filtering behavior when constructing any diff --git a/mlir/include/mlir/Dialect/Affine/Passes.td b/mlir/include/mlir/Dialect/Affine/Passes.td --- a/mlir/include/mlir/Dialect/Affine/Passes.td +++ b/mlir/include/mlir/Dialect/Affine/Passes.td @@ -348,7 +348,7 @@ let options = [ ListOption<"vectorSizes", "virtual-vector-size", "int64_t", "Specify an n-D virtual vector size for vectorization", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated">, + "llvm::cl::ZeroOrMore">, // Optionally, the fixed mapping from loop to fastest varying MemRef // dimension for all the MemRefs within a loop pattern: // the index represents the loop depth, the value represents the k^th @@ -359,7 +359,7 @@ "Specify a 1-D, 2-D or 3-D pattern of fastest varying memory " "dimensions to match. See defaultPatterns in Vectorize.cpp for " "a description and examples. This is used for testing purposes", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated">, + "llvm::cl::ZeroOrMore">, Option<"vectorizeReductions", "vectorize-reductions", "bool", /*default=*/"false", "Vectorize known reductions expressed via iter_args. " diff --git a/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.td b/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.td --- a/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.td +++ b/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.td @@ -215,8 +215,7 @@ "Specify if buffers should be deallocated. For compatibility with " "core bufferization passes.">, ListOption<"dialectFilter", "dialect-filter", "std::string", - "Restrict bufferization to ops from these dialects.", - "llvm::cl::MiscFlags::CommaSeparated">, + "Restrict bufferization to ops from these dialects.">, Option<"fullyDynamicLayoutMaps", "fully-dynamic-layout-maps", "bool", /*default=*/"true", "Generate MemRef types with dynamic offset+strides by default.">, diff --git a/mlir/include/mlir/Dialect/Linalg/Passes.td b/mlir/include/mlir/Dialect/Linalg/Passes.td --- a/mlir/include/mlir/Dialect/Linalg/Passes.td +++ b/mlir/include/mlir/Dialect/Linalg/Passes.td @@ -194,7 +194,7 @@ ]; let options = [ ListOption<"tileSizes", "tile-sizes", "int64_t", "Tile sizes", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated">, + "llvm::cl::ZeroOrMore">, Option<"loopType", "loop-type", "std::string", /*default=*/"\"for\"", "Specify the type of loops to generate: for, parallel"> ]; diff --git a/mlir/include/mlir/Dialect/SCF/Passes.td b/mlir/include/mlir/Dialect/SCF/Passes.td --- a/mlir/include/mlir/Dialect/SCF/Passes.td +++ b/mlir/include/mlir/Dialect/SCF/Passes.td @@ -55,14 +55,11 @@ let constructor = "mlir::createParallelLoopCollapsingPass()"; let options = [ ListOption<"clCollapsedIndices0", "collapsed-indices-0", "unsigned", - "Which loop indices to combine 0th loop index", - "llvm::cl::MiscFlags::CommaSeparated">, + "Which loop indices to combine 0th loop index">, ListOption<"clCollapsedIndices1", "collapsed-indices-1", "unsigned", - "Which loop indices to combine into the position 1 loop index", - "llvm::cl::MiscFlags::CommaSeparated">, + "Which loop indices to combine into the position 1 loop index">, ListOption<"clCollapsedIndices2", "collapsed-indices-2", "unsigned", - "Which loop indices to combine into the position 2 loop index", - "llvm::cl::MiscFlags::CommaSeparated">, + "Which loop indices to combine into the position 2 loop index">, ]; } @@ -77,8 +74,7 @@ let constructor = "mlir::createParallelLoopTilingPass()"; let options = [ ListOption<"tileSizes", "parallel-loop-tile-sizes", "int64_t", - "Factors to tile parallel loops by", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated">, + "Factors to tile parallel loops by", "llvm::cl::ZeroOrMore">, Option<"noMinMaxBounds", "no-min-max-bounds", "bool", /*default=*/"false", "Perform tiling with fixed upper bound with inbound check " diff --git a/mlir/include/mlir/Pass/PassOptions.h b/mlir/include/mlir/Pass/PassOptions.h --- a/mlir/include/mlir/Pass/PassOptions.h +++ b/mlir/include/mlir/Pass/PassOptions.h @@ -16,6 +16,7 @@ #include "mlir/Support/LLVM.h" #include "mlir/Support/LogicalResult.h" +#include "llvm/ADT/FunctionExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" @@ -23,6 +24,84 @@ namespace mlir { namespace detail { +namespace pass_options { +/// Parse a string containing a list of comma-delimited elements, invoking the +/// given parser for each sub-element and passing to the provided element-append +/// functor. +template +LogicalResult parseCommaSeparatedList(llvm::cl::Option &opt, StringRef argName, + StringRef optionStr, + ElementParser &elementParser, + ElementAppendFn &&appendFn) { + // Functor used for finding a character in a string, and skipping over + // various "range" characters. + llvm::unique_function findChar = + [&](StringRef str, size_t index, char c) -> size_t { + for (size_t i = index, e = str.size(); i < e; ++i) { + if (str[i] == c) + return i; + // Check for various range characters. + if (str[i] == '{') + i = findChar(str, i + 1, '}'); + else if (str[i] == '(') + i = findChar(str, i + 1, ')'); + else if (str[i] == '[') + i = findChar(str, i + 1, ']'); + else if (str[i] == '\"') + i = str.find_first_of('\"', i + 1); + else if (str[i] == '\'') + i = str.find_first_of('\'', i + 1); + } + return StringRef::npos; + }; + + // Functor used to parse a single element. + auto parseElement = [&](StringRef valueStr) { + typename ElementParser::parser_data_type value = {}; + if (elementParser.parse(opt, argName, valueStr, value)) + return failure(); + appendFn(value); + return success(); + }; + + size_t nextElePos = findChar(optionStr, 0, ','); + while (nextElePos != StringRef::npos) { + // Process the portion before the comma. + if (failed(parseElement(optionStr.substr(0, nextElePos)))) + return failure(); + + optionStr = optionStr.substr(nextElePos + 1); + nextElePos = findChar(optionStr, 0, ','); + } + return parseElement(optionStr.substr(0, nextElePos)); +} + +/// Trait used to detect if a type has a operator<< method. +template +using has_stream_operator_trait = + decltype(std::declval() << std::declval()); +template +using has_stream_operator = llvm::is_detected; + +/// Utility methods for printing option values. +template +static void printOptionValue(raw_ostream &os, const bool &value) { + os << (value ? StringRef("true") : StringRef("false")); +} +template +static std::enable_if_t::value> +printOptionValue(raw_ostream &os, const DataT &value) { + os << value; +} +template +static std::enable_if_t::value> +printOptionValue(raw_ostream &os, const DataT &value) { + // If the value can't be streamed, fallback to checking for a print in the + // parser. + ParserT::print(os, value); +} +} // namespace pass_options + /// Base container class and manager for all pass options. class PassOptions : protected llvm::cl::SubCommand { private: @@ -85,11 +164,7 @@ } template static void printValue(raw_ostream &os, ParserT &parser, const DataT &value) { - os << value; - } - template - static void printValue(raw_ostream &os, ParserT &parser, const bool &value) { - os << (value ? StringRef("true") : StringRef("false")); + detail::pass_options::printOptionValue(os, value); } public: @@ -156,15 +231,17 @@ public OptionBase { public: template - ListOption(PassOptions &parent, StringRef arg, Args &&... args) + ListOption(PassOptions &parent, StringRef arg, Args &&...args) : llvm::cl::list( - arg, llvm::cl::sub(parent), std::forward(args)...) { + arg, llvm::cl::sub(parent), std::forward(args)...), + elementParser(*this) { assert(!this->isPositional() && !this->isSink() && "sink and positional options are not supported"); + assert(!(this->getMiscFlags() & llvm::cl::MiscFlags::CommaSeparated) && + "ListOption is implicitly comma separated, specifying " + "CommaSeparated is extraneous"); parent.options.push_back(this); - - // Set a callback to track if this option has a value. - this->setCallback([this](const auto &) { this->optHasValue = true; }); + elementParser.initialize(); } ~ListOption() override = default; ListOption & @@ -174,6 +251,14 @@ return *this; } + bool handleOccurrence(unsigned pos, StringRef argName, + StringRef arg) override { + this->optHasValue = true; + return failed(detail::pass_options::parseCommaSeparatedList( + *this, argName, arg, elementParser, + [&](const DataType &value) { this->addValue(value); })); + } + /// Allow assigning from an ArrayRef. ListOption &operator=(ArrayRef values) { ((std::vector &)*this).assign(values.begin(), values.end()); @@ -211,6 +296,9 @@ void copyValueFrom(const OptionBase &other) final { *this = static_cast &>(other); } + + /// The parser to use for parsing the list elements. + OptionParser elementParser; }; PassOptions() = default; @@ -255,9 +343,7 @@ /// Usage: /// /// struct MyPipelineOptions : PassPipelineOptions { -/// ListOption someListFlag{ -/// *this, "flag-name", llvm::cl::MiscFlags::CommaSeparated, -/// llvm::cl::desc("...")}; +/// ListOption someListFlag{*this, "flag-name", llvm::cl::desc("...")}; /// }; template class PassPipelineOptions : public detail::PassOptions { public: @@ -278,5 +364,77 @@ } // namespace mlir +//===----------------------------------------------------------------------===// +// MLIR Options +//===----------------------------------------------------------------------===// + +namespace llvm { +namespace cl { +//===----------------------------------------------------------------------===// +// std::vector+SmallVector + +namespace detail { +template +class VectorParserBase : public basic_parser_impl { +public: + VectorParserBase(Option &opt) : basic_parser_impl(opt), elementParser(opt) {} + + using parser_data_type = VectorT; + + bool parse(Option &opt, StringRef argName, StringRef arg, + parser_data_type &vector) { + if (!arg.consume_front("[") || !arg.consume_back("]")) { + return opt.error("expected vector option to be wrapped with '[]'", + argName); + } + + return failed(mlir::detail::pass_options::parseCommaSeparatedList( + opt, argName, arg, elementParser, + [&](const ElementT &value) { vector.push_back(value); })); + } + + static void print(raw_ostream &os, const VectorT &vector) { + llvm::interleave( + vector, os, + [&](const ElementT &value) { + mlir::detail::pass_options::printOptionValue< + llvm::cl::parser>(os, value); + }, + ","); + } + + void printOptionInfo(const Option &opt, size_t globalWidth) const { + // Add the `vector<>` qualifier to the option info. + outs() << " --" << opt.ArgStr; + outs() << "=>"; + Option::printHelpStr(opt.HelpStr, globalWidth, getOptionWidth(opt)); + } + + size_t getOptionWidth(const Option &opt) const { + // Add the `vector<>` qualifier to the option width. + StringRef vectorExt("vector<>"); + return elementParser.getOptionWidth(opt) + vectorExt.size(); + } + +private: + llvm::cl::parser elementParser; +}; +} // namespace detail + +template +class parser> + : public detail::VectorParserBase, T> { +public: + parser(Option &opt) : detail::VectorParserBase, T>(opt) {} +}; +template +class parser> + : public detail::VectorParserBase, T> { +public: + parser(Option &opt) : detail::VectorParserBase, T>(opt) {} +}; +} // end namespace cl +} // end namespace llvm + #endif // MLIR_PASS_PASSOPTIONS_H_ diff --git a/mlir/include/mlir/Reducer/Passes.td b/mlir/include/mlir/Reducer/Passes.td --- a/mlir/include/mlir/Reducer/Passes.td +++ b/mlir/include/mlir/Reducer/Passes.td @@ -20,8 +20,7 @@ Option<"testerName", "test", "std::string", /* default */"", "The location of the tester which tests the file interestingness">, ListOption<"testerArgs", "test-arg", "std::string", - "arguments of the tester", - "llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated">, + "arguments of the tester", "llvm::cl::ZeroOrMore">, ]; } diff --git a/mlir/include/mlir/Rewrite/PassUtil.td b/mlir/include/mlir/Rewrite/PassUtil.td --- a/mlir/include/mlir/Rewrite/PassUtil.td +++ b/mlir/include/mlir/Rewrite/PassUtil.td @@ -24,12 +24,10 @@ // created. ListOption<"disabledPatterns", "disable-patterns", "std::string", "Labels of patterns that should be filtered out during" - " application", - "llvm::cl::MiscFlags::CommaSeparated">, + " application">, ListOption<"enabledPatterns", "enable-patterns", "std::string", "Labels of patterns that should be used during" - " application, all other patterns are filtered out", - "llvm::cl::MiscFlags::CommaSeparated">, + " application, all other patterns are filtered out">, ]; } diff --git a/mlir/include/mlir/Transforms/Passes.td b/mlir/include/mlir/Transforms/Passes.td --- a/mlir/include/mlir/Transforms/Passes.td +++ b/mlir/include/mlir/Transforms/Passes.td @@ -85,8 +85,7 @@ /*default=*/"", "The default optimizer pipeline used for callables">, ListOption<"opPipelineStrs", "op-pipelines", "std::string", "Callable operation specific optimizer pipelines (in the form " - "of `dialect.op(pipeline)`)", - "llvm::cl::MiscFlags::CommaSeparated">, + "of `dialect.op(pipeline)`)">, Option<"maxInliningIterations", "max-iterations", "unsigned", /*default=*/"4", "Maximum number of iterations when inlining within an SCC">, @@ -226,8 +225,7 @@ }]; let options = [ ListOption<"exclude", "exclude", "std::string", - "Comma separated list of symbols that should not be marked private", - "llvm::cl::MiscFlags::CommaSeparated"> + "Comma separated list of symbols that should not be marked private"> ]; let constructor = "mlir::createSymbolPrivatizePass()"; } diff --git a/mlir/test/Dialect/Linalg/hoist-padding.mlir b/mlir/test/Dialect/Linalg/hoist-padding.mlir --- a/mlir/test/Dialect/Linalg/hoist-padding.mlir +++ b/mlir/test/Dialect/Linalg/hoist-padding.mlir @@ -1,5 +1,5 @@ // RUN: mlir-opt %s -test-linalg-codegen-strategy="anchor-op=linalg.matvec pad hoist-paddings=1,1,0 run-enable-pass=false" -cse -canonicalize -split-input-file | FileCheck %s --check-prefix=MATVEC -// RUN: mlir-opt %s -test-linalg-codegen-strategy="anchor-op=linalg.matvec pad hoist-paddings=1,1,0 transpose-paddings=1:0,0,0 run-enable-pass=false" -cse -canonicalize -split-input-file | FileCheck %s --check-prefix=TRANSP +// RUN: mlir-opt %s -test-linalg-codegen-strategy="anchor-op=linalg.matvec pad hoist-paddings=1,1,0 transpose-paddings=[1,0],[0],[0] run-enable-pass=false" -cse -canonicalize -split-input-file | FileCheck %s --check-prefix=TRANSP // RUN: mlir-opt %s -test-linalg-codegen-strategy="anchor-op=linalg.matmul pad hoist-paddings=1,2,1 run-enable-pass=false" -cse -canonicalize -split-input-file | FileCheck %s --check-prefix=MATMUL // MATVEC-DAG: #[[DIV4:[0-9a-z]+]] = affine_map<(d0) -> (d0 ceildiv 4)> diff --git a/mlir/test/lib/Dialect/Affine/TestLoopPermutation.cpp b/mlir/test/lib/Dialect/Affine/TestLoopPermutation.cpp --- a/mlir/test/lib/Dialect/Affine/TestLoopPermutation.cpp +++ b/mlir/test/lib/Dialect/Affine/TestLoopPermutation.cpp @@ -38,7 +38,7 @@ /// transformed nest (with i going from outermost to innermost). ListOption permList{*this, "permutation-map", llvm::cl::desc("Specify the loop permutation"), - llvm::cl::OneOrMore, llvm::cl::CommaSeparated}; + llvm::cl::OneOrMore}; }; } // namespace diff --git a/mlir/test/lib/Dialect/Linalg/TestLinalgCodegenStrategy.cpp b/mlir/test/lib/Dialect/Linalg/TestLinalgCodegenStrategy.cpp --- a/mlir/test/lib/Dialect/Linalg/TestLinalgCodegenStrategy.cpp +++ b/mlir/test/lib/Dialect/Linalg/TestLinalgCodegenStrategy.cpp @@ -67,10 +67,9 @@ llvm::cl::desc("Fuse the producers after tiling the root op."), llvm::cl::init(false)}; ListOption tileSizes{*this, "tile-sizes", - llvm::cl::MiscFlags::CommaSeparated, llvm::cl::desc("Specifies the tile sizes.")}; ListOption tileInterchange{ - *this, "tile-interchange", llvm::cl::MiscFlags::CommaSeparated, + *this, "tile-interchange", llvm::cl::desc("Specifies the tile interchange.")}; Option promote{ @@ -82,7 +81,7 @@ llvm::cl::desc("Pad the small aligned memory buffer to the tile sizes."), llvm::cl::init(false)}; ListOption registerTileSizes{ - *this, "register-tile-sizes", llvm::cl::MiscFlags::CommaSeparated, + *this, "register-tile-sizes", llvm::cl::desc( "Specifies the size of the register tile that will be used " " to vectorize")}; @@ -100,33 +99,33 @@ ListOption paddingValues{ *this, "padding-values", llvm::cl::desc("Operand padding values parsed by the attribute parser."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::ZeroOrMore}; ListOption paddingDimensions{ *this, "padding-dimensions", llvm::cl::desc("Operation iterator dimensions to pad."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; - ListOption packPaddings{ - *this, "pack-paddings", llvm::cl::desc("Operand packing flags."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; - ListOption hoistPaddings{ - *this, "hoist-paddings", llvm::cl::desc("Operand hoisting depths."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; - ListOption transposePaddings{ + llvm::cl::ZeroOrMore}; + ListOption packPaddings{*this, "pack-paddings", + llvm::cl::desc("Operand packing flags."), + llvm::cl::ZeroOrMore}; + ListOption hoistPaddings{*this, "hoist-paddings", + llvm::cl::desc("Operand hoisting depths."), + llvm::cl::ZeroOrMore}; + ListOption> transposePaddings{ *this, "transpose-paddings", llvm::cl::desc( "Transpose paddings. Specify a operand dimension interchange " "using the following format:\n" - "-transpose-paddings=1:0:2,0:1,0:1\n" + "-transpose-paddings=[1,0,2],[0,1],[0,1]\n" "It defines the interchange [1, 0, 2] for operand one and " "the interchange [0, 1] (no transpose) for the remaining operands." "All interchange vectors have to be permuations matching the " "operand rank."), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::ZeroOrMore}; Option generalize{*this, "generalize", llvm::cl::desc("Generalize named operations."), llvm::cl::init(false)}; ListOption iteratorInterchange{ - *this, "iterator-interchange", llvm::cl::MiscFlags::CommaSeparated, + *this, "iterator-interchange", llvm::cl::desc("Specifies the iterator interchange.")}; Option decompose{ *this, "decompose", @@ -259,16 +258,6 @@ } // Parse the transpose vectors. - SmallVector> transposePaddingVectors; - for (const std::string &transposePadding : transposePaddings) { - SmallVector transposeVector = {}; - SmallVector tokens; - StringRef(transposePadding).split(tokens, ':'); - for (StringRef token : tokens) - transposeVector.push_back(std::stoi(token.str())); - transposePaddingVectors.push_back(transposeVector); - } - LinalgPaddingOptions paddingOptions; paddingOptions.setPaddingValues(paddingValueAttributes); paddingOptions.setPaddingDimensions( @@ -277,7 +266,7 @@ SmallVector{packPaddings.begin(), packPaddings.end()}); paddingOptions.setHoistPaddings( SmallVector{hoistPaddings.begin(), hoistPaddings.end()}); - paddingOptions.setTransposePaddings(transposePaddingVectors); + paddingOptions.setTransposePaddings(transposePaddings); vector::VectorContractLowering vectorContractLowering = llvm::StringSwitch( diff --git a/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp b/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp --- a/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp +++ b/mlir/test/lib/Dialect/Linalg/TestLinalgFusionTransforms.cpp @@ -270,9 +270,9 @@ const TestLinalgTileAndFuseSequencePass &pass) : PassWrapper(pass){}; - ListOption tileSizes{ - *this, "tile-sizes", llvm::cl::desc("Tile sizes to use for ops"), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + ListOption tileSizes{*this, "tile-sizes", + llvm::cl::desc("Tile sizes to use for ops"), + llvm::cl::ZeroOrMore}; void getDependentDialects(DialectRegistry ®istry) const override { registry.insert peeledLoops{ *this, "peeled-loops", llvm::cl::desc("Loops to be peeled when test-tile-pattern"), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::ZeroOrMore}; ListOption tileSizes{ *this, "tile-sizes", llvm::cl::desc("Linalg tile sizes for test-tile-pattern"), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::ZeroOrMore}; Option skipPartial{ *this, "skip-partial", llvm::cl::desc("Skip loops inside partial iterations during peeling"), diff --git a/mlir/test/lib/Dialect/SCF/TestLoopParametricTiling.cpp b/mlir/test/lib/Dialect/SCF/TestLoopParametricTiling.cpp --- a/mlir/test/lib/Dialect/SCF/TestLoopParametricTiling.cpp +++ b/mlir/test/lib/Dialect/SCF/TestLoopParametricTiling.cpp @@ -47,7 +47,7 @@ } ListOption sizes{ - *this, "test-outer-loop-sizes", llvm::cl::MiscFlags::CommaSeparated, + *this, "test-outer-loop-sizes", llvm::cl::desc( "fixed number of iterations that the outer loops should have")}; }; diff --git a/mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp b/mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp --- a/mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp +++ b/mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp @@ -41,7 +41,7 @@ "Workgroup size to use for all gpu.func kernels in the module, " "specified with x-dimension first, y-dimension next and z-dimension " "last. Unspecified dimensions will be set to 1"), - llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; + llvm::cl::ZeroOrMore}; }; } // namespace diff --git a/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp b/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp --- a/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp +++ b/mlir/test/lib/Dialect/Vector/TestVectorTransforms.cpp @@ -330,7 +330,7 @@ registry.insert(); } ListOption multiplicity{ - *this, "distribution-multiplicity", llvm::cl::MiscFlags::CommaSeparated, + *this, "distribution-multiplicity", llvm::cl::desc("Set the multiplicity used for distributing vector")}; void runOnOperation() override { diff --git a/mlir/test/lib/IR/TestDiagnostics.cpp b/mlir/test/lib/IR/TestDiagnostics.cpp --- a/mlir/test/lib/IR/TestDiagnostics.cpp +++ b/mlir/test/lib/IR/TestDiagnostics.cpp @@ -54,7 +54,7 @@ } ListOption filters{ - *this, "filters", llvm::cl::MiscFlags::CommaSeparated, + *this, "filters", llvm::cl::desc("Specifies the diagnostic file name filters.")}; }; diff --git a/mlir/test/lib/Pass/TestDynamicPipeline.cpp b/mlir/test/lib/Pass/TestDynamicPipeline.cpp --- a/mlir/test/lib/Pass/TestDynamicPipeline.cpp +++ b/mlir/test/lib/Pass/TestDynamicPipeline.cpp @@ -99,7 +99,7 @@ llvm::cl::desc("The pipeline description that " "will run on the filtered function.")}; ListOption opNames{ - *this, "op-name", llvm::cl::MiscFlags::CommaSeparated, + *this, "op-name", llvm::cl::desc("List of function name to apply the pipeline to")}; }; } // namespace diff --git a/mlir/test/lib/Pass/TestPassManager.cpp b/mlir/test/lib/Pass/TestPassManager.cpp --- a/mlir/test/lib/Pass/TestPassManager.cpp +++ b/mlir/test/lib/Pass/TestPassManager.cpp @@ -48,11 +48,9 @@ public: struct Options : public PassPipelineOptions { ListOption listOption{*this, "list", - llvm::cl::MiscFlags::CommaSeparated, llvm::cl::desc("Example list option")}; ListOption stringListOption{ - *this, "string-list", llvm::cl::MiscFlags::CommaSeparated, - llvm::cl::desc("Example string list option")}; + *this, "string-list", llvm::cl::desc("Example string list option")}; Option stringOption{*this, "string", llvm::cl::desc("Example string option")}; }; @@ -70,11 +68,10 @@ return "Test options parsing capabilities"; } - ListOption listOption{*this, "list", llvm::cl::MiscFlags::CommaSeparated, + ListOption listOption{*this, "list", llvm::cl::desc("Example list option")}; ListOption stringListOption{ - *this, "string-list", llvm::cl::MiscFlags::CommaSeparated, - llvm::cl::desc("Example string list option")}; + *this, "string-list", llvm::cl::desc("Example string list option")}; Option stringOption{*this, "string", llvm::cl::desc("Example string option")}; };