@@ -944,27 +944,24 @@ void OCLToSPIRVBase::visitCallReadImageWithSampler(CallInst *CI,
944
944
assert (CI->getCalledFunction () && " Unexpected indirect call" );
945
945
Function *Func = CI->getCalledFunction ();
946
946
bool IsRetScalar = !CI->getType ()->isVectorTy ();
947
- SmallVector<Type *, 3 > ArgStructTys;
948
- getParameterTypes (CI, ArgStructTys);
949
947
Type *Ret = CI->getType ();
950
- auto *ImageTy = OCLTypeToSPIRVPtr->getAdaptedArgumentType (Func, 0 ). second ;
948
+ auto *ImageTy = OCLTypeToSPIRVPtr->getAdaptedArgumentType (Func, 0 );
951
949
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 );
962
951
963
952
auto Mutator = mutateCallInst (
964
953
CI, getSPIRVFuncName (OpImageSampleExplicitLod,
965
954
std::string (kSPIRVPostfix ::ExtDivider) +
966
955
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 );
968
965
unsigned ImgOpMask = getImageSignZeroExt (DemangledName);
969
966
unsigned ImgOpMaskInsIndex = Mutator.arg_size ();
970
967
switch (Mutator.arg_size ()) {
@@ -997,15 +994,7 @@ void OCLToSPIRVBase::visitCallReadImageWithSampler(CallInst *CI,
997
994
998
995
void OCLToSPIRVBase::visitCallGetImageSize (CallInst *CI,
999
996
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 ));
1009
998
unsigned Dim = getImageDimension (Desc.Dim ) + Desc.Arrayed ;
1010
999
assert (Dim > 0 && " Invalid image dimension." );
1011
1000
assert (CI->arg_size () == 1 );
@@ -1131,8 +1120,10 @@ void OCLToSPIRVBase::visitCallToAddr(CallInst *CI, StringRef DemangledName) {
1131
1120
Mutator
1132
1121
.mapArg (Mutator.arg_size () - 1 ,
1133
1122
[&](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));
1136
1127
})
1137
1128
.appendArg (StorageClass);
1138
1129
};
@@ -1497,9 +1488,7 @@ void OCLToSPIRVBase::processSubgroupBlockReadWriteINTEL(
1497
1488
// reads and vector block reads.
1498
1489
void OCLToSPIRVBase::visitSubgroupBlockReadINTEL (CallInst *CI) {
1499
1490
OCLBuiltinTransInfo Info;
1500
- SmallVector<Type *, 2 > ParamTys;
1501
- getParameterTypes (CI, ParamTys);
1502
- if (isOCLImageStructType (ParamTys[0 ]))
1491
+ if (isOCLImageType (getCallValueType (CI, 0 )))
1503
1492
Info.UniqName = getSPIRVFuncName (spv::OpSubgroupImageBlockReadINTEL);
1504
1493
else
1505
1494
Info.UniqName = getSPIRVFuncName (spv::OpSubgroupBlockReadINTEL);
@@ -1512,9 +1501,7 @@ void OCLToSPIRVBase::visitSubgroupBlockReadINTEL(CallInst *CI) {
1512
1501
// instructions.
1513
1502
void OCLToSPIRVBase::visitSubgroupBlockWriteINTEL (CallInst *CI) {
1514
1503
OCLBuiltinTransInfo Info;
1515
- SmallVector<Type *, 3 > ParamTys;
1516
- getParameterTypes (CI, ParamTys);
1517
- if (isOCLImageStructType (ParamTys[0 ]))
1504
+ if (isOCLImageType (getCallValueType (CI, 0 )))
1518
1505
Info.UniqName = getSPIRVFuncName (spv::OpSubgroupImageBlockWriteINTEL);
1519
1506
else
1520
1507
Info.UniqName = getSPIRVFuncName (spv::OpSubgroupBlockWriteINTEL);
@@ -1614,7 +1601,7 @@ void OCLToSPIRVBase::visitSubgroupAVCWrapperBuiltinCall(
1614
1601
std::string MCETName =
1615
1602
std::string (kOCLSubgroupsAVCIntel ::TypePrefix) + " mce_" + TyKind + " _t" ;
1616
1603
auto *MCESTy = getSubgroupAVCIntelMCEType (M, MCETName);
1617
- auto *MCETy = PointerType ::get (MCESTy, SPIRAS_Private);
1604
+ auto *MCETy = TypedPointerType ::get (MCESTy, SPIRAS_Private);
1618
1605
std::string ToMCEFName = Prefix + OpKind + " _convert_to_mce_" + TyKind;
1619
1606
Op ToMCEOC = OpNop;
1620
1607
OCLSPIRVSubgroupAVCIntelBuiltinMap::find (ToMCEFName, &ToMCEOC);
@@ -1631,28 +1618,24 @@ void OCLToSPIRVBase::visitSubgroupAVCWrapperBuiltinCall(
1631
1618
1632
1619
mutateCallInst (CI, WrappedOC)
1633
1620
.mapArg (CI->arg_size () - 1 ,
1634
- [&](Value *Arg, Type *ParamTy) {
1621
+ [&](IRBuilder<> &Builder, Value *Arg, Type *ParamTy) {
1635
1622
// 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});
1640
1625
})
1641
- .changeReturnType (MCETy, [= ](IRBuilder<> &, CallInst *NewCI) {
1626
+ .changeReturnType (MCETy, [& ](IRBuilder<> &Builder , CallInst *NewCI) {
1642
1627
// 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} );
1645
1630
});
1646
1631
} else {
1647
1632
// Wrapper built-ins which take the 'result_t' argument requires only one
1648
1633
// conversion for the argument
1649
1634
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) {
1651
1637
// 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});
1656
1639
});
1657
1640
}
1658
1641
}
@@ -1676,9 +1659,8 @@ void OCLToSPIRVBase::visitSubgroupAVCBuiltinCallWithSampler(
1676
1659
return ; // this is not a VME built-in
1677
1660
1678
1661
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);
1682
1664
assert (TyIt != ParamTys.end () && " Invalid Subgroup AVC Intel built-in call" );
1683
1665
unsigned SamplerIndex = TyIt - ParamTys.begin ();
1684
1666
Value *SamplerVal = CI->getOperand (SamplerIndex);
@@ -1687,30 +1669,24 @@ void OCLToSPIRVBase::visitSubgroupAVCBuiltinCallWithSampler(
1687
1669
SmallVector<Type *, 4 > AdaptedTys;
1688
1670
for (unsigned I = 0 ; I < CI->arg_size (); I++)
1689
1671
AdaptedTys.push_back (
1690
- OCLTypeToSPIRVPtr->getAdaptedArgumentType (CI->getCalledFunction (), I)
1691
- .second );
1672
+ OCLTypeToSPIRVPtr->getAdaptedArgumentType (CI->getCalledFunction (), I));
1692
1673
auto *AdaptedIter = AdaptedTys.begin ();
1693
1674
1694
1675
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 );
1698
1679
1699
1680
auto *ImageTy = *AdaptedIter++;
1700
1681
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);
1707
1685
1708
1686
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);
1714
1690
})
1715
1691
.removeArg (SamplerIndex);
1716
1692
}
0 commit comments