@@ -765,6 +765,19 @@ 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 () > 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
+
768
781
// TODO: Handle unsigned integer return type. May need spec change.
769
782
void SPIRVToOCLBase::visitCallSPIRVImageSampleExplicitLodBuiltIn (CallInst *CI,
770
783
Op OC) {
@@ -787,16 +800,7 @@ void SPIRVToOCLBase::visitCallSPIRVImageSampleExplicitLodBuiltIn(CallInst *CI,
787
800
auto Sampler = CallSampledImg->getArgOperand (1 );
788
801
Args[0 ] = Img;
789
802
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);
800
804
if (CallSampledImg->hasOneUse ()) {
801
805
CallSampledImg->replaceAllUsesWith (
802
806
UndefValue::get (CallSampledImg->getType ()));
@@ -831,17 +835,9 @@ void SPIRVToOCLBase::visitCallSPIRVImageWriteBuiltIn(CallInst *CI, Op OC) {
831
835
M, CI,
832
836
[=](CallInst *, std::vector<Value *> &Args) {
833
837
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 ]);
845
841
}
846
842
return std::string (kOCLBuiltinName ::WriteImage) + getTypeSuffix (T);
847
843
},
0 commit comments