blob: ca76fabb9350929bccc8c00f317bf1c110660251 [file]
// Copyright 2019 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 "iree/compiler/Dialect/HAL/Conversion/ConversionTarget.h"
#include "iree/compiler/Dialect/HAL/Conversion/TypeConverter.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/Util/IR/UtilTypes.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/BuiltinTypes.h"
namespace mlir::iree_compiler {
HALConversionTarget::HALConversionTarget(MLIRContext *context,
TypeConverter &typeConverter)
: ConversionTarget(*context) {
// The HAL dialect allows hal ops as input as we may be running on partially
// processed files or may have already lowered some constructs (like constant
// pools).
addLegalDialect("hal");
// We don't care about the contents of a HAL executable: it may have any kind
// of dialect and type usage.
addLegalOp<IREE::HAL::ExecutableOp>();
markOpRecursivelyLegal<IREE::HAL::ExecutableOp>();
// Setup the fallback handler such that all ops without explicitly
// registered patterns will be checked to ensure that they don't use any
// illegal types.
markUnknownOpDynamicallyLegal([&](Operation *op) {
// Short-circuit test that bails on the first illegal type.
const auto isTypeIllegal = [&](Type type) {
return !typeConverter.isLegal(type);
};
return !(llvm::any_of(op->getOperandTypes(), isTypeIllegal) ||
llvm::any_of(op->getResultTypes(), isTypeIllegal));
});
}
} // namespace mlir::iree_compiler