Skip to content

Commit efec551

Browse files
svenvhdwoodwor-intel
authored andcommitted
Factor out mutateArgsForImageOperands
Original commit: KhronosGroup/SPIRV-LLVM-Translator@2892a1e
1 parent 1374ae8 commit efec551

File tree

2 files changed

+20
-21
lines changed

2 files changed

+20
-21
lines changed

llvm-spirv/lib/SPIRV/SPIRVToOCL.cpp

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,19 @@ static char getTypeSuffix(Type *T) {
765765
return Suffix;
766766
}
767767

768+
void SPIRVToOCLBase::mutateArgsForImageOperands(std::vector<Value *> &Args) {
769+
if (Args.size() > 4) {
770+
ConstantInt *ImOp = dyn_cast<ConstantInt>(Args[3]);
771+
ConstantFP *LodVal = dyn_cast<ConstantFP>(Args[4]);
772+
// Drop "Image Operands" argument.
773+
Args.erase(Args.begin() + 3, Args.begin() + 4);
774+
// If the image operand is LOD and its value is zero, drop it too.
775+
if (ImOp && LodVal && LodVal->isNullValue() &&
776+
ImOp->getZExtValue() == ImageOperandsMask::ImageOperandsLodMask)
777+
Args.erase(Args.begin() + 3, Args.end());
778+
}
779+
}
780+
768781
// TODO: Handle unsigned integer return type. May need spec change.
769782
void SPIRVToOCLBase::visitCallSPIRVImageSampleExplicitLodBuiltIn(CallInst *CI,
770783
Op OC) {
@@ -787,16 +800,7 @@ void SPIRVToOCLBase::visitCallSPIRVImageSampleExplicitLodBuiltIn(CallInst *CI,
787800
auto Sampler = CallSampledImg->getArgOperand(1);
788801
Args[0] = Img;
789802
Args.insert(Args.begin() + 1, Sampler);
790-
if (Args.size() > 4) {
791-
ConstantInt *ImOp = dyn_cast<ConstantInt>(Args[3]);
792-
ConstantFP *LodVal = dyn_cast<ConstantFP>(Args[4]);
793-
// Drop "Image Operands" argument.
794-
Args.erase(Args.begin() + 3, Args.begin() + 4);
795-
// If the image operand is LOD and its value is zero, drop it too.
796-
if (ImOp && LodVal && LodVal->isNullValue() &&
797-
ImOp->getZExtValue() == ImageOperandsMask::ImageOperandsLodMask)
798-
Args.erase(Args.begin() + 3, Args.end());
799-
}
803+
mutateArgsForImageOperands(Args);
800804
if (CallSampledImg->hasOneUse()) {
801805
CallSampledImg->replaceAllUsesWith(
802806
UndefValue::get(CallSampledImg->getType()));
@@ -831,17 +835,9 @@ void SPIRVToOCLBase::visitCallSPIRVImageWriteBuiltIn(CallInst *CI, Op OC) {
831835
M, CI,
832836
[=](CallInst *, std::vector<Value *> &Args) {
833837
llvm::Type *T = Args[2]->getType();
834-
if (Args.size() > 4) {
835-
ConstantInt *ImOp = dyn_cast<ConstantInt>(Args[3]);
836-
ConstantFP *LodVal = dyn_cast<ConstantFP>(Args[4]);
837-
// Drop "Image Operands" argument.
838-
Args.erase(Args.begin() + 3, Args.begin() + 4);
839-
// If the image operand is LOD and its value is zero, drop it too.
840-
if (ImOp && LodVal && LodVal->isNullValue() &&
841-
ImOp->getZExtValue() == ImageOperandsMask::ImageOperandsLodMask)
842-
Args.erase(Args.begin() + 3, Args.end());
843-
else
844-
std::swap(Args[2], Args[3]);
838+
mutateArgsForImageOperands(Args);
839+
if (Args.size() > 3) {
840+
std::swap(Args[2], Args[3]);
845841
}
846842
return std::string(kOCLBuiltinName::WriteImage) + getTypeSuffix(T);
847843
},

llvm-spirv/lib/SPIRV/SPIRVToOCL.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,9 @@ class SPIRVToOCLBase : public InstVisitor<SPIRVToOCLBase> {
272272

273273
std::string translateOpaqueType(StringRef STName);
274274

275+
/// Mutate the argument list based on (optional) image operands.
276+
void mutateArgsForImageOperands(std::vector<Value *> &Args);
277+
275278
protected:
276279
Module *M;
277280
LLVMContext *Ctx;

0 commit comments

Comments
 (0)