[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversion for CL.sincos (PR #237742)
Arseniy Obolenskiy
llvmlistbot at llvm.org
Sun Nov 1 07:40:28 PST 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/237742
None
>From 8dba841935ef26ad52977a44d08147ad4088ae10 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Sun, 1 Nov 2026 16:39:43 +0100
Subject: [PATCH] [mlir][SPIR-V] Add SPIRVToLLVM conversion for CL.sincos
---
.../Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp | 27 +++++++++++++++++++
.../SPIRVToLLVM/cl-ops-to-llvm.mlir | 23 ++++++++++++++++
2 files changed, 50 insertions(+)
diff --git a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
index 4b34bc722b8ee7..a6625da3203093 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
+++ b/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp
@@ -2009,6 +2009,32 @@ class CLMixPattern : public SPIRVToLLVMConversion<spirv::CLMixOp> {
}
};
+/// Converts `spirv.CL.sincos` to `llvm.intr.sincos`, storing the cosine to
+/// `cosval` and returning the sine.
+class CLSincosPattern : public SPIRVToLLVMConversion<spirv::CLSincosOp> {
+public:
+ using SPIRVToLLVMConversion<spirv::CLSincosOp>::SPIRVToLLVMConversion;
+
+ LogicalResult
+ matchAndRewrite(spirv::CLSincosOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ Type dstType = getTypeConverter()->convertType(op.getType());
+ if (!dstType)
+ return rewriter.notifyMatchFailure(op, "type conversion failed");
+
+ Location loc = op.getLoc();
+ auto structType = LLVM::LLVMStructType::getLiteral(rewriter.getContext(),
+ {dstType, dstType});
+ Value sincos =
+ LLVM::SincosOp::create(rewriter, loc, structType, adaptor.getX());
+ Value sin = LLVM::ExtractValueOp::create(rewriter, loc, sincos, 0);
+ Value cos = LLVM::ExtractValueOp::create(rewriter, loc, sincos, 1);
+ LLVM::StoreOp::create(rewriter, loc, cos, adaptor.getCosval());
+ rewriter.replaceOp(op, sin);
+ return success();
+ }
+};
+
// Converts spirv.GL.Radians (scale = pi/180) and spirv.GL.Degrees
// (scale = 180/pi) by multiplying the operand by a compile-time constant.
template <typename SPIRVOp>
@@ -2502,6 +2528,7 @@ void mlir::populateSPIRVToLLVMConversionPatterns(
DirectConversionPattern<spirv::CLSMinOp, LLVM::SMinOp>,
DirectConversionPattern<spirv::CLUMaxOp, LLVM::UMaxOp>,
DirectConversionPattern<spirv::CLUMinOp, LLVM::UMinOp>, CLMixPattern,
+ CLSincosPattern,
// Logical ops
DirectConversionPattern<spirv::LogicalAndOp, LLVM::AndOp>,
diff --git a/mlir/test/Conversion/SPIRVToLLVM/cl-ops-to-llvm.mlir b/mlir/test/Conversion/SPIRVToLLVM/cl-ops-to-llvm.mlir
index e6fed930268d47..50f4eb111c86dd 100644
--- a/mlir/test/Conversion/SPIRVToLLVM/cl-ops-to-llvm.mlir
+++ b/mlir/test/Conversion/SPIRVToLLVM/cl-ops-to-llvm.mlir
@@ -123,3 +123,26 @@ spirv.func @mix_vector(%x: vector<4xf32>, %y: vector<4xf32>, %a: vector<4xf32>)
%0 = spirv.CL.mix %x, %y, %a : vector<4xf32>
spirv.Return
}
+
+//===----------------------------------------------------------------------===//
+// spirv.CL.sincos
+//===----------------------------------------------------------------------===//
+
+// CHECK-LABEL: @sincos_scalar
+spirv.func @sincos_scalar(%x: f32, %p: !spirv.ptr<f32, Function>) "None" {
+ // CHECK: %[[SINCOS:.*]] = llvm.intr.sincos(%{{.*}}) : (f32) -> !llvm.struct<(f32, f32)>
+ // CHECK: %[[SIN:.*]] = llvm.extractvalue %[[SINCOS]][0] : !llvm.struct<(f32, f32)>
+ // CHECK: %[[COS:.*]] = llvm.extractvalue %[[SINCOS]][1] : !llvm.struct<(f32, f32)>
+ // CHECK: llvm.store %[[COS]], %{{.*}} : f32, !llvm.ptr
+ %0 = spirv.CL.sincos %x, %p : f32, !spirv.ptr<f32, Function> -> f32
+ spirv.Return
+}
+
+// CHECK-LABEL: @sincos_vector
+spirv.func @sincos_vector(%x: vector<3xf16>, %p: !spirv.ptr<vector<3xf16>, CrossWorkgroup>) "None" {
+ // CHECK: %[[SINCOS:.*]] = llvm.intr.sincos(%{{.*}}) : (vector<3xf16>) -> !llvm.struct<(vector<3xf16>, vector<3xf16>)>
+ // CHECK: %[[COS:.*]] = llvm.extractvalue %[[SINCOS]][1] : !llvm.struct<(vector<3xf16>, vector<3xf16>)>
+ // CHECK: llvm.store %[[COS]], %{{.*}} : vector<3xf16>, !llvm.ptr
+ %0 = spirv.CL.sincos %x, %p : vector<3xf16>, !spirv.ptr<vector<3xf16>, CrossWorkgroup> -> vector<3xf16>
+ spirv.Return
+}
More information about the Mlir-commits
mailing list