[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM direct conversions for cast, CL, GL and logical ops (PR #202506)
Arseniy Obolenskiy
llvmlistbot at llvm.org
Tue Jun 9 01:49:01 PDT 2026
================
@@ -0,0 +1,97 @@
+// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s
+
+//===----------------------------------------------------------------------===//
+// Unary floating-point OpenCL ops mapped to LLVM intrinsics
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @cl_unary_float
+spirv.func @cl_unary_float(%arg0: f32, %arg1: vector<3xf32>) "None" {
+ // CHECK: llvm.intr.ceil(%{{.*}}) : (f32) -> f32
+ %0 = spirv.CL.ceil %arg0 : f32
+ // CHECK: llvm.intr.cos(%{{.*}}) : (f32) -> f32
+ %1 = spirv.CL.cos %arg0 : f32
+ // CHECK: llvm.intr.exp(%{{.*}}) : (f32) -> f32
+ %2 = spirv.CL.exp %arg0 : f32
+ // CHECK: llvm.intr.exp2(%{{.*}}) : (f32) -> f32
+ %3 = spirv.CL.exp2 %arg0 : f32
+ // CHECK: llvm.intr.exp10(%{{.*}}) : (f32) -> f32
+ %4 = spirv.CL.exp10 %arg0 : f32
+ // CHECK: llvm.intr.fabs(%{{.*}}) : (f32) -> f32
+ %5 = spirv.CL.fabs %arg0 : f32
+ // CHECK: llvm.intr.floor(%{{.*}}) : (f32) -> f32
+ %6 = spirv.CL.floor %arg0 : f32
+ // CHECK: llvm.intr.log(%{{.*}}) : (f32) -> f32
+ %7 = spirv.CL.log %arg0 : f32
+ // CHECK: llvm.intr.log2(%{{.*}}) : (f32) -> f32
+ %8 = spirv.CL.log2 %arg0 : f32
+ // CHECK: llvm.intr.log10(%{{.*}}) : (f32) -> f32
+ %9 = spirv.CL.log10 %arg0 : f32
+ // CHECK: llvm.intr.rint(%{{.*}}) : (f32) -> f32
+ %10 = spirv.CL.rint %arg0 : f32
+ // CHECK: llvm.intr.round(%{{.*}}) : (f32) -> f32
+ %11 = spirv.CL.round %arg0 : f32
+ // CHECK: llvm.intr.sin(%{{.*}}) : (f32) -> f32
+ %12 = spirv.CL.sin %arg0 : f32
+ // CHECK: llvm.intr.sinh(%{{.*}}) : (f32) -> f32
+ %13 = spirv.CL.sinh %arg0 : f32
+ // CHECK: llvm.intr.cosh(%{{.*}}) : (f32) -> f32
+ %14 = spirv.CL.cosh %arg0 : f32
+ // CHECK: llvm.intr.tan(%{{.*}}) : (f32) -> f32
+ %15 = spirv.CL.tan %arg0 : f32
+ // CHECK: llvm.intr.tanh(%{{.*}}) : (f32) -> f32
+ %16 = spirv.CL.tanh %arg0 : f32
+ // CHECK: llvm.intr.asin(%{{.*}}) : (f32) -> f32
+ %17 = spirv.CL.asin %arg0 : f32
+ // CHECK: llvm.intr.acos(%{{.*}}) : (f32) -> f32
+ %18 = spirv.CL.acos %arg0 : f32
+ // CHECK: llvm.intr.atan(%{{.*}}) : (f32) -> f32
+ %19 = spirv.CL.atan %arg0 : f32
+ // CHECK: llvm.intr.sqrt(%{{.*}}) : (f32) -> f32
+ %20 = spirv.CL.sqrt %arg0 : f32
+ // CHECK: llvm.intr.trunc(%{{.*}}) : (f32) -> f32
+ %21 = spirv.CL.trunc %arg0 : f32
+ // CHECK: llvm.intr.sin(%{{.*}}) : (vector<3xf32>) -> vector<3xf32>
+ %22 = spirv.CL.sin %arg1 : vector<3xf32>
+ spirv.Return
+}
+
+//===----------------------------------------------------------------------===//
+// Binary floating-point OpenCL ops
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @cl_binary_float
+spirv.func @cl_binary_float(%arg0: f32, %arg1: f32) "None" {
+ // CHECK: llvm.intr.pow(%{{.*}}, %{{.*}}) : (f32, f32) -> f32
+ %0 = spirv.CL.pow %arg0, %arg1 : f32
+ // CHECK: llvm.intr.atan2(%{{.*}}, %{{.*}}) : (f32, f32) -> f32
+ %1 = spirv.CL.atan2 %arg0, %arg1 : f32
+ // CHECK: llvm.intr.maxnum(%{{.*}}, %{{.*}}) : (f32, f32) -> f32
+ %2 = spirv.CL.fmax %arg0, %arg1 : f32
+ // CHECK: llvm.intr.minnum(%{{.*}}, %{{.*}}) : (f32, f32) -> f32
+ %3 = spirv.CL.fmin %arg0, %arg1 : f32
+ spirv.Return
+}
+
+//===----------------------------------------------------------------------===//
+// Ternary and integer OpenCL ops
----------------
aobolensk wrote:
Split now. Well, there is just one ternary op and several integer ones, no I initially haven't separated them
https://github.com/llvm/llvm-project/pull/202506
More information about the Mlir-commits
mailing list