diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -308,6 +308,10 @@ moduleTranslation.lookupBlock(switchOp.getDefaultDestination()), switchOp.getCaseDestinations().size()); + // Handle switch with zero cases. + if (!switchOp.getCaseValues()) + return success(); + auto *ty = llvm::cast( moduleTranslation.convertType(switchOp.getValue().getType())); for (auto i : diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -2024,6 +2024,21 @@ // ----- +// CHECK-LABEL: @switch_empty +llvm.func @switch_empty(%arg0 : i32) -> i32 { + // CHECK: switch i32 %[[SWITCH_arg0:[0-9]+]], label %[[SWITCHDEFAULT_bb1:[0-9]+]] [ + // CHECK-NEXT: ] + llvm.switch %arg0 : i32, ^bb1 [ + ] + + // CHECK: [[SWITCHDEFAULT_bb1]]: + // CHECK-NEXT: ret i32 %[[SWITCH_arg0]] +^bb1: + llvm.return %arg0 : i32 +} + +// ----- + // CHECK-LABEL: @switch_args llvm.func @switch_args(%arg0: i32) -> i32 { %0 = llvm.mlir.constant(5 : i32) : i32