[mlir][IR] Add `ValueSemantics` trait to integer, float, ... types
diff --git a/mlir/include/mlir/IR/BuiltinTypes.td b/mlir/include/mlir/IR/BuiltinTypes.td index 771de01..56f026b 100644 --- a/mlir/include/mlir/IR/BuiltinTypes.td +++ b/mlir/include/mlir/IR/BuiltinTypes.td
@@ -36,6 +36,19 @@ //===----------------------------------------------------------------------===// /// Type trait indicating that the type has value semantics. +/// +/// Reading (from) an SSA value with a value-semantics type always gives the +/// same value. +/// +/// Examples: +/// * An integer SSA value semantically always carries the same integer value. +/// * Reading (extracting) from a tensor always yields a semantically +/// equivalent SSA value. (But the extracted value itself does not +/// necessarily have value semantics.) +/// +/// Counter examples: +/// * Loading from a memref may yield different values, depending on the state +/// of the memory. def ValueSemantics : NativeTypeTrait<"ValueSemantics"> { let cppNamespace = "::mlir"; } @@ -44,7 +57,7 @@ // ComplexType //===----------------------------------------------------------------------===// -def Builtin_Complex : Builtin_Type<"Complex", "complex"> { +def Builtin_Complex : Builtin_Type<"Complex", "complex", [ValueSemantics]> { let summary = "Complex number with a parameterized element type"; let description = [{ Syntax: @@ -84,7 +97,8 @@ : Builtin_Type<name, mnemonic, /*traits=*/[ DeclareTypeInterfaceMethods< FloatTypeInterface, - ["getFloatSemantics"] # declaredInterfaceMethods>]> { + ["getFloatSemantics"] # declaredInterfaceMethods>, + ValueSemantics]> { } // Float types that are cached in MLIRContext. @@ -466,7 +480,7 @@ //===----------------------------------------------------------------------===// def Builtin_Index : Builtin_Type<"Index", "index", - [VectorElementTypeInterface]> { + [VectorElementTypeInterface, ValueSemantics]> { let summary = "Integer-like type with unknown platform-dependent bit width"; let description = [{ Syntax: @@ -497,7 +511,7 @@ //===----------------------------------------------------------------------===// def Builtin_Integer : Builtin_Type<"Integer", "integer", - [VectorElementTypeInterface]> { + [VectorElementTypeInterface, ValueSemantics]> { let summary = "Integer type with arbitrary precision up to a fixed limit"; let description = [{ Syntax: @@ -1075,7 +1089,7 @@ // TupleType //===----------------------------------------------------------------------===// -def Builtin_Tuple : Builtin_Type<"Tuple", "tuple"> { +def Builtin_Tuple : Builtin_Type<"Tuple", "tuple", [ValueSemantics]> { let summary = "Fixed-sized collection of other types"; let description = [{ Syntax: