diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp index 74c169c9a7e76..044a3c8c65e3b 100644 --- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp +++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp @@ -1083,6 +1083,12 @@ class LoopPattern : public SPIRVToLLVMConversion { if (loopOp.getLoopControl() != spirv::LoopControl::None) return failure(); + // `spirv.mlir.loop` with empty region is redundant and should be erased. + if (loopOp.getBody().empty()) { + rewriter.eraseOp(loopOp); + return success(); + } + Location loc = loopOp.getLoc(); // Split the current block after `spirv.mlir.loop`. The remaining ops will diff --git a/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir index 3557830e779e2..756fc5415e20f 100644 --- a/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir +++ b/mlir/test/Conversion/SPIRVToLLVM/control-flow-ops-to-llvm.mlir @@ -86,6 +86,14 @@ spirv.module Logical GLSL450 { //===----------------------------------------------------------------------===// spirv.module Logical GLSL450 { + // CHECK-LABEL: @empty_loop + spirv.func @empty_loop() "None" { + // CHECK: llvm.return + spirv.mlir.loop { + } + spirv.Return + } + // CHECK-LABEL: @infinite_loop spirv.func @infinite_loop(%count : i32) -> () "None" { // CHECK: llvm.br ^[[BB1:.*]]