Files
gps/tools/local/circt/include/mlir/Dialect/Index/IR/IndexOpsDialect.h.inc
T
2026-07-12 11:01:51 +03:00

97 lines
4.7 KiB
C++

/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Dialect Declarations *|
|* *|
|* Automatically generated file, do not edit! *|
|* From: IndexOps.td *|
|* *|
\*===----------------------------------------------------------------------===*/
namespace mlir::index {
/// The Index dialect
/// The Index dialect contains operations for manipulating values of the builtin
/// `index` type. The index type models target-specific values of pointer width,
/// like `intptr_t`. Index values are typically used as loop bounds, array
/// subscripts, tensor dimensions, etc.
///
/// The operations in this dialect operate exclusively on scalar index types.
/// The dialect and its operations treat the index type as signless and contains
/// signed and unsigned versions of certain operations where the distinction is
/// meaningful. In particular, the operations and transformations are careful to
/// be aware of the target-independent-ness of the index type, such as when
/// folding.
///
/// The folding semantics of the Index dialect operations ensure that folding
/// produces the same results irrespective of the eventual target pointer width.
/// All index constants are stored in `APInt`s of maximum index bitwidth: 64.
/// Operations are folded using 64-bit integer arithmetic.
///
/// For operations where the values of the upper 32 bits don't impact the values
/// of the lower 32 bits, no additional handling is required because if the
/// target is 32-bit, the truncated folded result will be the same as if the
/// operation were computed with 32-bit arithmetic, and if the target is 64-bit,
/// the fold result is valid by default.
///
/// Consider addition: an overflow in 32-bit is the same as truncating the
/// result computed in 64-bit. For example, `add(0x800000008, 0x800000008)` is
/// `0x1000000010` in 64-bit, which truncates to `0x10`, the same result as
/// truncating the operands first: `add(0x08, 0x08)`. Specifically, an operation
/// `f` can always be folded if it satisfies the following for all 64-bit values
/// of `a` and `b`:
///
/// ```
/// trunc(f(a, b)) = f(trunc(a), trunc(b))
/// ```
///
/// When materializing target-specific code, constants just need to be truncated
/// as appropriate.
///
/// Operations where the values of the upper 32 bits do impact the values of the
/// lower 32 bits are not folded if the results would be different in 32-bit.
/// These are operations that right shift -- division, remainder, etc. These
/// operations are only folded for subsets of `a` and `b` for which the above
/// property is satisfied. This is checked per fold attempt.
///
/// Consider division: the 32-bit computation will differ from 64-bit if the
/// latter results in a high bit shifted into the lower 32 bits. For example,
/// `div(0x100000002, 2)` is `0x80000001` in 64-bit but `0x01` in 32-bit; it
/// cannot be folded. However, `div(0x200000002, 2)` can be folded. The 64-bit
/// result is `0x100000001`, which truncated to 32 bits is `0x01`. The 32-bit
/// result of the operation with truncated operands `div(0x02, 2)` which is
/// `0x01`, the same as truncating the 64-bit result.
class IndexDialect : public ::mlir::Dialect {
explicit IndexDialect(::mlir::MLIRContext *context);
void initialize();
friend class ::mlir::MLIRContext;
public:
~IndexDialect() override;
static constexpr ::llvm::StringLiteral getDialectNamespace() {
return ::llvm::StringLiteral("index");
}
/// Parse an attribute registered to this dialect.
::mlir::Attribute parseAttribute(::mlir::DialectAsmParser &parser,
::mlir::Type type) const override;
/// Print an attribute registered to this dialect.
void printAttribute(::mlir::Attribute attr,
::mlir::DialectAsmPrinter &os) const override;
/// Materialize a single constant operation from a given attribute value with
/// the desired resultant type.
::mlir::Operation *materializeConstant(::mlir::OpBuilder &builder,
::mlir::Attribute value,
::mlir::Type type,
::mlir::Location loc) override;
/// Register all dialect attributes.
void registerAttributes();
/// Register all dialect operations.
void registerOperations();
};
} // namespace mlir::index
MLIR_DECLARE_EXPLICIT_TYPE_ID(::mlir::index::IndexDialect)