[Mlir-commits] [mlir] [mlir][spirv] Add definitions for GL FindILsb and FindSMsb (PR #143916)
Darren Wihandi
llvmlistbot at llvm.org
Thu Jun 12 08:30:34 PDT 2025
https://github.com/fairywreath created https://github.com/llvm/llvm-project/pull/143916
Adds SPIRV GL FindILsb and FindSMsb instructions which correspond to GL instruction numbers 73 and 74.
>From c8cc9e909fa874d2ab19419b5814886404c87e56 Mon Sep 17 00:00:00 2001
From: fairywreath <nerradfour at gmail.com>
Date: Thu, 12 Jun 2025 09:25:03 -0600
Subject: [PATCH] [mlir][spirv] Add definitions for GL FindILsb and FindSMsb
---
.../mlir/Dialect/SPIRV/IR/SPIRVGLOps.td | 35 ++++++++++
mlir/test/Dialect/SPIRV/IR/gl-ops.mlir | 66 ++++++++++++++++++-
mlir/test/Target/SPIRV/gl-ops.mlir | 19 +++++-
3 files changed, 118 insertions(+), 2 deletions(-)
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