[llvm] [SPIR-V] Add lowering for G_FSINCOS (PR #179053)
Steven Perron via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 3 07:24:53 PST 2026
================
@@ -1409,6 +1413,62 @@ bool SPIRVInstructionSelector::selectFrexp(Register ResVReg,
return false;
}
+bool SPIRVInstructionSelector::selectSincos(Register ResVReg,
+ const SPIRVType *ResType,
+ MachineInstr &I) const {
+ Register CosResVReg = I.getOperand(1).getReg();
+ unsigned SrcIdx = I.getNumExplicitDefs();
+ Register ResTypeReg = GR.getSPIRVTypeID(ResType);
+
+ if (STI.canUseExtInstSet(SPIRV::InstructionSet::OpenCL_std)) {
+ // OpenCL.std sincos(x, cosval*) -> returns sin(x), writes cos(x) to ptr.
+ MachineIRBuilder MIRBuilder(I);
+ const SPIRVType *PointerType = GR.getOrCreateSPIRVPointerType(
+ ResType, MIRBuilder, SPIRV::StorageClass::Function);
+ Register PointerVReg =
+ createVirtualRegister(PointerType, &GR, MRI, MRI->getMF());
+
+ auto It = getOpVariableMBBIt(I);
+ BuildMI(*It->getParent(), It, It->getDebugLoc(), TII.get(SPIRV::OpVariable))
+ .addDef(PointerVReg)
+ .addUse(GR.getSPIRVTypeID(PointerType))
+ .addImm(static_cast<uint32_t>(SPIRV::StorageClass::Function))
+ .constrainAllUses(TII, TRI, RBI);
+ BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpExtInst))
+ .addDef(ResVReg)
+ .addUse(ResTypeReg)
+ .addImm(static_cast<uint32_t>(SPIRV::InstructionSet::OpenCL_std))
+ .addImm(CL::sincos)
+ .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);
+ return true;
----------------
s-perron wrote:
If the `constrainAllUses` returns fails in any of the instructions above we should return false. I'm not sure how that happens, but it seems like good practice.
https://github.com/llvm/llvm-project/pull/179053
More information about the llvm-commits
mailing list