[Mlir-commits] [mlir] [mlir][SPIR-V] Add SPIRVToLLVM conversion for CL.sincos (PR #237742)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Sun Nov 1 07:41:08 PST 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/237742.diff


2 Files Affected:

- (modified) mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp (+27) 
- (modified) mlir/test/Conversion/SPIRVToLLVM/cl-ops-to-llvm.mlir (+23) 


``````````diff
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
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/237742


More information about the Mlir-commits mailing list