@@ -944,27 +944,24 @@ void OCLToSPIRVBase::visitCallReadImageWithSampler(CallInst *CI,
944944 assert (CI->getCalledFunction () && " Unexpected indirect call" );
945945 Function *Func = CI->getCalledFunction ();
946946 bool IsRetScalar = !CI->getType ()->isVectorTy ();
947- SmallVector<Type *, 3 > ArgStructTys;
948- getParameterTypes (CI, ArgStructTys);
949947 Type *Ret = CI->getType ();
950- auto *ImageTy = OCLTypeToSPIRVPtr->getAdaptedArgumentType (Func, 0 ). second ;
948+ auto *ImageTy = OCLTypeToSPIRVPtr->getAdaptedArgumentType (Func, 0 );
951949 if (!ImageTy)
952- ImageTy = ArgStructTys[0 ];
953- ImageTy = adaptSPIRVImageType (M, ImageTy);
954- auto *SampledImgStructTy = getSPIRVStructTypeByChangeBaseTypeName (
955- M, ImageTy, kSPIRVTypeName ::Image, kSPIRVTypeName ::SampledImg);
956- auto *SampledImgTy = PointerType::get (SampledImgStructTy, SPIRAS_Global);
957- Value *SampledImgArgs[] = {CI->getArgOperand (0 ), CI->getArgOperand (1 )};
958- auto *SampledImg = addCallInstSPIRV (M, getSPIRVFuncName (OpSampledImage),
959- SampledImgTy, SampledImgArgs, nullptr ,
960- {ArgStructTys[0 ], ArgStructTys[1 ]}, CI,
961- kSPIRVName ::TempSampledImage);
950+ ImageTy = getCallValueType (CI, 0 );
962951
963952 auto Mutator = mutateCallInst (
964953 CI, getSPIRVFuncName (OpImageSampleExplicitLod,
965954 std::string (kSPIRVPostfix ::ExtDivider) +
966955 getPostfixForReturnType (Ret)));
967- Mutator.replaceArg (0 , {SampledImg, SampledImgStructTy}).removeArg (1 );
956+ Mutator.mapArg (0 , [&](IRBuilder<> &Builder, Value *ImgArg, Type *ImgType) {
957+ auto *SampledImgTy = adjustImageType (ImageTy, kSPIRVTypeName ::Image,
958+ kSPIRVTypeName ::SampledImg);
959+ Value *SampledImgArgs[] = {CI->getArgOperand (0 ), CI->getArgOperand (1 )};
960+ return addSPIRVCallPair (Builder, OpSampledImage, SampledImgTy,
961+ SampledImgArgs, {ImgType, Mutator.getType (1 )},
962+ kSPIRVName ::TempSampledImage);
963+ });
964+ Mutator.removeArg (1 );
968965 unsigned ImgOpMask = getImageSignZeroExt (DemangledName);
969966 unsigned ImgOpMaskInsIndex = Mutator.arg_size ();
970967 switch (Mutator.arg_size ()) {
@@ -997,15 +994,7 @@ void OCLToSPIRVBase::visitCallReadImageWithSampler(CallInst *CI,
997994
998995void OCLToSPIRVBase::visitCallGetImageSize (CallInst *CI,
999996 StringRef DemangledName) {
1000- StringRef TyName;
1001- SmallVector<StringRef, 4 > SubStrs;
1002- SmallVector<Type *, 4 > ParamTys;
1003- getParameterTypes (CI, ParamTys);
1004- auto IsImg = isOCLImageStructType (ParamTys[0 ], &TyName);
1005- (void )IsImg;
1006- assert (IsImg);
1007- std::string ImageTyName = getImageBaseTypeName (TyName);
1008- auto Desc = map<SPIRVTypeImageDescriptor>(ImageTyName);
997+ auto Desc = getImageDescriptor (getCallValueType (CI, 0 ));
1009998 unsigned Dim = getImageDimension (Desc.Dim ) + Desc.Arrayed ;
1010999 assert (Dim > 0 && " Invalid image dimension." );
10111000 assert (CI->arg_size () == 1 );
@@ -1131,8 +1120,10 @@ void OCLToSPIRVBase::visitCallToAddr(CallInst *CI, StringRef DemangledName) {
11311120 Mutator
11321121 .mapArg (Mutator.arg_size () - 1 ,
11331122 [&](Value *V) {
1134- return std::pair<Value *, Type *>(
1135- castToInt8Ptr (V, CI), Type::getInt8Ty (V->getContext ()));
1123+ return std::make_pair (
1124+ castToInt8Ptr (V, CI),
1125+ TypedPointerType::get (Type::getInt8Ty (V->getContext ()),
1126+ SPIRAS_Generic));
11361127 })
11371128 .appendArg (StorageClass);
11381129 };
@@ -1497,9 +1488,7 @@ void OCLToSPIRVBase::processSubgroupBlockReadWriteINTEL(
14971488// reads and vector block reads.
14981489void OCLToSPIRVBase::visitSubgroupBlockReadINTEL (CallInst *CI) {
14991490 OCLBuiltinTransInfo Info;
1500- SmallVector<Type *, 2 > ParamTys;
1501- getParameterTypes (CI, ParamTys);
1502- if (isOCLImageStructType (ParamTys[0 ]))
1491+ if (isOCLImageType (getCallValueType (CI, 0 )))
15031492 Info.UniqName = getSPIRVFuncName (spv::OpSubgroupImageBlockReadINTEL);
15041493 else
15051494 Info.UniqName = getSPIRVFuncName (spv::OpSubgroupBlockReadINTEL);
@@ -1512,9 +1501,7 @@ void OCLToSPIRVBase::visitSubgroupBlockReadINTEL(CallInst *CI) {
15121501// instructions.
15131502void OCLToSPIRVBase::visitSubgroupBlockWriteINTEL (CallInst *CI) {
15141503 OCLBuiltinTransInfo Info;
1515- SmallVector<Type *, 3 > ParamTys;
1516- getParameterTypes (CI, ParamTys);
1517- if (isOCLImageStructType (ParamTys[0 ]))
1504+ if (isOCLImageType (getCallValueType (CI, 0 )))
15181505 Info.UniqName = getSPIRVFuncName (spv::OpSubgroupImageBlockWriteINTEL);
15191506 else
15201507 Info.UniqName = getSPIRVFuncName (spv::OpSubgroupBlockWriteINTEL);
@@ -1614,7 +1601,7 @@ void OCLToSPIRVBase::visitSubgroupAVCWrapperBuiltinCall(
16141601 std::string MCETName =
16151602 std::string (kOCLSubgroupsAVCIntel ::TypePrefix) + " mce_" + TyKind + " _t" ;
16161603 auto *MCESTy = getSubgroupAVCIntelMCEType (M, MCETName);
1617- auto *MCETy = PointerType ::get (MCESTy, SPIRAS_Private);
1604+ auto *MCETy = TypedPointerType ::get (MCESTy, SPIRAS_Private);
16181605 std::string ToMCEFName = Prefix + OpKind + " _convert_to_mce_" + TyKind;
16191606 Op ToMCEOC = OpNop;
16201607 OCLSPIRVSubgroupAVCIntelBuiltinMap::find (ToMCEFName, &ToMCEOC);
@@ -1631,28 +1618,24 @@ void OCLToSPIRVBase::visitSubgroupAVCWrapperBuiltinCall(
16311618
16321619 mutateCallInst (CI, WrappedOC)
16331620 .mapArg (CI->arg_size () - 1 ,
1634- [&](Value *Arg, Type *ParamTy) {
1621+ [&](IRBuilder<> &Builder, Value *Arg, Type *ParamTy) {
16351622 // Create conversion function call for the last operand
1636- return std::pair<Value *, Type *>(
1637- addCallInstSPIRV (M, getSPIRVFuncName (ToMCEOC), MCETy, Arg,
1638- nullptr , {ParamTy}, CI, " " ),
1639- MCESTy);
1623+ return addSPIRVCallPair (Builder, ToMCEOC, MCETy, {Arg},
1624+ {ParamTy});
16401625 })
1641- .changeReturnType (MCETy, [= ](IRBuilder<> &, CallInst *NewCI) {
1626+ .changeReturnType (MCETy, [& ](IRBuilder<> &Builder , CallInst *NewCI) {
16421627 // Create conversion function call for the return result
1643- return addCallInstSPIRV (M, getSPIRVFuncName ( FromMCEOC) , CI->getType (),
1644- NewCI, nullptr , {MCESTy}, CI, " " );
1628+ return addSPIRVCall (Builder, FromMCEOC, CI->getType (), {NewCI} ,
1629+ {MCETy} );
16451630 });
16461631 } else {
16471632 // Wrapper built-ins which take the 'result_t' argument requires only one
16481633 // conversion for the argument
16491634 mutateCallInst (CI, WrappedOC)
1650- .mapArg (CI->arg_size () - 1 , [&](Value *Arg, Type *ParamTy) {
1635+ .mapArg (CI->arg_size () - 1 , [&](IRBuilder<> &Builder, Value *Arg,
1636+ Type *ParamTy) {
16511637 // Create conversion function call for the last operand
1652- return std::pair<Value *, Type *>(
1653- addCallInstSPIRV (M, getSPIRVFuncName (ToMCEOC), MCETy, Arg,
1654- nullptr , {ParamTy}, CI, " " ),
1655- MCESTy);
1638+ return addSPIRVCallPair (Builder, ToMCEOC, MCETy, {Arg}, {ParamTy});
16561639 });
16571640 }
16581641}
@@ -1676,9 +1659,8 @@ void OCLToSPIRVBase::visitSubgroupAVCBuiltinCallWithSampler(
16761659 return ; // this is not a VME built-in
16771660
16781661 SmallVector<Type *, 4 > ParamTys;
1679- getParameterTypes (CI, ParamTys);
1680- auto *TyIt =
1681- std::find_if (ParamTys.begin (), ParamTys.end (), isSamplerStructTy);
1662+ getParameterTypes (CI->getCalledFunction (), ParamTys);
1663+ auto *TyIt = std::find_if (ParamTys.begin (), ParamTys.end (), isSamplerTy);
16821664 assert (TyIt != ParamTys.end () && " Invalid Subgroup AVC Intel built-in call" );
16831665 unsigned SamplerIndex = TyIt - ParamTys.begin ();
16841666 Value *SamplerVal = CI->getOperand (SamplerIndex);
@@ -1687,30 +1669,24 @@ void OCLToSPIRVBase::visitSubgroupAVCBuiltinCallWithSampler(
16871669 SmallVector<Type *, 4 > AdaptedTys;
16881670 for (unsigned I = 0 ; I < CI->arg_size (); I++)
16891671 AdaptedTys.push_back (
1690- OCLTypeToSPIRVPtr->getAdaptedArgumentType (CI->getCalledFunction (), I)
1691- .second );
1672+ OCLTypeToSPIRVPtr->getAdaptedArgumentType (CI->getCalledFunction (), I));
16921673 auto *AdaptedIter = AdaptedTys.begin ();
16931674
16941675 mutateCallInst (CI, OC)
1695- .mapArgs ([&](Value *Arg, Type *PointerTy ) {
1696- if (!isOCLImageStructType (PointerTy ))
1697- return std::make_pair (Arg, PointerTy );
1676+ .mapArgs ([&](IRBuilder<> &Builder, Value *Arg, Type *ArgTy ) {
1677+ if (!isOCLImageType (ArgTy ))
1678+ return BuiltinCallMutator::ValueTypePair (Arg, ArgTy );
16981679
16991680 auto *ImageTy = *AdaptedIter++;
17001681 if (!ImageTy)
1701- ImageTy = PointerTy;
1702- ImageTy = adaptSPIRVImageType (M, ImageTy);
1703- auto *SampledImgStructTy = getSPIRVStructTypeByChangeBaseTypeName (
1704- M, ImageTy, kSPIRVTypeName ::Image, kSPIRVTypeName ::VmeImageINTEL);
1705- auto *SampledImgTy =
1706- PointerType::get (SampledImgStructTy, SPIRAS_Global);
1682+ ImageTy = ArgTy;
1683+ auto *SampledImgTy = adjustImageType (ImageTy, kSPIRVTypeName ::Image,
1684+ kSPIRVTypeName ::VmeImageINTEL);
17071685
17081686 Value *SampledImgArgs[] = {Arg, SamplerVal};
1709- return std::pair<Value *, Type *>(
1710- addCallInstSPIRV (M, getSPIRVFuncName (OpVmeImageINTEL), SampledImgTy,
1711- SampledImgArgs, nullptr , {PointerTy, SamplerTy},
1712- CI, kSPIRVName ::TempSampledImage),
1713- SampledImgStructTy);
1687+ return addSPIRVCallPair (Builder, OpVmeImageINTEL, SampledImgTy,
1688+ SampledImgArgs, {ArgTy, SamplerTy},
1689+ kSPIRVName ::TempSampledImage);
17141690 })
17151691 .removeArg (SamplerIndex);
17161692}
0 commit comments