[Mlir-commits] [mlir] [mlir][SPIR-V] Model OpenCL sincos memory effects (PR #232017)
Alexander Shaposhnikov
llvmlistbot at llvm.org
Wed Oct 14 10:56:17 PDT 2026
https://github.com/alexander-shaposhnikov created https://github.com/llvm/llvm-project/pull/232017
Address comments on https://github.com/llvm/llvm-project/pull/231713.
Mark the cosval operand of spirv.CL.sincos with MemWrite so memory-effect analysis can identify the destination of its cosine write.
Use llvm::is_contained to check the allowed cosval storage classes. Add a canonicalization test that preserves sincos when its sine result is unused, ensuring the cosine write is retained.
>From bc7e69a90f0c8a22182e3f1bdb1e4497e2821708 Mon Sep 17 00:00:00 2001
From: Alexander Shaposhnikov <alexander.v.shaposhnikov at gmail.com>
Date: Wed, 14 Oct 2026 10:54:58 -0700
Subject: [PATCH] [mlir][SPIR-V] Model OpenCL sincos memory effects
Mark the cosval operand of spirv.CL.sincos with MemWrite so memory-effect
analysis can identify the destination of its cosine write.
Use llvm::is_contained to check the allowed cosval storage classes. Add a
canonicalization test that preserves sincos when its sine result is unused,
ensuring the cosine write is retained.
---
mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td | 2 +-
mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp | 8 ++++----
mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir | 11 +++++++++++
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
index 4b13c8d2d17d46..0f42cf141c811b 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVCLOps.td
@@ -1296,7 +1296,7 @@ def SPIRV_CLSincosOp : SPIRV_CLOp<"sincos", 58, [
let arguments = (ins
SPIRV_ScalarOrVectorOf<SPIRV_Float>:$x,
- SPIRV_AnyPtr:$cosval
+ Arg<SPIRV_AnyPtr, "", [MemWrite]>:$cosval
);
let results = (outs
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
index 5204e369971096..35cb37a67f530a 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
@@ -2298,10 +2298,10 @@ LogicalResult spirv::CLRootnOp::verify() {
LogicalResult spirv::CLSincosOp::verify() {
auto storageClass =
cast<spirv::PointerType>(getCosval().getType()).getStorageClass();
- if (storageClass != spirv::StorageClass::CrossWorkgroup &&
- storageClass != spirv::StorageClass::Workgroup &&
- storageClass != spirv::StorageClass::Function &&
- storageClass != spirv::StorageClass::Generic)
+ if (!llvm::is_contained(
+ {spirv::StorageClass::CrossWorkgroup, spirv::StorageClass::Workgroup,
+ spirv::StorageClass::Function, spirv::StorageClass::Generic},
+ storageClass))
return emitOpError("cosval must point to CrossWorkgroup, Workgroup, "
"Function, or Generic storage");
return success();
diff --git a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
index 94761086a3f404..8ff9288f917bc6 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/canonicalize.mlir
@@ -2558,3 +2558,14 @@ func.func @cannot_canonicalize_selection_op_4(%cond: i1) -> () {
}
spirv.Return
}
+
+// -----
+
+// CHECK-LABEL: func.func @sincos_unused_result(
+// CHECK-SAME: %[[X:.*]]: f32, %[[COSVAL:.*]]: !spirv.ptr<f32, Function>
+func.func @sincos_unused_result(%x: f32, %cosval: !spirv.ptr<f32, Function>) {
+ // CHECK: spirv.CL.sincos %[[X]], %[[COSVAL]]
+ // CHECK-NEXT: return
+ %sin = spirv.CL.sincos %x, %cosval : f32, !spirv.ptr<f32, Function> -> f32
+ return
+}
More information about the Mlir-commits
mailing list