ListOption currently uses llvm:🆑:list under the hood, but the usages of ListOption are generally a tad different from llvm:🆑:list. This commit codifies this by making ListOption implicitly comma separated, and removes the explicit flag set for all of the current list options. The new parsing for comma separation of ListOption also adds in support for skipping over delimited sub-ranges (i.e. {}, [], (), "", ''). This more easily supports nested options that use those as part of the format, and this constraint (balanced delimiters) is already codified in the syntax of pass pipelines. See https://discourse.llvm.org/t/list-of-lists-pass-option/5950 for related discussion Differential Revision: https://reviews.llvm.org/D122879
63 lines
2.0 KiB
C++
63 lines
2.0 KiB
C++
//===- TestLoopParametricTiling.cpp --- Parametric loop tiling pass -------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a pass to parametrically tile nests of standard loops.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Dialect/SCF/SCF.h"
|
|
#include "mlir/Dialect/SCF/Utils/Utils.h"
|
|
#include "mlir/IR/Builders.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
|
|
// Extracts fixed-range loops for top-level loop nests with ranges defined in
|
|
// the pass constructor. Assumes loops are permutable.
|
|
class SimpleParametricLoopTilingPass
|
|
: public PassWrapper<SimpleParametricLoopTilingPass, OperationPass<>> {
|
|
public:
|
|
StringRef getArgument() const final {
|
|
return "test-extract-fixed-outer-loops";
|
|
}
|
|
StringRef getDescription() const final {
|
|
return "test application of parametric tiling to the outer loops so that "
|
|
"the ranges of outer loops become static";
|
|
}
|
|
SimpleParametricLoopTilingPass() = default;
|
|
SimpleParametricLoopTilingPass(const SimpleParametricLoopTilingPass &) {}
|
|
explicit SimpleParametricLoopTilingPass(ArrayRef<int64_t> outerLoopSizes) {
|
|
sizes = outerLoopSizes;
|
|
}
|
|
|
|
void runOnOperation() override {
|
|
getOperation()->walk([this](scf::ForOp op) {
|
|
// Ignore nested loops.
|
|
if (op->getParentRegion()->getParentOfType<scf::ForOp>())
|
|
return;
|
|
extractFixedOuterLoops(op, sizes);
|
|
});
|
|
}
|
|
|
|
ListOption<int64_t> sizes{
|
|
*this, "test-outer-loop-sizes",
|
|
llvm::cl::desc(
|
|
"fixed number of iterations that the outer loops should have")};
|
|
};
|
|
} // namespace
|
|
|
|
namespace mlir {
|
|
namespace test {
|
|
void registerSimpleParametricTilingPass() {
|
|
PassRegistration<SimpleParametricLoopTilingPass>();
|
|
}
|
|
} // namespace test
|
|
} // namespace mlir
|