blob: 36f3cb51fe33b8572acf74fb7a925c7f2065a13e [file] [log] [blame]
// Copyright 2021 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "compiler/plugins/input/TOSA/InputConversion/Passes.h"
#include "mlir/Dialect/Tosa/IR/TosaOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::iree_compiler {
#define GEN_PASS_DEF_VERIFYCOMPILERTOSAINPUTLEGALITYPASS
#include "compiler/plugins/input/TOSA/InputConversion/Passes.h.inc"
namespace {
class VerifyCompilerTOSAInputLegalityPass final
: public impl::VerifyCompilerTOSAInputLegalityPassBase<
VerifyCompilerTOSAInputLegalityPass> {
public:
void runOnOperation() override {
auto *context = &getContext();
ConversionTarget conversionTarget(*context);
RewritePatternSet conversionPatterns(&getContext());
// Note that we would prefer allow-lists of what we positively support.
// However, it is so common to sneak input-level ops into the pipeline
// that we explicitly deny the dialects we know about.
conversionTarget.addIllegalDialect<tosa::TosaDialect>();
// Exception: ApplyScaleOp is actually a lowered op on par with standard
// dialect.
conversionTarget.addLegalOp<tosa::ApplyScaleOp>();
// NOTE: It is not fully illegal to tunnel input dialect ops through to
// backends that expect them. When such situations arise, the container
// op should be marked recursively legal here.
SmallVector<Diagnostic> failures;
{
ScopedDiagnosticHandler diag(context,
[&](Diagnostic &d) -> LogicalResult {
failures.push_back(std::move(d));
return success();
});
if (succeeded(applyPartialConversion(getOperation(), conversionTarget,
std::move(conversionPatterns)))) {
return;
}
}
// Error fall-through. Attach all reported issues as notes.
InFlightDiagnostic errorDiag =
emitError(getOperation().getLoc())
<< "one or more illegal operations were found in the compiler input "
"(are you missing an --iree-input-type= flag, or did you mean to "
"pre-process through an IREE importer frontend?)";
for (auto &failureDiag : failures) {
Diagnostic &note = errorDiag.attachNote(failureDiag.getLocation());
for (auto &arg : failureDiag.getArguments()) {
note.append(arg);
}
}
signalPassFailure();
}
};
} // namespace
} // namespace mlir::iree_compiler