[llvm] [SPIR-V] Fix OpenCL integer dot product lowering (PR #177258)

Juan Manuel Martinez CaamaƱo via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 22 01:00:46 PST 2026


================
@@ -1198,4 +1198,58 @@ getSpirvLinkageTypeFor(const SPIRVSubtarget &ST, const GlobalValue &GV) {
   return SPIRV::LinkageType::Export;
 }
 
+bool generateIntegerDotExpansion(MachineIRBuilder &MIRBuilder, Register ResVReg,
+                                 Register Vec0, Register Vec1,
+                                 SPIRVGlobalRegistry *GR) {
+  // Expand integer dot product to element-wise multiply and sum:
+  //   dot(a, b) = a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]
+  MachineRegisterInfo *MRI = MIRBuilder.getMRI();
+  SPIRVType *VecType = GR->getSPIRVTypeForVReg(Vec0);
+  SPIRVType *ResType = GR->getSPIRVTypeForVReg(ResVReg);
+
+  assert(VecType && VecType->getOpcode() == SPIRV::OpTypeVector &&
+         "Expected vector type for integer dot product");
+  unsigned NumComponents = GR->getScalarOrVectorComponentCount(VecType);
+  assert(NumComponents > 1 && "dot product requires vector of at least 2");
+
+  // Multiply the vectors element-wise.
+  Register TmpVec = MRI->createVirtualRegister(GR->getRegClass(VecType));
+  MIRBuilder.buildInstr(SPIRV::OpIMulV)
+      .addDef(TmpVec)
+      .addUse(GR->getSPIRVTypeID(VecType))
+      .addUse(Vec0)
+      .addUse(Vec1);
+
+  // Extract first element as initial sum.
+  Register Sum = MRI->createVirtualRegister(GR->getRegClass(ResType));
----------------
jmmartinez wrote:

Maybe let's put `GR->getSPIRVTypeID(ResType)` in a temporary since it's reused quite a lot.

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


More information about the llvm-commits mailing list