This patch adds llvm.switch operation to LLVMDialect. I followed a syntax as LLVMIR.
Example
LLVMIR
switch i32 %val, label %otherwise [ i32 0, label %onzero i32 1, label %onone ]
MLIR
%0 = llvm.mlir.constant(0 : i32) : !llvm.i32 %1 = llvm.mlir.constant(1 : i32) : !llvm.i32 llvm.switch %val, ^otherwise [ %0, ^onzero, %1, ^onone ] : !llvm.i32
Currently, successors are not allowed to have block arguments because we can't directly translate block arguments into phi node.
^entry: %0 = llvm.mlir.constant(0 : i32) : !llvm.i32 llvm.switch %val, ^dst(%val : !llvm.i32) [ %0, ^dst(val : !llvm.i32) ] : !llvm.i32 ^dst(%ret: !llvm.i32): llvm.return %ret : !llvm.i32
In this case, we can't construct %ret naively.
nit: Move the { to the end of the previous line.