[Mlir-commits] [mlir] 2c20bc5 - [mlir][spirv] Add definitions for GL FindILsb and FindSMsb (#143916)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Jun 12 09:54:45 PDT 2025
Author: fairywreath
Date: 2025-06-12T12:54:42-04:00
New Revision: 2c20bc5112a18a8a893e8caea6fd59c097754d74
URL: https://github.com/llvm/llvm-project/commit/2c20bc5112a18a8a893e8caea6fd59c097754d74
DIFF: https://github.com/llvm/llvm-project/commit/2c20bc5112a18a8a893e8caea6fd59c097754d74.diff
LOG: [mlir][spirv] Add definitions for GL FindILsb and FindSMsb (#143916)
Adds SPIRV GL FindILsb and FindSMsb instructions which correspond to GL
instruction numbers 73 and 74.
Added:
Modified:
mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td
mlir/test/Dialect/SPIRV/IR/gl-ops.mlir
mlir/test/Target/SPIRV/gl-ops.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td
index 7ffe0c8da1cae..2ec61758ba8ef 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVGLOps.td
@@ -1274,6 +1274,41 @@ def SPIRV_GLReflectOp : SPIRV_GLBinaryArithmeticOp<"Reflect", 71, SPIRV_Float> {
// ----
+def SPIRV_GLFindILsbOp : SPIRV_GLUnaryArithmeticOp<"FindILsb", 73, SPIRV_Integer> {
+ let summary = "Integer least-significant bit";
+
+ let description = [{
+ Results in the bit number of the least-significant 1-bit in the binary
+ representation of Value. If Value is 0, the result is -1.
+
+ Result Type and the type of Value must both be integer scalar or
+ integer vector types. Result Type and operand types must have the
+ same number of components with the same component width. Results are
+ computed per component.
+ }];
+}
+
+// ----
+
+def SPIRV_GLFindSMsbOp : SPIRV_GLUnaryArithmeticOp<"FindSMsb", 74, SPIRV_Int32> {
+ let summary = "Signed-integer most-significant bit, with Value interpreted as a signed integer";
+
+ let description = [{
+ For positive numbers, the result will be the bit number of the most significant
+ 1-bit. For negative numbers, the result will be the bit number of the most
+ significant 0-bit. For a Value of 0 or -1, the result is -1.
+
+ Result Type and the type of Value must both be integer scalar or
+ integer vector types. Result Type and operand types must have the
+ same number of components with the same component width. Results are
+ computed per component.
+
+ This instruction is currently limited to 32-bit width components.
+ }];
+}
+
+// ----
+
def SPIRV_GLFindUMsbOp : SPIRV_GLUnaryArithmeticOp<"FindUMsb", 75, SPIRV_Int32> {
let summary = "Unsigned-integer most-significant bit";
diff --git a/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir b/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir
index fbcf2095dc608..2b75767feaf92 100644
--- a/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir
+++ b/mlir/test/Dialect/SPIRV/IR/gl-ops.mlir
@@ -567,7 +567,71 @@ func.func @fmix_vector(%arg0 : vector<3xf32>, %arg1 : vector<3xf32>, %arg2 : vec
// -----
//===----------------------------------------------------------------------===//
-// spirv.GL.Exp
+// spirv.GL.FindILsb
+//===----------------------------------------------------------------------===//
+
+func.func @findimsb_scalar_i32(%arg0 : i32) -> () {
+ // CHECK: spirv.GL.FindILsb {{%.*}} : i32
+ %2 = spirv.GL.FindILsb %arg0 : i32
+ return
+}
+
+func.func @findimsb_vector_i32(%arg0 : vector<3xi32>) -> () {
+ // CHECK: spirv.GL.FindILsb {{%.*}} : vector<3xi32>
+ %2 = spirv.GL.FindILsb %arg0 : vector<3xi32>
+ return
+}
+
+func.func @findimsb_scalar_i16(%arg0 : i16) -> () {
+ // CHECK: spirv.GL.FindILsb {{%.*}} : i16
+ %2 = spirv.GL.FindILsb %arg0 : i16
+ return
+}
+
+func.func @findimsb_vector_i64(%arg0 : vector<3xi64>) -> () {
+ // CHECK: spirv.GL.FindILsb {{%.*}} : vector<3xi64>
+ %2 = spirv.GL.FindILsb %arg0 : vector<3xi64>
+ return
+}
+
+// -----
+
+func.func @findimsb_error_scalar_float(%arg0 : f32) -> () {
+ // expected-error @+1 {{operand #0 must be 8/16/32/64-bit integer or vector of 8/16/32/64-bit integer values of length 2/3/4/8/1}}
+ %2 = spirv.GL.FindILsb %arg0 : f32
+ return
+}
+
+// -----
+
+//===----------------------------------------------------------------------===//
+// spirv.GL.FindSMsb
+//===----------------------------------------------------------------------===//
+
+func.func @findsmsb_scalar(%arg0 : i32) -> () {
+ // CHECK: spirv.GL.FindSMsb {{%.*}} : i32
+ %2 = spirv.GL.FindSMsb %arg0 : i32
+ return
+}
+
+func.func @findsmsb_vector(%arg0 : vector<3xi32>) -> () {
+ // CHECK: spirv.GL.FindSMsb {{%.*}} : vector<3xi32>
+ %2 = spirv.GL.FindSMsb %arg0 : vector<3xi32>
+ return
+}
+
+// -----
+
+func.func @findsmsb_error_scalar_i64(%arg0 : i64) -> () {
+ // expected-error @+1 {{operand #0 must be Int32 or vector of Int32}}
+ %2 = spirv.GL.FindSMsb %arg0 : i64
+ return
+}
+
+// -----
+
+//===----------------------------------------------------------------------===//
+// spirv.GL.FindUMsb
//===----------------------------------------------------------------------===//
func.func @findumsb(%arg0 : i32) -> () {
diff --git a/mlir/test/Target/SPIRV/gl-ops.mlir b/mlir/test/Target/SPIRV/gl-ops.mlir
index e4a6c6fb5a34e..eacf36bfba9ce 100644
--- a/mlir/test/Target/SPIRV/gl-ops.mlir
+++ b/mlir/test/Target/SPIRV/gl-ops.mlir
@@ -90,13 +90,24 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
spirv.Return
}
+ spirv.func @findilsb(%arg0 : i32) "None" {
+ // CHECK: spirv.GL.FindILsb {{%.*}} : i32
+ %2 = spirv.GL.FindILsb %arg0 : i32
+ spirv.Return
+ }
+ spirv.func @findsmsb(%arg0 : i32) "None" {
+ // CHECK: spirv.GL.FindSMsb {{%.*}} : i32
+ %2 = spirv.GL.FindSMsb %arg0 : i32
+ spirv.Return
+ }
+
spirv.func @findumsb(%arg0 : i32) "None" {
// CHECK: spirv.GL.FindUMsb {{%.*}} : i32
%2 = spirv.GL.FindUMsb %arg0 : i32
spirv.Return
}
- spirv.func @vector(%arg0 : f32, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>) "None" {
+ spirv.func @vector(%arg0 : f32, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>, %arg3: vector<3xi32>) "None" {
// CHECK: {{%.*}} = spirv.GL.Cross {{%.*}}, {{%.*}} : vector<3xf32>
%0 = spirv.GL.Cross %arg1, %arg2 : vector<3xf32>
// CHECK: {{%.*}} = spirv.GL.Normalize {{%.*}} : f32
@@ -111,6 +122,12 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
%5 = spirv.GL.Distance %arg0, %arg0 : f32, f32 -> f32
// CHECK: {{%.*}} = spirv.GL.Distance {{%.*}}, {{%.*}} : vector<3xf32>, vector<3xf32> -> f32
%6 = spirv.GL.Distance %arg1, %arg2 : vector<3xf32>, vector<3xf32> -> f32
+ // CHECK: {{%.*}} = spirv.GL.FindILsb {{%.*}} : vector<3xi32>
+ %7 = spirv.GL.FindILsb %arg3 : vector<3xi32>
+ // CHECK: {{%.*}} = spirv.GL.FindSMsb {{%.*}} : vector<3xi32>
+ %8 = spirv.GL.FindSMsb %arg3 : vector<3xi32>
+ // CHECK: {{%.*}} = spirv.GL.FindUMsb {{%.*}} : vector<3xi32>
+ %9 = spirv.GL.FindUMsb %arg3 : vector<3xi32>
spirv.Return
}
More information about the Mlir-commits
mailing list