@@ -765,21 +765,22 @@ static char getTypeSuffix(Type *T) {
765
765
return Suffix;
766
766
}
767
767
768
- void SPIRVToOCLBase::mutateArgsForImageOperands (std::vector<Value *> &Args) {
769
- if (Args.size () > 3 ) {
770
- ConstantInt *ImOp = dyn_cast<ConstantInt>(Args[3 ]);
768
+ void SPIRVToOCLBase::mutateArgsForImageOperands (std::vector<Value *> &Args,
769
+ unsigned ImOpArgIndex) {
770
+ if (Args.size () > ImOpArgIndex) {
771
+ ConstantInt *ImOp = dyn_cast<ConstantInt>(Args[ImOpArgIndex]);
771
772
uint64_t ImOpValue = 0 ;
772
773
if (ImOp)
773
774
ImOpValue = ImOp->getZExtValue ();
774
775
// Drop "Image Operands" argument.
775
- Args.erase (Args.begin () + 3 , Args. begin () + 4 );
776
+ Args.erase (Args.begin () + ImOpArgIndex );
776
777
777
- if (Args.size () > 3 ) {
778
- ConstantFP *LodVal = dyn_cast<ConstantFP>(Args[3 ]);
778
+ if (Args.size () > ImOpArgIndex ) {
779
+ ConstantFP *LodVal = dyn_cast<ConstantFP>(Args[ImOpArgIndex ]);
779
780
// If the image operand is LOD and its value is zero, drop it too.
780
781
if (LodVal && LodVal->isNullValue () &&
781
782
ImOpValue == ImageOperandsMask::ImageOperandsLodMask)
782
- Args.erase (Args.begin () + 3 , Args.end ());
783
+ Args.erase (Args.begin () + ImOpArgIndex , Args.end ());
783
784
}
784
785
}
785
786
}
@@ -806,7 +807,7 @@ void SPIRVToOCLBase::visitCallSPIRVImageSampleExplicitLodBuiltIn(CallInst *CI,
806
807
auto Sampler = CallSampledImg->getArgOperand (1 );
807
808
Args[0 ] = Img;
808
809
Args.insert (Args.begin () + 1 , Sampler);
809
- mutateArgsForImageOperands (Args);
810
+ mutateArgsForImageOperands (Args, 3 );
810
811
if (CallSampledImg->hasOneUse ()) {
811
812
CallSampledImg->replaceAllUsesWith (
812
813
UndefValue::get (CallSampledImg->getType ()));
@@ -841,7 +842,7 @@ void SPIRVToOCLBase::visitCallSPIRVImageWriteBuiltIn(CallInst *CI, Op OC) {
841
842
M, CI,
842
843
[=](CallInst *, std::vector<Value *> &Args) {
843
844
llvm::Type *T = Args[2 ]->getType ();
844
- mutateArgsForImageOperands (Args);
845
+ mutateArgsForImageOperands (Args, 3 );
845
846
if (Args.size () > 3 ) {
846
847
std::swap (Args[2 ], Args[3 ]);
847
848
}
@@ -856,10 +857,7 @@ void SPIRVToOCLBase::visitCallSPIRVImageReadBuiltIn(CallInst *CI, Op OC) {
856
857
mutateCallInstOCL (
857
858
M, CI,
858
859
[=](CallInst *, std::vector<Value *> &Args) {
859
- // Drop "Image operands" argument
860
- if (Args.size () > 2 )
861
- Args.erase (Args.begin () + 2 );
862
-
860
+ mutateArgsForImageOperands (Args, 2 );
863
861
llvm::Type *T = CI->getType ();
864
862
return std::string (kOCLBuiltinName ::ReadImage) + getTypeSuffix (T);
865
863
},
0 commit comments