[Mlir-commits] [mlir] [MLIR][Transform] Allow ApplyRegisteredPassOp to take options as a param (PR #142683)
Adam Siemieniuk
llvmlistbot at llvm.org
Wed Jun 4 03:10:07 PDT 2025
================
@@ -786,26 +814,79 @@ DiagnosedSilenceableFailure transform::ApplyRegisteredPassOp::applyToOne(
return emitDefiniteFailure()
<< "unknown pass or pass pipeline: " << getPassName();
- // Create pass manager and run the pass or pass pipeline.
+ // Create pass manager and add the pass or pass pipeline.
PassManager pm(getContext());
- if (failed(info->addToPipeline(pm, getOptions(), [&](const Twine &msg) {
+ if (failed(info->addToPipeline(pm, options, [&](const Twine &msg) {
emitError(msg);
return failure();
}))) {
return emitDefiniteFailure()
<< "failed to add pass or pass pipeline to pipeline: "
<< getPassName();
}
- if (failed(pm.run(target))) {
- auto diag = emitSilenceableError() << "pass pipeline failed";
- diag.attachNote(target->getLoc()) << "target op";
- return diag;
+
+ auto targets = SmallVector<Operation *>(state.getPayloadOps(getTarget()));
+ for (Operation *target : targets) {
+ // Make sure that this transform is not applied to itself. Modifying the
+ // transform IR while it is being interpreted is generally dangerous. Even
+ // more so when applying passes because they may perform a wide range of IR
+ // modifications.
+ DiagnosedSilenceableFailure payloadCheck =
+ ensurePayloadIsSeparateFromTransform(*this, target);
+ if (!payloadCheck.succeeded())
+ return payloadCheck;
+
+ // Run the pass or pass pipeline on the current target operation.
+ if (failed(pm.run(target))) {
+ auto diag = emitSilenceableError() << "pass pipeline failed";
+ diag.attachNote(target->getLoc()) << "target op";
+ return diag;
+ }
}
- results.push_back(target);
+ // The applied pass will have directly modified the payload IR(s).
+ results.set(llvm::cast<OpResult>(getResult()), targets);
return DiagnosedSilenceableFailure::success();
}
+static ParseResult parseApplyRegisteredPassOptions(
+ OpAsmParser &parser,
+ std::optional<OpAsmParser::UnresolvedOperand> &dynamicOptions,
+ StringAttr &staticOptions) {
+ dynamicOptions = std::nullopt;
+ OpAsmParser::UnresolvedOperand dynamicOptionsOperand;
+ OptionalParseResult hasDynamicOptions =
+ parser.parseOptionalOperand(dynamicOptionsOperand);
+
+ if (hasDynamicOptions.has_value()) {
+ if (failed(hasDynamicOptions.value()))
+ return failure();
+
+ dynamicOptions = dynamicOptionsOperand;
+ return success();
+ }
+
+ OptionalParseResult hasStaticOptions =
+ parser.parseOptionalAttribute(staticOptions);
+ if (hasStaticOptions.has_value()) {
+ if (failed(hasStaticOptions.value()))
+ return failure();
+ return success();
----------------
adam-smnk wrote:
```suggestion
return *hasStaticOptions;
```
https://github.com/llvm/llvm-project/pull/142683
More information about the Mlir-commits
mailing list