diff --git a/mlir/lib/Conversion/SCFToStandard/SCFToStandard.cpp b/mlir/lib/Conversion/SCFToStandard/SCFToStandard.cpp --- a/mlir/lib/Conversion/SCFToStandard/SCFToStandard.cpp +++ b/mlir/lib/Conversion/SCFToStandard/SCFToStandard.cpp @@ -407,8 +407,11 @@ void SCFToStandardPass::runOnOperation() { OwningRewritePatternList patterns; populateLoopToStdConversionPatterns(patterns, &getContext()); + // Configure conversion to lower out scf.for, scf.if and scf.parallel. + // Anything else is fine. ConversionTarget target(getContext()); - target.addLegalDialect(); + target.addIllegalOp(); + target.markUnknownOpDynamicallyLegal([](Operation *) { return true; }); if (failed(applyPartialConversion(getOperation(), target, patterns))) signalPassFailure(); } diff --git a/mlir/test/Conversion/SCFToStandard/convert-to-cfg.mlir b/mlir/test/Conversion/SCFToStandard/convert-to-cfg.mlir --- a/mlir/test/Conversion/SCFToStandard/convert-to-cfg.mlir +++ b/mlir/test/Conversion/SCFToStandard/convert-to-cfg.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-scf-to-std %s | FileCheck %s +// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-std %s | FileCheck %s // CHECK-LABEL: func @simple_std_for_loop(%{{.*}}: index, %{{.*}}: index, %{{.*}}: index) { // CHECK-NEXT: br ^bb1(%{{.*}} : index) @@ -398,3 +398,17 @@ } return %0#0, %0#1 : f32, i64 } + +// Check that the conversion is not overly conservative wrt unknown ops, i.e. +// that the presence of unknown ops does not prevent the conversion from being +// applied. +// CHECK-LABEL: @unknown_op_inside_loop +func @unknown_op_inside_loop(%arg0: index, %arg1: index, %arg2: index) { + // CHECK-NOT: scf.for + scf.for %i = %arg0 to %arg1 step %arg2 { + // CHECK: unknown.op + "unknown.op"() : () -> () + scf.yield + } + return +}