[Mlir-commits] [mlir] [mlir][emitc][cf] add 'cf.switch' support in CppEmitter (PR #101478)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Aug 1 05:09:27 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
@llvm/pr-subscribers-mlir-emitc
Author: Andrey Timonin (EtoAndruwa)
<details>
<summary>Changes</summary>
Added 'switch' operation from cf dialect to the CppEmitter.
---
Full diff: https://github.com/llvm/llvm-project/pull/101478.diff
2 Files Affected:
- (modified) mlir/lib/Target/Cpp/TranslateToCpp.cpp (+37-2)
- (added) mlir/test/Target/Cpp/switch.mlir (+37)
``````````diff
diff --git a/mlir/lib/Target/Cpp/TranslateToCpp.cpp b/mlir/lib/Target/Cpp/TranslateToCpp.cpp
index 1dadb9dd691e7..a05cbccf1f429 100644
--- a/mlir/lib/Target/Cpp/TranslateToCpp.cpp
+++ b/mlir/lib/Target/Cpp/TranslateToCpp.cpp
@@ -774,6 +774,41 @@ static LogicalResult printOperation(CppEmitter &emitter,
return printBinaryOperation(emitter, operation, "||");
}
+static LogicalResult printOperation(CppEmitter &emitter,
+ cf::SwitchOp switchOp) {
+ raw_indented_ostream &os = emitter.ostream();
+ auto iteratorCaseValues = (*switchOp.getCaseValues()).begin();
+ auto iteratorCaseValuesEnd = (*switchOp.getCaseValues()).end();
+
+ os << "\nswitch(" << emitter.getOrCreateName(switchOp.getFlag()) << ") {";
+
+ for (const auto caseBlock : switchOp.getCaseDestinations()) {
+ if (iteratorCaseValues == iteratorCaseValuesEnd)
+ return switchOp.emitOpError("case's value is absent for case block");
+
+ os << "\ncase " << *(iteratorCaseValues++) << ": {\n";
+ os.indent() << "goto ";
+
+ if (!(emitter.hasBlockLabel(*caseBlock)))
+ return switchOp.emitOpError("unable to find label for case block");
+ os << emitter.getOrCreateName(*caseBlock) << ";\n";
+
+ os.unindent() << "}";
+ }
+
+ os << "\ndefault: {\n";
+ os.indent() << "goto ";
+
+ if (!(emitter.hasBlockLabel(*switchOp.getDefaultDestination())))
+ return switchOp.emitOpError("unable to find label for default block");
+ os << emitter.getOrCreateName(*switchOp.getDefaultDestination()) << ";\n";
+
+ os.unindent() << "}\n";
+ os << "}\n";
+
+ return success();
+}
+
static LogicalResult printOperation(CppEmitter &emitter, emitc::ForOp forOp) {
raw_indented_ostream &os = emitter.ostream();
@@ -998,7 +1033,7 @@ static LogicalResult printFunctionBody(CppEmitter &emitter,
// trailing semicolon is handled within the printOperation function.
bool trailingSemicolon =
!isa<cf::CondBranchOp, emitc::DeclareFuncOp, emitc::ForOp,
- emitc::IfOp, emitc::VerbatimOp>(op);
+ cf::SwitchOp, emitc::IfOp, emitc::VerbatimOp>(op);
if (failed(emitter.emitOperation(
op, /*trailingSemicolon=*/trailingSemicolon)))
@@ -1496,7 +1531,7 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) {
// Builtin ops.
.Case<ModuleOp>([&](auto op) { return printOperation(*this, op); })
// CF ops.
- .Case<cf::BranchOp, cf::CondBranchOp>(
+ .Case<cf::BranchOp, cf::CondBranchOp, cf::SwitchOp>(
[&](auto op) { return printOperation(*this, op); })
// EmitC ops.
.Case<emitc::AddOp, emitc::ApplyOp, emitc::AssignOp,
diff --git a/mlir/test/Target/Cpp/switch.mlir b/mlir/test/Target/Cpp/switch.mlir
new file mode 100644
index 0000000000000..68ba2c90dde6d
--- /dev/null
+++ b/mlir/test/Target/Cpp/switch.mlir
@@ -0,0 +1,37 @@
+// RUN: mlir-translate -mlir-to-cpp -declare-variables-at-top %s | FileCheck %s
+
+func.func @switch_func(%a: i32, %b: i32, %c: i32) -> () {
+ cf.switch %b : i32, [
+ default: ^bb1(%a : i32),
+ 42: ^bb1(%b : i32),
+ 43: ^bb2(%c : i32),
+ 44: ^bb3(%c : i32)
+ ]
+
+ ^bb1(%x1 : i32) :
+ %y1 = "emitc.add" (%x1, %x1) : (i32, i32) -> i32
+ return
+
+ ^bb2(%x2 : i32) :
+ %y2 = "emitc.sub" (%x2, %x2) : (i32, i32) -> i32
+ return
+
+ ^bb3(%x3 : i32) :
+ %y3 = "emitc.mul" (%x3, %x3) : (i32, i32) -> i32
+ return
+}
+// CHECK: void switch_func(int32_t [[V0:[^ ]*]], int32_t [[V1:[^ ]*]], int32_t [[V2:[^ ]*]]) {
+// CHECK: switch([[V1:[^ ]*]]) {
+// CHECK-NEXT: case 42: {
+// CHECK-NEXT: goto label2;
+// CHECK-NEXT: }
+// CHECK-NEXT: case 43: {
+// CHECK-NEXT: goto label3;
+// CHECK-NEXT: }
+// CHECK-NEXT: case 44: {
+// CHECK-NEXT: goto label4;
+// CHECK-NEXT: }
+// CHECK-NEXT: default: {
+// CHECK-NEXT: goto label2;
+// CHECK-NEXT: }
+// CHECK-NEXT: }
``````````
</details>
https://github.com/llvm/llvm-project/pull/101478
More information about the Mlir-commits
mailing list