diff --git a/mlir/include/mlir/Dialect/CMakeLists.txt b/mlir/include/mlir/Dialect/CMakeLists.txt --- a/mlir/include/mlir/Dialect/CMakeLists.txt +++ b/mlir/include/mlir/Dialect/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(EmitC) add_subdirectory(Func) add_subdirectory(GPU) +add_subdirectory(Index) add_subdirectory(LLVMIR) add_subdirectory(Linalg) add_subdirectory(MLProgram) diff --git a/mlir/include/mlir/Dialect/Index/CMakeLists.txt b/mlir/include/mlir/Dialect/Index/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(IR) diff --git a/mlir/include/mlir/Dialect/Index/IR/CMakeLists.txt b/mlir/include/mlir/Dialect/Index/IR/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/CMakeLists.txt @@ -0,0 +1,7 @@ +set(LLVM_TARGET_DEFINITIONS IndexEnums.td) +mlir_tablegen(IndexEnums.h.inc -gen-enum-decls) +mlir_tablegen(IndexEnums.cpp.inc -gen-enum-defs) +mlir_tablegen(IndexAttrs.h.inc -gen-attrdef-decls -attrdefs-dialect=index) +mlir_tablegen(IndexAttrs.cpp.inc -gen-attrdef-defs -attrdefs-dialect=index) +add_mlir_dialect(IndexOps index) +add_mlir_doc(IndexOps IndexOps Dialects/ -gen-dialect-doc) diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexAttrs.h b/mlir/include/mlir/Dialect/Index/IR/IndexAttrs.h new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexAttrs.h @@ -0,0 +1,23 @@ +//===- IndexAttrs.h - Index attribute declarations ----------------*- C++-*-==// +// +// Part of the LLVM Project, 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 MLIR_DIALECT_INDEX_IR_INDEXATTRS_H +#define MLIR_DIALECT_INDEX_IR_INDEXATTRS_H + +#include "mlir/IR/Attributes.h" + +//===----------------------------------------------------------------------===// +// ODS-Generated Declarations +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/Index/IR/IndexEnums.h.inc" + +#define GET_ATTRDEF_CLASSES +#include "mlir/Dialect/Index/IR/IndexAttrs.h.inc" + +#endif // MLIR_DIALECT_INDEX_IR_INDEXATTRS_H diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexDialect.h b/mlir/include/mlir/Dialect/Index/IR/IndexDialect.h new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexDialect.h @@ -0,0 +1,20 @@ +//===- IndexDialect.h - Index dialect declaration -----------------*- C++-*-==// +// +// Part of the LLVM Project, 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 MLIR_DIALECT_INDEX_IR_INDEXDIALECT_H +#define MLIR_DIALECT_INDEX_IR_INDEXDIALECT_H + +#include "mlir/IR/Dialect.h" + +//===----------------------------------------------------------------------===// +// ODS-Generated Declarations +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/Index/IR/IndexOpsDialect.h.inc" + +#endif // MLIR_DIALECT_INDEX_IR_INDEXDIALECT_H diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexDialect.td b/mlir/include/mlir/Dialect/Index/IR/IndexDialect.td new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexDialect.td @@ -0,0 +1,85 @@ +//===- IndexDialect.td - Index dialect definition ----------*- tablegen -*-===// +// +// Part of the LLVM Project, 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 INDEX_DIALECT +#define INDEX_DIALECT + +include "mlir/IR/DialectBase.td" + +//===----------------------------------------------------------------------===// +// IndexDialect +//===----------------------------------------------------------------------===// + +def IndexDialect : Dialect { + let name = "index"; + + let summary = "The Index dialect"; + let description = [{ + 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. + }]; + + let cppNamespace = "::mlir::index"; + + let extraClassDeclaration = [{ + /// Register all dialect attributes. + void registerAttributes(); + /// Register all dialect operations. + void registerOperations(); + }]; +} + +#endif // INDEX_DIALECT diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexEnums.td b/mlir/include/mlir/Dialect/Index/IR/IndexEnums.td new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexEnums.td @@ -0,0 +1,14 @@ +//===- IndexEnums.td - Index enum definitions --------------*- tablegen -*-===// +// +// Part of the LLVM Project, 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 INDEX_ENUMS +#define INDEX_ENUMS + +include "mlir/IR/EnumAttr.td" + +#endif // INDEX_ENUMS diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexOps.h b/mlir/include/mlir/Dialect/Index/IR/IndexOps.h new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexOps.h @@ -0,0 +1,19 @@ +//===- IndexOps.h - Index operation declarations ------------------*- C++-*-==// +// +// Part of the LLVM Project, 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 MLIR_DIALECT_INDEX_IR_INDEXOPS_H +#define MLIR_DIALECT_INDEX_IR_INDEXOPS_H + +//===----------------------------------------------------------------------===// +// ODS-Generated Declarations +//===----------------------------------------------------------------------===// + +#define GET_OP_CLASSES +#include "mlir/Dialect/Index/IR/IndexOps.h.inc" + +#endif // MLIR_DIALECT_INDEX_IR_INDEXOPS_H diff --git a/mlir/include/mlir/Dialect/Index/IR/IndexOps.td b/mlir/include/mlir/Dialect/Index/IR/IndexOps.td new file mode 100644 --- /dev/null +++ b/mlir/include/mlir/Dialect/Index/IR/IndexOps.td @@ -0,0 +1,24 @@ +//===- IndexOps.td - Index operation definitions -----------*- tablegen -*-===// +// +// Part of the LLVM Project, 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 INDEX_OPS +#define INDEX_OPS + +include "mlir/Dialect/Index/IR/IndexDialect.td" +include "mlir/Interfaces/SideEffectInterfaces.td" +include "mlir/IR/OpBase.td" + +//===----------------------------------------------------------------------===// +// IndexOp +//===----------------------------------------------------------------------===// + +/// Base class for Index dialect operations. +class IndexOp traits = []> + : Op; + +#endif // INDEX_OPS diff --git a/mlir/include/mlir/InitAllDialects.h b/mlir/include/mlir/InitAllDialects.h --- a/mlir/include/mlir/InitAllDialects.h +++ b/mlir/include/mlir/InitAllDialects.h @@ -32,6 +32,7 @@ #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/Dialect/GPU/TransformOps/GPUTransformOps.h" +#include "mlir/Dialect/Index/IR/IndexDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Dialect/LLVMIR/NVVMDialect.h" #include "mlir/Dialect/LLVMIR/ROCDLDialect.h" @@ -87,6 +88,7 @@ emitc::EmitCDialect, func::FuncDialect, gpu::GPUDialect, + index::IndexDialect, LLVM::LLVMDialect, linalg::LinalgDialect, math::MathDialect, diff --git a/mlir/lib/Dialect/CMakeLists.txt b/mlir/lib/Dialect/CMakeLists.txt --- a/mlir/lib/Dialect/CMakeLists.txt +++ b/mlir/lib/Dialect/CMakeLists.txt @@ -12,6 +12,7 @@ add_subdirectory(EmitC) add_subdirectory(Func) add_subdirectory(GPU) +add_subdirectory(Index) add_subdirectory(Linalg) add_subdirectory(LLVMIR) add_subdirectory(Math) diff --git a/mlir/lib/Dialect/Index/CMakeLists.txt b/mlir/lib/Dialect/Index/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/mlir/lib/Dialect/Index/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(IR) diff --git a/mlir/lib/Dialect/Index/IR/CMakeLists.txt b/mlir/lib/Dialect/Index/IR/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/mlir/lib/Dialect/Index/IR/CMakeLists.txt @@ -0,0 +1,12 @@ +add_mlir_dialect_library(MLIRIndexDialect + IndexAttrs.cpp + IndexDialect.cpp + IndexOps.cpp + + DEPENDS + MLIRIndexOpsIncGen + + LINK_LIBS PUBLIC + MLIRDialect + MLIRIR + ) diff --git a/mlir/lib/Dialect/Index/IR/IndexAttrs.cpp b/mlir/lib/Dialect/Index/IR/IndexAttrs.cpp new file mode 100644 --- /dev/null +++ b/mlir/lib/Dialect/Index/IR/IndexAttrs.cpp @@ -0,0 +1,33 @@ +//===- IndexAttrs.cpp - Index attribute definitions ------------------------==// +// +// Part of the LLVM Project, 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 "mlir/Dialect/Index/IR/IndexAttrs.h" +#include "mlir/Dialect/Index/IR/IndexDialect.h" + +using namespace mlir; +using namespace mlir::index; + +//===----------------------------------------------------------------------===// +// IndexDialect +//===----------------------------------------------------------------------===// + +void IndexDialect::registerAttributes() { + addAttributes< +#define GET_ATTRDEF_LIST +#include "mlir/Dialect/Index/IR/IndexAttrs.cpp.inc" + >(); +} + +//===----------------------------------------------------------------------===// +// ODS-Generated Declarations +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/Index/IR/IndexEnums.cpp.inc" + +#define GET_ATTRDEF_CLASSES +#include "mlir/Dialect/Index/IR/IndexAttrs.cpp.inc" diff --git a/mlir/lib/Dialect/Index/IR/IndexDialect.cpp b/mlir/lib/Dialect/Index/IR/IndexDialect.cpp new file mode 100644 --- /dev/null +++ b/mlir/lib/Dialect/Index/IR/IndexDialect.cpp @@ -0,0 +1,27 @@ +//===- IndexDialect.cpp - Index dialect definition -------------------------==// +// +// Part of the LLVM Project, 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 "mlir/Dialect/Index/IR/IndexDialect.h" + +using namespace mlir; +using namespace mlir::index; + +//===----------------------------------------------------------------------===// +// IndexDialect +//===----------------------------------------------------------------------===// + +void IndexDialect::initialize() { + registerAttributes(); + registerOperations(); +} + +//===----------------------------------------------------------------------===// +// ODS-Generated Definitions +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/Index/IR/IndexOpsDialect.cpp.inc" diff --git a/mlir/lib/Dialect/Index/IR/IndexOps.cpp b/mlir/lib/Dialect/Index/IR/IndexOps.cpp new file mode 100644 --- /dev/null +++ b/mlir/lib/Dialect/Index/IR/IndexOps.cpp @@ -0,0 +1,31 @@ +//===- IndexOps.cpp - Index operation definitions --------------------------==// +// +// Part of the LLVM Project, 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 "mlir/Dialect/Index/IR/IndexOps.h" +#include "mlir/Dialect/Index/IR/IndexDialect.h" + +using namespace mlir; +using namespace mlir::index; + +//===----------------------------------------------------------------------===// +// IndexDialect +//===----------------------------------------------------------------------===// + +void IndexDialect::registerOperations() { + addOperations< +#define GET_OP_LIST +#include "mlir/Dialect/Index/IR/IndexOps.cpp.inc" + >(); +} + +//===----------------------------------------------------------------------===// +// ODS-Generated Definitions +//===----------------------------------------------------------------------===// + +#define GET_OP_CLASSES +#include "mlir/Dialect/Index/IR/IndexOps.cpp.inc" diff --git a/mlir/test/mlir-opt/commandline.mlir b/mlir/test/mlir-opt/commandline.mlir --- a/mlir/test/mlir-opt/commandline.mlir +++ b/mlir/test/mlir-opt/commandline.mlir @@ -16,6 +16,7 @@ // CHECK-NEXT: emitc // CHECK-NEXT: func // CHECK-NEXT: gpu +// CHECK-NEXT: index // CHECK-NEXT: linalg // CHECK-NEXT: llvm // CHECK-NEXT: math