[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