[llvm] [SPIR-V] Avoid dead OpLoad for unused cosine result in llvm.sincos lowering (PR #215773)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 12 03:48:29 PDT 2026


https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/215773

None

>From a536d7ce266b9ab3934b8746e42d816defb4c171 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 12 Aug 2026 12:47:56 +0200
Subject: [PATCH] [SPIR-V] Avoid dead OpLoad for unused cosine result in
 llvm.sincos lowering

---
 llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp    | 11 ++++++-----
 .../CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll    | 11 +++++++++++
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index a13775f9d02ad..61c09c7fd0500 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -1668,11 +1668,12 @@ bool SPIRVInstructionSelector::selectSincos(Register ResVReg,
         .add(I.getOperand(SrcIdx))
         .addUse(PointerVReg)
         .constrainAllUses(TII, TRI, RBI);
-    BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpLoad))
-        .addDef(CosResVReg)
-        .addUse(ResTypeReg)
-        .addUse(PointerVReg)
-        .constrainAllUses(TII, TRI, RBI);
+    if (!MRI->use_nodbg_empty(CosResVReg))
+      BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpLoad))
+          .addDef(CosResVReg)
+          .addUse(ResTypeReg)
+          .addUse(PointerVReg)
+          .constrainAllUses(TII, TRI, RBI);
     return true;
   } else if (STI.canUseExtInstSet(SPIRV::InstructionSet::GLSL_std_450)) {
     // GLSL.std.450 has no combined sincos; emit separate Sin and Cos.
diff --git a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll
index 73f4df7a32e4b..0ea18817aa756 100644
--- a/llvm/test/CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll
+++ b/llvm/test/CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll
@@ -38,5 +38,16 @@ define <2 x float> @test_sincos_vec2(<2 x float> %x) {
   ret <2 x float> %sum
 }
 
+; CHECK: %[[#XoParam:]] = OpFunctionParameter %[[#FloatTy]]
+; CHECK-NOT: OpLoad
+; CHECK: %[[#SinOnlyRes:]] = OpExtInst %[[#FloatTy]] %[[#ExtInstId]] sincos %[[#XoParam]] %[[#]]
+; CHECK-NOT: OpLoad
+; CHECK: OpReturnValue %[[#SinOnlyRes]]
+define float @test_sincos_sin_only(float %x) {
+  %result = call { float, float } @llvm.sincos.f32(float %x)
+  %sin = extractvalue { float, float } %result, 0
+  ret float %sin
+}
+
 declare { float, float } @llvm.sincos.f32(float)
 declare { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float>)



More information about the llvm-commits mailing list