[Mlir-commits] [mlir] [mlir][EmitC] Add `unary_{minus, plus}` operators (PR #84329)
Marius Brehler
llvmlistbot at llvm.org
Thu Mar 7 07:07:32 PST 2024
https://github.com/marbre updated https://github.com/llvm/llvm-project/pull/84329
>From 139f9ac91cf10d8734ae0480cf418b0f74a61148 Mon Sep 17 00:00:00 2001
From: Marius Brehler <marius.brehler at iml.fraunhofer.de>
Date: Thu, 7 Mar 2024 09:50:23 +0000
Subject: [PATCH] [mlir][EmitC] Add `unary_{minus,plus}` operators
This adds operations for the unary minus and the unary plus operator.
---
mlir/include/mlir/Dialect/EmitC/IR/EmitC.td | 36 +++++++++++++++++++++
mlir/lib/Target/Cpp/TranslateToCpp.cpp | 17 +++++++++-
mlir/test/Dialect/EmitC/ops.mlir | 6 ++++
mlir/test/Target/Cpp/unary_operators.mlir | 12 +++++++
4 files changed, 70 insertions(+), 1 deletion(-)
create mode 100644 mlir/test/Target/Cpp/unary_operators.mlir
diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
index db0e2d10960d72..ac1e38a5506da0 100644
--- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
+++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
@@ -908,6 +908,42 @@ def EmitC_SubOp : EmitC_BinaryOp<"sub", [CExpression]> {
let hasVerifier = 1;
}
+def EmitC_UnaryMinusOp : EmitC_UnaryOp<"unary_minus", [CExpression]> {
+ let summary = "Unary minus operation";
+ let description = [{
+ With the `unary_minus` operation the unary operator - (minus) can be
+ applied.
+
+ Example:
+
+ ```mlir
+ %0 = emitc.unary_plus %arg0 : (i32) -> i32
+ ```
+ ```c++
+ // Code emitted for the operation above.
+ int32_t v2 = -v1;
+ ```
+ }];
+}
+
+def EmitC_UnaryPlusOp : EmitC_UnaryOp<"unary_plus", [CExpression]> {
+ let summary = "Unary plus operation";
+ let description = [{
+ With the `unary_plus` operation the unary operator + (plus) can be
+ applied.
+
+ Example:
+
+ ```mlir
+ %0 = emitc.unary_plus %arg0 : (i32) -> i32
+ ```
+ ```c++
+ // Code emitted for the operation above.
+ int32_t v2 = +v1;
+ ```
+ }];
+}
+
def EmitC_VariableOp : EmitC_Op<"variable", []> {
let summary = "Variable operation";
let description = [{
diff --git a/mlir/lib/Target/Cpp/TranslateToCpp.cpp b/mlir/lib/Target/Cpp/TranslateToCpp.cpp
index 95513cb0fb2ebc..b99d0ede8bf4ff 100644
--- a/mlir/lib/Target/Cpp/TranslateToCpp.cpp
+++ b/mlir/lib/Target/Cpp/TranslateToCpp.cpp
@@ -104,6 +104,8 @@ static FailureOr<int> getOperatorPrecedence(Operation *operation) {
.Case<emitc::MulOp>([&](auto op) { return 13; })
.Case<emitc::RemOp>([&](auto op) { return 13; })
.Case<emitc::SubOp>([&](auto op) { return 12; })
+ .Case<emitc::UnaryMinusOp>([&](auto op) { return 15; })
+ .Case<emitc::UnaryPlusOp>([&](auto op) { return 15; })
.Default([](auto op) { return op->emitError("unsupported operation"); });
}
@@ -652,6 +654,18 @@ static LogicalResult printOperation(CppEmitter &emitter,
return printBinaryOperation(emitter, operation, "^");
}
+static LogicalResult printOperation(CppEmitter &emitter,
+ emitc::UnaryPlusOp unaryPlusOp) {
+ Operation *operation = unaryPlusOp.getOperation();
+ return printUnaryOperation(emitter, operation, "+");
+}
+
+static LogicalResult printOperation(CppEmitter &emitter,
+ emitc::UnaryMinusOp unaryMinusOp) {
+ Operation *operation = unaryMinusOp.getOperation();
+ return printUnaryOperation(emitter, operation, "-");
+}
+
static LogicalResult printOperation(CppEmitter &emitter, emitc::CastOp castOp) {
raw_ostream &os = emitter.ostream();
Operation &op = *castOp.getOperation();
@@ -1371,7 +1385,8 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) {
emitc::ExpressionOp, emitc::ForOp, emitc::FuncOp, emitc::IfOp,
emitc::IncludeOp, emitc::LogicalAndOp, emitc::LogicalNotOp,
emitc::LogicalOrOp, emitc::MulOp, emitc::RemOp, emitc::ReturnOp,
- emitc::SubOp, emitc::VariableOp, emitc::VerbatimOp>(
+ emitc::SubOp, emitc::UnaryMinusOp, emitc::UnaryPlusOp,
+ emitc::VariableOp, emitc::VerbatimOp>(
[&](auto op) { return printOperation(*this, op); })
// Func ops.
.Case<func::CallOp, func::FuncOp, func::ReturnOp>(
diff --git a/mlir/test/Dialect/EmitC/ops.mlir b/mlir/test/Dialect/EmitC/ops.mlir
index f852390f03e298..122b1d9ef1059f 100644
--- a/mlir/test/Dialect/EmitC/ops.mlir
+++ b/mlir/test/Dialect/EmitC/ops.mlir
@@ -134,6 +134,12 @@ func.func @logical(%arg0: i32, %arg1: i32) {
return
}
+func.func @unary(%arg0: i32) {
+ %0 = emitc.unary_minus %arg0 : (i32) -> i32
+ %1 = emitc.unary_plus %arg0 : (i32) -> i32
+ return
+}
+
func.func @test_if(%arg0: i1, %arg1: f32) {
emitc.if %arg0 {
%0 = emitc.call_opaque "func_const"(%arg1) : (f32) -> i32
diff --git a/mlir/test/Target/Cpp/unary_operators.mlir b/mlir/test/Target/Cpp/unary_operators.mlir
new file mode 100644
index 00000000000000..8a89437a41cc50
--- /dev/null
+++ b/mlir/test/Target/Cpp/unary_operators.mlir
@@ -0,0 +1,12 @@
+// RUN: mlir-translate -mlir-to-cpp %s | FileCheck %s
+
+func.func @unary(%arg0: i32) -> () {
+ %0 = emitc.unary_minus %arg0 : (i32) -> i32
+ %1 = emitc.unary_plus %arg0 : (i32) -> i32
+
+ return
+}
+
+// CHECK-LABEL: void unary
+// CHECK-NEXT: int32_t [[V1:[^ ]*]] = -[[V0:[^ ]*]];
+// CHECK-NEXT: int32_t [[V2:[^ ]*]] = +[[V0]];
More information about the Mlir-commits
mailing list