97 lines
4.7 KiB
C++
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)
|