This dialect contains various structured control flow operaitons, not only loops, reflect this in the name. Drop the Ops suffix for consistency with other dialects. Note that this only moves the files and changes the C++ namespace from 'loop' to 'scf'. The visible IR prefix remains the same and will be updated separately. The conversions will also be updated separately. Differential Revision: https://reviews.llvm.org/D79578
59 lines
2.0 KiB
C++
59 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/IR/Builders.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/LoopUtils.h"
|
|
#include "mlir/Transforms/Passes.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, FunctionPass> {
|
|
public:
|
|
SimpleParametricLoopTilingPass() = default;
|
|
SimpleParametricLoopTilingPass(const SimpleParametricLoopTilingPass &) {}
|
|
explicit SimpleParametricLoopTilingPass(ArrayRef<int64_t> outerLoopSizes) {
|
|
sizes = outerLoopSizes;
|
|
}
|
|
|
|
void runOnFunction() override {
|
|
FuncOp func = getFunction();
|
|
func.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::MiscFlags::CommaSeparated,
|
|
llvm::cl::desc(
|
|
"fixed number of iterations that the outer loops should have")};
|
|
};
|
|
} // end namespace
|
|
|
|
namespace mlir {
|
|
void registerSimpleParametricTilingPass() {
|
|
PassRegistration<SimpleParametricLoopTilingPass>(
|
|
"test-extract-fixed-outer-loops",
|
|
"test application of parametric tiling to the outer loops so that the "
|
|
"ranges of outer loops become static");
|
|
}
|
|
} // namespace mlir
|