Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[mlir][index] Add boilerplate for the
index
dialect
This patch introduces the `index` dialect and associated boilerplate for adding ops and enums (comparison predicates). Reviewed By: rriddle, jpienaar, nicolasvasilache Differential Revision: https://reviews.llvm.org/D135688
- Loading branch information
Showing
17 changed files
with
302 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
add_subdirectory(IR) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<string mnemonic, list<Trait> traits = []> | ||
: Op<IndexDialect, mnemonic, [NoSideEffect] # traits>; | ||
|
||
#endif // INDEX_OPS |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
add_subdirectory(IR) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
add_mlir_dialect_library(MLIRIndexDialect | ||
IndexAttrs.cpp | ||
IndexDialect.cpp | ||
IndexOps.cpp | ||
|
||
DEPENDS | ||
MLIRIndexOpsIncGen | ||
|
||
LINK_LIBS PUBLIC | ||
MLIRDialect | ||
MLIRIR | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters