diff --git a/mlir/include/mlir/Dialect/Quant/QuantTypes.h b/mlir/include/mlir/Dialect/Quant/QuantTypes.h index de5aed0a91a20..09cddf3e96f4d 100644 --- a/mlir/include/mlir/Dialect/Quant/QuantTypes.h +++ b/mlir/include/mlir/Dialect/Quant/QuantTypes.h @@ -52,7 +52,8 @@ class QuantizedType : public Type { using Type::Type; /// The maximum number of bits supported for storage types. - static constexpr unsigned MaxStorageBits = 32; + /// NOTE: u64 storage type is not yet supported. + static constexpr unsigned MaxStorageBits = 64; static LogicalResult verify(function_ref emitError, unsigned flags, Type storageType, diff --git a/mlir/lib/Dialect/Quant/IR/QuantTypes.cpp b/mlir/lib/Dialect/Quant/IR/QuantTypes.cpp index 81e3b914755be..cb8be7d39ef35 100644 --- a/mlir/lib/Dialect/Quant/IR/QuantTypes.cpp +++ b/mlir/lib/Dialect/Quant/IR/QuantTypes.cpp @@ -44,15 +44,21 @@ QuantizedType::verify(function_ref emitError, if (integralWidth == 0 || integralWidth > MaxStorageBits) return emitError() << "illegal storage type size: " << integralWidth; - // Verify storageTypeMin and storageTypeMax. bool isSigned = (flags & QuantizationFlags::Signed) == QuantizationFlags::Signed; + // u64 is not yet supported because its full range cannot be represented + // by the type of `storageTypeMax`, making it difficult to verify the + // storage type. + if (!isSigned && integralWidth == 64) + return emitError() + << "illegal storage type; u64 storage type is not supported"; + + // Verify storageTypeMin and storageTypeMax. int64_t defaultIntegerMin = getDefaultMinimumForInteger(isSigned, integralWidth); int64_t defaultIntegerMax = getDefaultMaximumForInteger(isSigned, integralWidth); - if (storageTypeMax - storageTypeMin <= 0 || - storageTypeMin < defaultIntegerMin || + if (storageTypeMax <= storageTypeMin || storageTypeMin < defaultIntegerMin || storageTypeMax > defaultIntegerMax) { return emitError() << "illegal storage min and storage max: (" << storageTypeMin << ":" << storageTypeMax << ")"; diff --git a/mlir/test/Dialect/Quant/parse-any-invalid.mlir b/mlir/test/Dialect/Quant/parse-any-invalid.mlir index 41c5f93070717..a7c7f461846a4 100644 --- a/mlir/test/Dialect/Quant/parse-any-invalid.mlir +++ b/mlir/test/Dialect/Quant/parse-any-invalid.mlir @@ -26,12 +26,12 @@ !qalias = !quant.any:f32> // ----- -// Unrecognized storage type: storage size > 32 -// expected-error@+1 {{illegal storage type size: 33}} -!qalias = !quant.any +// Unrecognized storage type: storage size > 64 +// expected-error@+1 {{illegal storage type size: 65}} +!qalias = !quant.any // ----- -// Unrecognized storage type: storage size < 0 +// Unrecognized storage type: storage size > 64 // expected-error@+1 {{illegal storage type size: 1024}} !qalias = !quant.any:f32> diff --git a/mlir/test/Dialect/Quant/parse-uniform-invalid.mlir b/mlir/test/Dialect/Quant/parse-uniform-invalid.mlir index a82e8efdb1a3c..5f7ac004c49b9 100644 --- a/mlir/test/Dialect/Quant/parse-uniform-invalid.mlir +++ b/mlir/test/Dialect/Quant/parse-uniform-invalid.mlir @@ -46,9 +46,9 @@ !qalias = !quant.uniform:f32, 0.99872:127> // ----- -// Unrecognized storage type: storage size > 32 -// expected-error@+1 {{illegal storage type size: 33}} -!qalias = !quant.uniform +// Unrecognized storage type: storage size > 64 +// expected-error@+1 {{illegal storage type size: 65}} +!qalias = !quant.uniform // ----- // Unrecognized storage type: storage size < 0 @@ -60,6 +60,11 @@ // expected-error@+1 {{invalid integer width}} !qalias = !quant.uniform:f32, 0.99872:127> +// ----- +// Illegal storage type: u64 +// expected-error@+1 {{illegal storage type; u64 storage type is not supported}} +!qalias = !quant.uniform + // ----- // Illegal storage min/max: max - min < 0 // expected-error@+1 {{illegal storage min and storage max: (2:1)}} diff --git a/mlir/test/Dialect/Quant/parse-uniform.mlir b/mlir/test/Dialect/Quant/parse-uniform.mlir index 4fbe86d935ea3..5bc391e9ea8ca 100644 --- a/mlir/test/Dialect/Quant/parse-uniform.mlir +++ b/mlir/test/Dialect/Quant/parse-uniform.mlir @@ -83,6 +83,15 @@ func.func @parse() -> !qalias { return %0 : !qalias } +// ----- +// Storage type: i64 +// CHECK: !quant.uniform +!qalias = !quant.uniform +func.func @parse() -> !qalias { + %0 = "foo"() : () -> !qalias + return %0 : !qalias +} + // ----- // Expressed type: f32 // CHECK: !quant.uniform