blob: d7168069fcd90ffdc22f3a9bd52a7e2e60fef89e [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
#ifndef IREE_COMPILER_DIALECT_HAL_IR_HALTYPES_H_
#define IREE_COMPILER_DIALECT_HAL_IR_HALTYPES_H_
#include <cstdint>
#include <optional>
#include "iree/compiler/Dialect/Stream/IR/StreamTypes.h"
#include "iree/compiler/Dialect/Util/IR/UtilTraits.h"
#include "iree/compiler/Dialect/Util/IR/UtilTypes.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/TypeSwitch.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/DialectImplementation.h"
#include "mlir/IR/OpDefinition.h"
#include "mlir/IR/TypeSupport.h"
#include "mlir/IR/Types.h"
#include "mlir/Support/LLVM.h"
// clang-format off: must be included after all LLVM/MLIR headers.
#include "iree/compiler/Dialect/HAL/IR/HALEnums.h.inc" // IWYU pragma: keep
// clang-format on
namespace mlir::iree_compiler::IREE::HAL {
class DeviceTargetAttr;
class TargetRegistry;
using BuildDeviceTargetMatchFn = std::function<Value(
Location loc, Value device, IREE::HAL::DeviceTargetAttr targetAttr,
OpBuilder &builder)>;
#include "iree/compiler/Dialect/HAL/IR/HALAttrInterfaces.h.inc" // IWYU pragma: export
#include "iree/compiler/Dialect/HAL/IR/HALOpInterfaces.h.inc" // IWYU pragma: export
#include "iree/compiler/Dialect/HAL/IR/HALTypeInterfaces.h.inc" // IWYU pragma: export
//===----------------------------------------------------------------------===//
// Utilities
//===----------------------------------------------------------------------===//
template <typename T>
inline bool allEnumBitsSet(T value, T required) {
return (static_cast<uint32_t>(value) & static_cast<uint32_t>(required)) ==
static_cast<uint32_t>(required);
}
//===----------------------------------------------------------------------===//
// Alignment
//===----------------------------------------------------------------------===//
// Returns the common (minimum) alignment between |lhs| and |rhs| or nullopt if
// either is unaligned.
llvm::MaybeAlign commonAlignment(llvm::MaybeAlign lhs, llvm::MaybeAlign rhs);
// Returns either the constant offset |value| or the alignment of the offset
// inferred from the IR. Returns nullopt if no alignment is available.
std::optional<uint64_t> lookupOffsetOrAlignment(Value value);
//===----------------------------------------------------------------------===//
// Object types
//===----------------------------------------------------------------------===//
struct AllocatorType : public Type::TypeBase<AllocatorType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.allocator";
};
struct BufferType
: public Type::TypeBase<BufferType, Type, TypeStorage,
IREE::Util::InferTypeSizeInterface::Trait,
IREE::Util::ReferenceTypeInterface::Trait> {
using Base::Base;
static constexpr StringLiteral name = "hal.buffer";
Value inferSizeFromValue(Location loc, Value value, OpBuilder &builder) const;
};
struct BufferViewType
: public Type::TypeBase<BufferViewType, Type, TypeStorage,
IREE::Util::InferTypeSizeInterface::Trait,
IREE::Util::ReferenceTypeInterface::Trait> {
using Base::Base;
static constexpr StringLiteral name = "hal.buffer_view";
Value inferSizeFromValue(Location loc, Value value, OpBuilder &builder) const;
};
struct ChannelType : public Type::TypeBase<ChannelType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.channel";
};
struct CommandBufferType
: public Type::TypeBase<CommandBufferType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.command_buffer";
};
struct DeviceType
: public Type::TypeBase<DeviceType, Type, TypeStorage,
mlir::OpTrait::IREE::Util::ImplicitlyCaptured,
IREE::Util::ReferenceTypeInterface::Trait> {
using Base::Base;
static constexpr StringLiteral name = "hal.device";
// Resolves to any device at runtime.
// This is unlikely to be what any particular caller wants and should be
// avoided outside of testing/debugging passes that don't care about
// multi-targeting.
static Value resolveAny(Location loc, OpBuilder &builder);
};
struct EventType : public Type::TypeBase<EventType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.event";
};
struct ExecutableType
: public Type::TypeBase<ExecutableType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.executable";
};
struct FenceType : public Type::TypeBase<FenceType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.fence";
};
struct FileType : public Type::TypeBase<FileType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.file";
};
struct SemaphoreType : public Type::TypeBase<SemaphoreType, Type, TypeStorage> {
using Base::Base;
static constexpr StringLiteral name = "hal.semaphore";
};
//===----------------------------------------------------------------------===//
// Struct types
//===----------------------------------------------------------------------===//
// A tuple containing runtime values for a descriptor set binding.
// The buffer specified may be either a !hal.buffer or an index of a binding
// table slot to source the buffer from.
struct PipelineBindingValue {
Value ordinal;
Value buffer;
Value byteOffset;
Value byteLength;
};
// A tuple containing runtime values for a binding.
// The buffer specified may be either a !hal.buffer or an index of a binding
// table slot to source the buffer from.
struct BindingValue {
Value buffer;
Value byteOffset;
Value byteLength;
};
template <typename T>
struct StaticRange {
T min;
T max;
StaticRange(T value) : min(value), max(value) {}
StaticRange(T min, T max) : min(min), max(max) {}
};
} // namespace mlir::iree_compiler::IREE::HAL
// clang-format off: must be included after all LLVM/MLIR headers.
#define GET_ATTRDEF_CLASSES
#include "iree/compiler/Dialect/HAL/IR/HALAttrs.h.inc" // IWYU pragma: keep
// clang-format on
//===----------------------------------------------------------------------===//
// Utilities
//===----------------------------------------------------------------------===//
namespace mlir::iree_compiler::IREE::HAL {
} // namespace mlir::iree_compiler::IREE::HAL
#endif // IREE_COMPILER_DIALECT_HAL_IR_HALTYPES_H_