[Mlir-commits] [mlir] 3de6b5c - [mlir][spirv] Fix Float8EXT type conversion legality (#192466)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Apr 21 04:22:28 PDT 2026


Author: Davide Grohmann
Date: 2026-04-21T13:22:23+02:00
New Revision: 3de6b5c685b38f7c63c8d81e8b6d6498d3dd0eb1

URL: https://github.com/llvm/llvm-project/commit/3de6b5c685b38f7c63c8d81e8b6d6498d3dd0eb1
DIFF: https://github.com/llvm/llvm-project/commit/3de6b5c685b38f7c63c8d81e8b6d6498d3dd0eb1.diff

LOG: [mlir][spirv] Fix Float8EXT type conversion legality (#192466)

Signed-off-by: Davide Grohmann <davide.grohmann at arm.com>

Added: 
    

Modified: 
    mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
    mlir/test/Conversion/FuncToSPIRV/types-to-spirv.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
index 0853c5aa59f92..22b31d9507efc 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
@@ -541,6 +541,8 @@ bool ScalarType::classof(Type type) {
 }
 
 bool ScalarType::isValid(FloatType type) {
+  if (type.isF8E4M3FN() || type.isF8E5M2())
+    return true;
   return llvm::is_contained({16u, 32u, 64u}, type.getWidth());
 }
 

diff  --git a/mlir/test/Conversion/FuncToSPIRV/types-to-spirv.mlir b/mlir/test/Conversion/FuncToSPIRV/types-to-spirv.mlir
index 0c77c88334572..829401c194f55 100644
--- a/mlir/test/Conversion/FuncToSPIRV/types-to-spirv.mlir
+++ b/mlir/test/Conversion/FuncToSPIRV/types-to-spirv.mlir
@@ -962,37 +962,60 @@ module attributes {
   // CHECK-SAME: %arg3: i8
   // CHECK-SAME: %arg4: i8
   // CHECK-SAME: %arg5: i8
-  // CHECK-SAME: %arg6: i8
-  // CHECK-SAME: %arg7: i8
-  // CHECK-SAME: %arg8: vector<4xi8>
-  // CHECK-SAME: %arg9: !spirv.ptr<!spirv.struct<(!spirv.array<8 x i8, stride=1> [0])>, StorageBuffer>
-  // CHECK-SAME: %arg10: !spirv.array<4 x i8>
+  // CHECK-SAME: %arg6: vector<4xi8>
+  // CHECK-SAME: %arg7: !spirv.ptr<!spirv.struct<(!spirv.array<8 x i8, stride=1> [0])>, StorageBuffer>
+  // CHECK-SAME: %arg8: !spirv.array<4 x i8>
   // UNSUPPORTED_FLOAT-LABEL: func.func @float8_to_integer8
-  // UNSUPPORTED_FLOAT-SAME: (%arg0: f8E5M2
-  // UNSUPPORTED_FLOAT-SAME: %arg1: f8E4M3
-  // UNSUPPORTED_FLOAT-SAME: %arg2: f8E4M3FN
-  // UNSUPPORTED_FLOAT-SAME: %arg3: f8E5M2FNUZ
-  // UNSUPPORTED_FLOAT-SAME: %arg4: f8E4M3FNUZ
-  // UNSUPPORTED_FLOAT-SAME: %arg5: f8E4M3B11FNUZ
-  // UNSUPPORTED_FLOAT-SAME: %arg6: f8E3M4
-  // UNSUPPORTED_FLOAT-SAME: %arg7: f8E8M0FNU
-  // UNSUPPORTED_FLOAT-SAME: %arg8: vector<4xf8E4M3B11FNUZ>
-  // UNSUPPORTED_FLOAT-SAME: %arg9: memref<8xf8E4M3, #spirv.storage_class<StorageBuffer>>
-  // UNSUPPORTED_FLOAT-SAME: %arg10: tensor<4xf8E5M2>
+  // UNSUPPORTED_FLOAT-SAME: (%arg0: f8E4M3
+  // UNSUPPORTED_FLOAT-SAME: %arg1: f8E5M2FNUZ
+  // UNSUPPORTED_FLOAT-SAME: %arg2: f8E4M3FNUZ
+  // UNSUPPORTED_FLOAT-SAME: %arg3: f8E4M3B11FNUZ
+  // UNSUPPORTED_FLOAT-SAME: %arg4: f8E3M4
+  // UNSUPPORTED_FLOAT-SAME: %arg5: f8E8M0FNU
+  // UNSUPPORTED_FLOAT-SAME: %arg6: vector<4xf8E4M3B11FNUZ>
+  // UNSUPPORTED_FLOAT-SAME: %arg7: memref<8xf8E4M3, #spirv.storage_class<StorageBuffer>>
+  // UNSUPPORTED_FLOAT-SAME: %arg8: tensor<4xf8E4M3>
   // UNSUPPORTED_FLOAT-SAME: ) {
 
   func.func @float8_to_integer8(
-    %arg0: f8E5M2,                   // CHECK-NOT: f8E5M2
-    %arg1: f8E4M3,                   // CHECK-NOT: f8E4M3
-    %arg2: f8E4M3FN,                // CHECK-NOT: f8E4M3FN
-    %arg3: f8E5M2FNUZ,              // CHECK-NOT: f8E5M2FNUZ
-    %arg4: f8E4M3FNUZ,              // CHECK-NOT: f8E4M3FNUZ
-    %arg5: f8E4M3B11FNUZ,           // CHECK-NOT: f8E4M3B11FNUZ
-    %arg6: f8E3M4,                  // CHECK-NOT: f8E3M4
-    %arg7: f8E8M0FNU,               // CHECK-NOT: f8E8M0FNU
-    %arg8: vector<4xf8E4M3B11FNUZ>, // CHECK-NOT: vector<4xf8E4M3B11FNUZ>
-    %arg9: memref<8xf8E4M3, #spirv.storage_class<StorageBuffer>>, // CHECK-NOT: memref
-    %arg10: tensor<4xf8E5M2>        // CHECK-NOT: tensor
+    %arg0: f8E4M3,                  // CHECK-NOT: f8E4M3
+    %arg1: f8E5M2FNUZ,              // CHECK-NOT: f8E5M2FNUZ
+    %arg2: f8E4M3FNUZ,              // CHECK-NOT: f8E4M3FNUZ
+    %arg3: f8E4M3B11FNUZ,           // CHECK-NOT: f8E4M3B11FNUZ
+    %arg4: f8E3M4,                  // CHECK-NOT: f8E3M4
+    %arg5: f8E8M0FNU,               // CHECK-NOT: f8E8M0FNU
+    %arg6: vector<4xf8E4M3B11FNUZ>, // CHECK-NOT: vector<4xf8E4M3B11FNUZ>
+    %arg7: memref<8xf8E4M3, #spirv.storage_class<StorageBuffer>>, // CHECK-NOT: memref
+    %arg8: tensor<4xf8E4M3>        // CHECK-NOT: tensor
+  ) {
+    // CHECK: spirv.Return
+    return
+  }
+}
+
+// -----
+
+// Check that supported Float8EXT types remain legal SPIR-V scalar types when
+// float emulation is disabled.
+module attributes {
+  spirv.target_env = #spirv.target_env<#spirv.vce<v1.0, [Float8EXT], [SPV_EXT_float8]>, #spirv.resource_limits<>>
+} {
+
+  // CHECK-LABEL: spirv.func @supported_float8_types
+  // CHECK-SAME: (%arg0: vector<4xi32>
+  // CHECK-SAME: %arg1: vector<4xi32>
+  // CHECK-SAME: %arg2: !spirv.array<4 x i32>
+  // CHECK-SAME: %arg3: !spirv.array<4 x i32>
+  // UNSUPPORTED_FLOAT-LABEL: spirv.func @supported_float8_types
+  // UNSUPPORTED_FLOAT-SAME: (%arg0: vector<4xf8E5M2>
+  // UNSUPPORTED_FLOAT-SAME: %arg1: vector<4xf8E4M3FN>
+  // UNSUPPORTED_FLOAT-SAME: %arg2: !spirv.array<4 x f8E5M2>
+  // UNSUPPORTED_FLOAT-SAME: %arg3: !spirv.array<4 x f8E4M3FN>
+  func.func @supported_float8_types(
+    %arg0: vector<4xf8E5M2>,
+    %arg1: vector<4xf8E4M3FN>,
+    %arg2: tensor<4xf8E5M2>,
+    %arg3: tensor<4xf8E4M3FN>
   ) {
     // CHECK: spirv.Return
     return


        


More information about the Mlir-commits mailing list