[llvm] [SPIR-V] Add SPV_INTEL_bfloat16_arithmetic for Opencl.std instructions with bfloat16 type (PR #205128)
Qi Ye via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 2 07:29:17 PDT 2026
================
@@ -1660,8 +1667,38 @@ void addInstrRequirements(const MachineInstr &MI,
addPrintfRequirements(MI, Reqs, ST);
break;
}
- // TODO: handle bfloat16 extended instructions when
- // SPV_INTEL_bfloat16_arithmetic is enabled.
+ if (MI.getOperand(2).getImm() ==
+ static_cast<int64_t>(SPIRV::InstructionSet::OpenCL_std)) {
+ const MachineFunction *MF = MI.getMF();
+ const MachineRegisterInfo &MRI = MF->getRegInfo();
+ SPIRVGlobalRegistry *GR = ST.getSPIRVGlobalRegistry();
+
+ auto IsBFloat16 = [&](SPIRVTypeInst TypeDef) {
+ if (TypeDef && TypeDef->getOpcode() == SPIRV::OpTypeVector)
+ TypeDef = MRI.getVRegDef(TypeDef->getOperand(1).getReg());
+ return isBFloat16Type(TypeDef);
+ };
+
+ // Result type is operand 1; arguments start at operand 4.
+ bool UsesBFloat16 = IsBFloat16(MRI.getVRegDef(MI.getOperand(1).getReg()));
+ for (unsigned I = 4, E = MI.getNumOperands(); I < E && !UsesBFloat16;
+ ++I) {
+ const MachineOperand &MO = MI.getOperand(I);
+ if (MO.isReg())
+ UsesBFloat16 = IsBFloat16(GR->getResultType(
+ MO.getReg(), const_cast<MachineFunction *>(MF)));
+ }
+
+ if (UsesBFloat16) {
+ if (!ST.canUseExtension(
+ SPIRV::Extension::SPV_INTEL_bfloat16_arithmetic))
+ reportUnsupported(
+ MI, "OpenCL Extended instructions with bfloat16 require the "
+ "following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic");
----------------
Qi-Ye-079 wrote:
Done.
https://github.com/llvm/llvm-project/pull/205128
More information about the llvm-commits
mailing list