From b952315619975ba17d1d0ca2c3554967572b3e67 Mon Sep 17 00:00:00 2001 From: KolodkinGrigorii <113025092+KolodkinGrigorii@users.noreply.github.com> Date: Wed, 14 May 2025 23:10:01 +0300 Subject: [PATCH 1/4] add plugin --- .../kologkin_g_lab_4_var_5/CMakeLists.txt | 16 ++++ .../ReplaceCeilWithFloorNegPlugin.cpp | 75 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 mlir/compiler-course/kologkin_g_lab_4_var_5/CMakeLists.txt create mode 100644 mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp diff --git a/mlir/compiler-course/kologkin_g_lab_4_var_5/CMakeLists.txt b/mlir/compiler-course/kologkin_g_lab_4_var_5/CMakeLists.txt new file mode 100644 index 0000000000000..12d780271356f --- /dev/null +++ b/mlir/compiler-course/kologkin_g_lab_4_var_5/CMakeLists.txt @@ -0,0 +1,16 @@ +set(Title "ReplaceCeilWithFloorNegPlugin") +set(Student "KolodkinGrigorii") +set(Group "FIIT3") +set(TARGET_NAME "${Title}_${Student}_${Group}_MLIR") + +file(GLOB_RECURSE SOURCES *.cpp *.h *.hpp) + +add_llvm_pass_plugin(${TARGET_NAME} + ${SOURCES} + DEPENDS + intrinsics_gen + MLIRBuiltinLocationAttributesIncGen + BUILDTREE_ONLY +) + +set(MLIR_TEST_DEPENDS ${TARGET_NAME} ${MLIR_TEST_DEPENDS} PARENT_SCOPE) diff --git a/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp new file mode 100644 index 0000000000000..f246a76490dcf --- /dev/null +++ b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp @@ -0,0 +1,75 @@ +#include "mlir/Dialect/Arith/IR/Arith.h" +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/Dialect/Math/IR/Math.h" +#include "mlir/IR/BuiltinOps.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Pass/Pass.h" +#include "mlir/Tools/Plugins/PassPlugin.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "llvm/Support/raw_ostream.h" + +using namespace mlir; + +namespace { + +void replaceCeilWithNegFloor(ModuleOp module) { + + for (auto func : module.getOps()) { + + func.walk([&](Operation *op) { + + if (auto ceilOp = dyn_cast(op)) { + Location loc = ceilOp->getLoc(); + Value input = ceilOp->getOperand(0); + auto type = input.getType(); + + if (auto vectorType = type.dyn_cast()) { + if (!vectorType.getElementType().isa()) + return; + } else if (!type.isa()) { + return; + } + + OpBuilder builder(ceilOp); + builder.setInsertionPoint(ceilOp); + + auto neg1 = builder.create(loc, type, input); + + auto floorNeg = builder.create(loc, type, neg1); + + auto neg2 = builder.create(loc, type, floorNeg); + + ceilOp->replaceAllUsesWith(neg2); + + ceilOp->erase(); + } + }); + } +} + +class ReplaceCeilWithFloorNegPlugin : public PassWrapper> { +public: + StringRef getArgument() const final { + return "ReplaceCeilWithFloorNegPlugin_KolodkinGrigorii_FIIT3_MLIR"; + } + StringRef getDescription() const final { return "Description pass"; } + + void runOnOperation() override { + ModuleOp module = getOperation(); + replaceCeilWithNegFloor(module); + } +}; +} // namespace + +MLIR_DECLARE_EXPLICIT_TYPE_ID(ReplaceCeilWithFloorNegPlugin) +MLIR_DEFINE_EXPLICIT_TYPE_ID(ReplaceCeilWithFloorNegPlugin) + +mlir::PassPluginLibraryInfo getFunctionCallCounterPassPluginInfo() { + return {MLIR_PLUGIN_API_VERSION, "ReplaceCeilWithFloorNegPlugin", "1.0", + []() { PassRegistration(); }}; +} + +extern "C" LLVM_ATTRIBUTE_WEAK mlir::PassPluginLibraryInfo +mlirGetPassPluginInfo() { + return getFunctionCallCounterPassPluginInfo(); +} From 6bb017e433d44126fc2c65de3b44d9d2de3d0fd6 Mon Sep 17 00:00:00 2001 From: KolodkinGrigorii <113025092+KolodkinGrigorii@users.noreply.github.com> Date: Wed, 14 May 2025 23:11:33 +0300 Subject: [PATCH 2/4] add test --- .../kologkin_g_lab_4_var_5/test.mlir | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 mlir/test/compiler-course/kologkin_g_lab_4_var_5/test.mlir diff --git a/mlir/test/compiler-course/kologkin_g_lab_4_var_5/test.mlir b/mlir/test/compiler-course/kologkin_g_lab_4_var_5/test.mlir new file mode 100644 index 0000000000000..5a1241bfa6e20 --- /dev/null +++ b/mlir/test/compiler-course/kologkin_g_lab_4_var_5/test.mlir @@ -0,0 +1,62 @@ +// RUN: mlir-opt -load-pass-plugin=%mlir_lib_dir/ReplaceCeilWithFloorNegPlugin_KolodkinGrigorii_FIIT3_MLIR%shlibext \ +// RUN: --pass-pipeline="builtin.module(ReplaceCeilWithFloorNegPlugin_KolodkinGrigorii_FIIT3_MLIR)" %s | FileCheck %s + +//CHECK: func.func @test_simple(%arg0: f32) -> f32 { +//CHECK-NEXT: %0 = arith.negf %arg0 : f32 +//CHECK-NEXT: %1 = math.floor %0 : f32 +//CHECK-NEXT: %2 = arith.negf %1 : f32 +//CHECK-NEXT: return %2 : f32 +//CHECK-NEXT: } + +func.func @test_simple(%arg0: f32) -> f32 { + %0 = math.ceil %arg0 : f32 + return %0 : f32 +} + +//CHECK: func.func @test_single_arg(%arg0: f32) -> f32 { +//CHECK-NEXT: %0 = arith.negf %arg0 : f32 +//CHECK-NEXT: %1 = math.floor %0 : f32 +//CHECK-NEXT: %2 = arith.negf %1 : f32 +//CHECK-NEXT: %3 = arith.negf %2 : f32 +//CHECK-NEXT: %4 = math.floor %3 : f32 +//CHECK-NEXT: %5 = arith.negf %4 : f32 +//CHECK-NEXT: return %5 : f32 +//CHECK-NEXT: } + +func.func @test_single_arg(%arg: f32) -> f32 { + %c1 = math.ceil %arg : f32 + %c2 = math.ceil %c1 : f32 + return %c2 : f32 +} + +//CHECK: func.func @test_vector_after_ceil(%arg0: vector<2xf32>) -> vector<2xf32> { +//CHECK-NEXT: %0 = arith.negf %arg0 : vector<2xf32> +//CHECK-NEXT: %1 = math.floor %0 : vector<2xf32> +//CHECK-NEXT: %2 = arith.negf %1 : vector<2xf32> +//CHECK-NEXT: %3 = arith.mulf %2, %arg0 : vector<2xf32> +//CHECK-NEXT: return %3 : vector<2xf32> +//CHECK-NEXT: } + +func.func @test_vector_after_ceil(%vec: vector<2xf32>) -> vector<2xf32> { + %ceil_vec = math.ceil %vec : vector<2xf32> + %result = arith.mulf %ceil_vec, %vec : vector<2xf32> + return %result : vector<2xf32> +} + +//CHECK: func.func @test_two_args(%arg0: f64, %arg1: f64) -> f64 { +//CHECK-NEXT: %0 = arith.negf %arg0 : f64 +//CHECK-NEXT: %1 = math.floor %0 : f64 +//CHECK-NEXT: %2 = arith.negf %1 : f64 +//CHECK-NEXT: %3 = arith.negf %arg1 : f64 +//CHECK-NEXT: %4 = math.floor %3 : f64 +//CHECK-NEXT: %5 = arith.negf %4 : f64 +//CHECK-NEXT: %6 = arith.mulf %2, %5 : f64 +//CHECK-NEXT: return %6 : f64 +//CHECK-NEXT: } + +func.func @test_two_args(%x: f64, %y: f64) -> f64 { + %ceil_x = math.ceil %x : f64 + %ceil_y = math.ceil %y : f64 + %sum = arith.mulf %ceil_x, %ceil_y : f64 + return %sum : f64 +} From 02b17d9e5033397ebb2569631d0811993a69c769 Mon Sep 17 00:00:00 2001 From: KolodkinGrigorii <113025092+KolodkinGrigorii@users.noreply.github.com> Date: Wed, 14 May 2025 23:44:07 +0300 Subject: [PATCH 3/4] fix clang --- .../kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp index f246a76490dcf..7bed5e20606c2 100644 --- a/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp +++ b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp @@ -17,7 +17,6 @@ void replaceCeilWithNegFloor(ModuleOp module) { for (auto func : module.getOps()) { func.walk([&](Operation *op) { - if (auto ceilOp = dyn_cast(op)) { Location loc = ceilOp->getLoc(); Value input = ceilOp->getOperand(0); @@ -47,7 +46,9 @@ void replaceCeilWithNegFloor(ModuleOp module) { } } -class ReplaceCeilWithFloorNegPlugin : public PassWrapper> { +class ReplaceCeilWithFloorNegPlugin + : public PassWrapper> { public: StringRef getArgument() const final { return "ReplaceCeilWithFloorNegPlugin_KolodkinGrigorii_FIIT3_MLIR"; From dc78978dfabedc4b92a09e2eb93b3c0fe37c8eb7 Mon Sep 17 00:00:00 2001 From: KolodkinGrigorii <113025092+KolodkinGrigorii@users.noreply.github.com> Date: Sat, 17 May 2025 23:44:57 +0300 Subject: [PATCH 4/4] fix review --- .../kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp index 7bed5e20606c2..3c6b154510302 100644 --- a/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp +++ b/mlir/compiler-course/kologkin_g_lab_4_var_5/ReplaceCeilWithFloorNegPlugin.cpp @@ -30,7 +30,6 @@ void replaceCeilWithNegFloor(ModuleOp module) { } OpBuilder builder(ceilOp); - builder.setInsertionPoint(ceilOp); auto neg1 = builder.create(loc, type, input);