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

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 12 03:49:09 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>



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


2 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+6-5) 
- (modified) llvm/test/CodeGen/SPIRV/llvm-intrinsics/sincos-opencl.ll (+11) 


``````````diff
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>)

``````````

</details>


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


More information about the llvm-commits mailing list