diff --git a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp --- a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp +++ b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp @@ -2389,6 +2389,10 @@ : public OneToOneLLVMTerminatorLowering { using Super::Super; }; +struct SwitchOpLowering + : public OneToOneLLVMTerminatorLowering { + using Super::Super; +}; // The Splat operation is lowered to an insertelement + a shufflevector // operation. Splat to only 1-d vector result types are lowered. @@ -3076,6 +3080,7 @@ SqrtOpLowering, SubFOpLowering, SubIOpLowering, + SwitchOpLowering, TruncateIOpLowering, UIToFPOpLowering, UnsignedDivIOpLowering, diff --git a/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir b/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir --- a/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-to-llvmir.mlir @@ -1432,3 +1432,24 @@ // CHECK32: %[[SIZE:.*]] = llvm.load %{{.*}} : !llvm.ptr // CHECK32-NEXT: llvm.return %[[SIZE]] : i32 + +// ----- + +func @switchLower(%arg0: i32, %arg1 : i32, %arg2 : i32) -> i32 { + switch %arg0 : i32, [ + default: ^bb2, + 115: ^bb1 + ] + ^bb1: + llvm.return %arg1 : i32 + ^bb2: + llvm.return %arg2 : i32 +} + +// CHECK: llvm.switch %arg0, ^[[bb2:.+]] [ +// CHECK-NEXT: 115: ^[[bb1:.+]] +// CHECK-NEXT: ] +// CHECK: ^[[bb1]]: +// CHECK: llvm.return %arg1 : i32 +// CHECK: ^[[bb2]]: +// CHECK: llvm.return %arg2 : i32