[llvm] [SPIR-V] Convert integer vector to bool vector for OpAny/OpAll (PR #191804)
Juan Manuel Martinez CaamaƱo via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 14 01:48:27 PDT 2026
================
@@ -1320,12 +1320,37 @@ static bool generateRelationalInst(const SPIRV::IncomingCall *Call,
std::tie(CompareRegister, RelationType) =
buildBoolRegister(MIRBuilder, Call->ReturnType, GR);
+ // OpAny/OpAll require a boolean vector input, but OpenCL any()/all()
+ // builtins receive integer vectors. Convert via OpINotEqual against zero.
+ SmallVector<Register> Arguments(Call->Arguments.begin(),
+ Call->Arguments.end());
+ if ((Opcode == SPIRV::OpAny || Opcode == SPIRV::OpAll) &&
+ !GR->isScalarOrVectorOfType(Arguments[0], SPIRV::OpTypeBool)) {
+ SPIRVTypeInst ArgType = GR->getSPIRVTypeForVReg(Arguments[0]);
+ unsigned NumElts = ArgType->getOperand(2).getImm();
+ SPIRVTypeInst BoolVecTy = GR->getOrCreateSPIRVVectorType(
+ GR->getOrCreateSPIRVBoolType(MIRBuilder, true), NumElts, MIRBuilder,
+ true);
+ const auto &TII =
+ *cast<SPIRVSubtarget>(MIRBuilder.getMF().getSubtarget()).getInstrInfo();
+ Register ZeroReg = GR->getOrCreateConstVector(
+ uint64_t(0), *MIRBuilder.getMRI()->getVRegDef(Arguments[0]), ArgType,
----------------
jmmartinez wrote:
Instead of `MIRBuilder.getMRI()->getVRegDef(Arguments[0])` would something simpler work, like `Call` ? AFAIK, in this code path, this is only going to be used to get the `MachineFunction` and its entry block (I may be wrong).
https://github.com/llvm/llvm-project/pull/191804
More information about the llvm-commits
mailing list