[Mlir-commits] [mlir] [mlir][emitc] Add 'emitc.switch' op to the dialect (PR #102331)
Simon Camphausen
llvmlistbot at llvm.org
Wed Aug 14 01:26:17 PDT 2024
================
@@ -1302,5 +1302,86 @@ def EmitC_SubscriptOp : EmitC_Op<"subscript", []> {
let assemblyFormat = "$value `[` $indices `]` attr-dict `:` functional-type(operands, results)";
}
+def EmitC_SwitchOp : EmitC_Op<"switch", [RecursiveMemoryEffects,
+ SingleBlockImplicitTerminator<"emitc::YieldOp">,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface,
+ ["getRegionInvocationBounds",
+ "getEntrySuccessorRegions"]>]> {
+ let summary = "Switch operation";
+ let description = [{
+ The `emitc.switch` is a control-flow operation that branches to one of
+ the given regions based on the values of the argument and the cases.
+ The operand to a switch operation is a opaque, integral or pointer
+ wide types.
+
+ The operation always has a "default" region and any number of case regions
+ denoted by integer constants. Control-flow transfers to the case region
+ whose constant value equals the value of the argument. If the argument does
+ not equal any of the case values, control-flow transfer to the "default"
+ region.
+
+ The operation does not return any value. Moreover, case regions must be
+ explicitly terminated using the `emitc.yield` operation. Default region is
+ yielded implicitly.
+
+ Example:
+
+ ```mlir
+ // Example:
+ emitc.switch %0 : i32
+ case 2: {
+ %1 = emitc.call_opaque "func_b" () : () -> i32
+ emitc.yield
+ }
+ case 5: {
+ %2 = emitc.call_opaque "func_a" () : () -> i32
+ emitc.yield
+ }
+ default: {
+ %3 = "emitc.variable"(){value = 42.0 : f32} : () -> f32
+ emitc.call_opaque "func2" (%3) : (f32) -> ()
+ }
+
+ // Output:
+ switch (v1) {
+ case (2): {
+ int32_t v2 = func_b();
+ break;
+ }
+ case (5): {
----------------
simon-camp wrote:
nit: Remove the parentheses around the case values.
https://github.com/llvm/llvm-project/pull/102331
More information about the Mlir-commits
mailing list