diff --git a/mlir/lib/Transforms/Utils/CFGToSCF.cpp b/mlir/lib/Transforms/Utils/CFGToSCF.cpp index dbde75e17b3b8..1a3d12661e7e7 100644 --- a/mlir/lib/Transforms/Utils/CFGToSCF.cpp +++ b/mlir/lib/Transforms/Utils/CFGToSCF.cpp @@ -1156,8 +1156,12 @@ static FailureOr> transformToStructuredCFBranches( FailureOr result = interface.createStructuredBranchRegionOp( opBuilder, regionEntry->getTerminator(), continuation->getArgumentTypes(), conditionalRegions); - if (failed(result)) + if (failed(result)) { + Region &parentRegion = *regionEntry->getParent(); + for (Region ® : conditionalRegions) + parentRegion.getBlocks().splice(parentRegion.end(), reg.getBlocks()); return failure(); + } structuredCondOp = *result; regionEntry->getTerminator()->erase(); } diff --git a/mlir/test/Conversion/ControlFlowToSCF/unsupported-op-in-cycle.mlir b/mlir/test/Conversion/ControlFlowToSCF/unsupported-op-in-cycle.mlir new file mode 100644 index 0000000000000..58bffdb569328 --- /dev/null +++ b/mlir/test/Conversion/ControlFlowToSCF/unsupported-op-in-cycle.mlir @@ -0,0 +1,24 @@ +// RUN: mlir-opt %s -lift-cf-to-scf -verify-diagnostics + +// verify faliure for unsupported ops in cycles (issue #173566) + +module { + func.func @spirv_loop_crash_repro(%arg0: index) { + %0 = builtin.unrealized_conversion_cast %arg0 : index to i32 + %cst8 = spirv.Constant 8 : i32 + + spirv.mlir.loop { + spirv.Branch ^bb1(%0 : i32) + ^bb1(%2: i32): + %3 = spirv.SLessThan %2, %cst8 : i32 + // expected-error @+1 {{Cannot convert unknown control flow op to structured control flow}} + spirv.BranchConditional %3, ^bb2, ^bb3 + ^bb2: + %4 = spirv.IAdd %2, %0 : i32 + spirv.Branch ^bb1(%4 : i32) + ^bb3: + spirv.mlir.merge + } + spirv.Return + } +} \ No newline at end of file