Files
clang-p2996/mlir/test/lib/Transforms/TestLoopMapping.cpp
Alex Zinenko c25b20c0f6 [mlir] NFC: Rename LoopOps dialect to SCF (Structured Control Flow)
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
2020-05-11 15:04:27 +02:00

61 lines
2.0 KiB
C++

//===- TestLoopMapping.cpp --- Parametric loop mapping 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 map loop.for loops to virtual
// processing element dimensions.
//
//===----------------------------------------------------------------------===//
#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"
#include "llvm/ADT/SetVector.h"
using namespace mlir;
namespace {
class TestLoopMappingPass
: public PassWrapper<TestLoopMappingPass, FunctionPass> {
public:
explicit TestLoopMappingPass() {}
void runOnFunction() override {
FuncOp func = getFunction();
// SSA values for the transformation are created out of thin air by
// unregistered "new_processor_id_and_range" operations. This is enough to
// emulate mapping conditions.
SmallVector<Value, 8> processorIds, numProcessors;
func.walk([&processorIds, &numProcessors](Operation *op) {
if (op->getName().getStringRef() != "new_processor_id_and_range")
return;
processorIds.push_back(op->getResult(0));
numProcessors.push_back(op->getResult(1));
});
func.walk([&processorIds, &numProcessors](scf::ForOp op) {
// Ignore nested loops.
if (op.getParentRegion()->getParentOfType<scf::ForOp>())
return;
mapLoopToProcessorIds(op, processorIds, numProcessors);
});
}
};
} // end namespace
namespace mlir {
void registerTestLoopMappingPass() {
PassRegistration<TestLoopMappingPass>(
"test-mapping-to-processing-elements",
"test mapping a single loop on a virtual processor grid");
}
} // namespace mlir