[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