[InsertPipelinePragma] imple of this pass; support to specify the insertion level
This commit is contained in:
parent
1ba479f1e6
commit
939f01cd05
|
@ -19,6 +19,7 @@ std::unique_ptr<mlir::Pass> createPragmaDSEPass();
|
||||||
std::unique_ptr<mlir::Pass> createAffineLoopPerfectionPass();
|
std::unique_ptr<mlir::Pass> createAffineLoopPerfectionPass();
|
||||||
std::unique_ptr<mlir::Pass> createPartialAffineLoopTilePass();
|
std::unique_ptr<mlir::Pass> createPartialAffineLoopTilePass();
|
||||||
std::unique_ptr<mlir::Pass> createRemoveVarLoopBoundPass();
|
std::unique_ptr<mlir::Pass> createRemoveVarLoopBoundPass();
|
||||||
|
std::unique_ptr<mlir::Pass> createInsertPipelinePragmaPass();
|
||||||
|
|
||||||
void registerTransformsPasses();
|
void registerTransformsPasses();
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,21 @@ def PragmaDSE : Pass<"pragma-dse", "ModuleOp"> {
|
||||||
let constructor = "mlir::scalehls::createPragmaDSEPass()";
|
let constructor = "mlir::scalehls::createPragmaDSEPass()";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def InsertPipelinePragma : Pass<"insert-pipeline-pragma", "ModuleOp"> {
|
||||||
|
let summary = "Insert pipeline pragma";
|
||||||
|
let description = [{
|
||||||
|
This insert-pipeline-pragma pass will insert pipeline pragma to the
|
||||||
|
innermost loop level.
|
||||||
|
}];
|
||||||
|
|
||||||
|
let constructor = "mlir::scalehls::createInsertPipelinePragmaPass()";
|
||||||
|
|
||||||
|
let options = [
|
||||||
|
Option<"insertLevel", "insert-level", "unsigned", /*default=*/"1",
|
||||||
|
"Positive number: loop level to be pipelined (from innermost)">
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
def AffineLoopPerfection : Pass<"affine-loop-perfection", "ModuleOp"> {
|
def AffineLoopPerfection : Pass<"affine-loop-perfection", "ModuleOp"> {
|
||||||
let summary = "Try to perfect a nested loop";
|
let summary = "Try to perfect a nested loop";
|
||||||
let description = [{
|
let description = [{
|
||||||
|
@ -43,7 +58,7 @@ def PartialAffineLoopTile : Pass<"partial-affine-loop-tile", "ModuleOp"> {
|
||||||
|
|
||||||
let constructor = "mlir::scalehls::createPartialAffineLoopTilePass()";
|
let constructor = "mlir::scalehls::createPartialAffineLoopTilePass()";
|
||||||
|
|
||||||
let options = [
|
let options = [
|
||||||
Option<"tileLevel", "tile-level", "unsigned", /*default=*/"1",
|
Option<"tileLevel", "tile-level", "unsigned", /*default=*/"1",
|
||||||
"Positive number: the level of loops to be tiles">,
|
"Positive number: the level of loops to be tiles">,
|
||||||
Option<"tileSize", "tile-size", "unsigned", /*default=*/"2",
|
Option<"tileSize", "tile-size", "unsigned", /*default=*/"2",
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
//===------------------------------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "Transforms/Passes.h"
|
||||||
|
#include "mlir/Dialect/Affine/IR/AffineOps.h"
|
||||||
|
#include "mlir/Dialect/Affine/Passes.h"
|
||||||
|
#include "mlir/IR/Builders.h"
|
||||||
|
#include "mlir/Transforms/LoopUtils.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace mlir;
|
||||||
|
using namespace scalehls;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct InsertPipelinePragma
|
||||||
|
: public InsertPipelinePragmaBase<InsertPipelinePragma> {
|
||||||
|
void runOnOperation() override;
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void InsertPipelinePragma::runOnOperation() {
|
||||||
|
auto module = getOperation();
|
||||||
|
auto builder = OpBuilder(module);
|
||||||
|
|
||||||
|
// Walk through all functions and loops.
|
||||||
|
for (auto func : module.getOps<FuncOp>()) {
|
||||||
|
for (auto forOp : func.getOps<mlir::AffineForOp>()) {
|
||||||
|
SmallVector<mlir::AffineForOp, 4> nestedLoops;
|
||||||
|
getPerfectlyNestedLoops(nestedLoops, forOp);
|
||||||
|
|
||||||
|
auto targetLoop = nestedLoops.front();
|
||||||
|
if (nestedLoops.size() > insertLevel)
|
||||||
|
targetLoop = *std::prev(nestedLoops.end(), insertLevel);
|
||||||
|
|
||||||
|
targetLoop.setAttr("pipeline", builder.getBoolAttr(true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<mlir::Pass> scalehls::createInsertPipelinePragmaPass() {
|
||||||
|
return std::make_unique<InsertPipelinePragma>();
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
// RUN: scalehls-opt -insert-pipeline-pragma %s | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK-LABEL: func @test_for
|
||||||
|
func @test_for() {
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue