diff --git a/mlir/include/mlir-c/Pass.h b/mlir/include/mlir-c/Pass.h --- a/mlir/include/mlir-c/Pass.h +++ b/mlir/include/mlir-c/Pass.h @@ -51,9 +51,13 @@ // PassManager/OpPassManager APIs. //===----------------------------------------------------------------------===// -/// Create a new top-level PassManager. +/// Create a new top-level PassManager with the default anchor. MLIR_CAPI_EXPORTED MlirPassManager mlirPassManagerCreate(MlirContext ctx); +/// Create a new top-level PassManager anchored on `anchorOp`. +MLIR_CAPI_EXPORTED MlirPassManager +mlirPassManagerCreateOnOperation(MlirContext ctx, MlirStringRef anchorOp); + /// Destroy the provided PassManager. MLIR_CAPI_EXPORTED void mlirPassManagerDestroy(MlirPassManager passManager); diff --git a/mlir/lib/CAPI/IR/Pass.cpp b/mlir/lib/CAPI/IR/Pass.cpp --- a/mlir/lib/CAPI/IR/Pass.cpp +++ b/mlir/lib/CAPI/IR/Pass.cpp @@ -24,6 +24,11 @@ return wrap(new PassManager(unwrap(ctx))); } +MlirPassManager mlirPassManagerCreateOnOperation(MlirContext ctx, + MlirStringRef anchorOp) { + return wrap(new PassManager(unwrap(ctx), unwrap(anchorOp))); +} + void mlirPassManagerDestroy(MlirPassManager passManager) { delete unwrap(passManager); } diff --git a/mlir/test/CAPI/pass.c b/mlir/test/CAPI/pass.c --- a/mlir/test/CAPI/pass.c +++ b/mlir/test/CAPI/pass.c @@ -140,7 +140,8 @@ void testPrintPassPipeline() { MlirContext ctx = mlirContextCreate(); - MlirPassManager pm = mlirPassManagerCreate(ctx); + MlirPassManager pm = mlirPassManagerCreateOnOperation( + ctx, mlirStringRefCreateFromCString("any")); // Populate the pass-manager MlirOpPassManager nestedModulePm = mlirPassManagerGetNestedUnder( pm, mlirStringRefCreateFromCString("builtin.module")); @@ -150,7 +151,7 @@ mlirOpPassManagerAddOwnedPass(nestedFuncPm, printOpStatPass); // Print the top level pass manager - // CHECK: Top-level: builtin.module( + // CHECK: Top-level: any( // CHECK-SAME: builtin.module(func.func(print-op-stats{json=false})) // CHECK-SAME: ) fprintf(stderr, "Top-level: ");