@@ -1257,14 +1257,18 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
1257
1257
Register SrcReg = I.getOperand (1 ).getReg ();
1258
1258
bool Result = true ;
1259
1259
if (I.getOpcode () == TargetOpcode::G_MEMSET) {
1260
+ MachineIRBuilder MIRBuilder (I);
1260
1261
assert (I.getOperand (1 ).isReg () && I.getOperand (2 ).isReg ());
1261
1262
unsigned Val = getIConstVal (I.getOperand (1 ).getReg (), MRI);
1262
1263
unsigned Num = getIConstVal (I.getOperand (2 ).getReg (), MRI);
1263
- SPIRVType *ValTy = GR.getOrCreateSPIRVIntegerType (8 , I, TII);
1264
- SPIRVType *ArrTy = GR.getOrCreateSPIRVArrayType (ValTy, Num, I, TII);
1265
- Register Const = GR.getOrCreateConstIntArray (Val, Num, I, ArrTy, TII);
1264
+ Type *ValTy = Type::getInt8Ty (I.getMF ()->getFunction ().getContext ());
1265
+ Type *ArrTy = ArrayType::get (ValTy, Num);
1266
1266
SPIRVType *VarTy = GR.getOrCreateSPIRVPointerType (
1267
- ArrTy, I, TII, SPIRV::StorageClass::UniformConstant);
1267
+ ArrTy, MIRBuilder, SPIRV::StorageClass::UniformConstant);
1268
+
1269
+ SPIRVType *SpvArrTy = GR.getOrCreateSPIRVType (
1270
+ ArrTy, MIRBuilder, SPIRV::AccessQualifier::None, false );
1271
+ Register Const = GR.getOrCreateConstIntArray (Val, Num, I, SpvArrTy, TII);
1268
1272
// TODO: check if we have such GV, add init, use buildGlobalVariable.
1269
1273
Function &CurFunction = GR.CurMF ->getFunction ();
1270
1274
Type *LLVMArrTy =
@@ -1287,7 +1291,7 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
1287
1291
1288
1292
buildOpDecorate (VarReg, I, TII, SPIRV::Decoration::Constant, {});
1289
1293
SPIRVType *SourceTy = GR.getOrCreateSPIRVPointerType (
1290
- ValTy, I, TII, SPIRV::StorageClass::UniformConstant);
1294
+ ValTy, I, SPIRV::StorageClass::UniformConstant);
1291
1295
SrcReg = MRI->createGenericVirtualRegister (LLT::scalar (64 ));
1292
1296
selectOpWithSrcs (SrcReg, SourceTy, I, {VarReg}, SPIRV::OpBitcast);
1293
1297
}
@@ -1588,7 +1592,7 @@ static bool isASCastInGVar(MachineRegisterInfo *MRI, Register ResVReg) {
1588
1592
Register SPIRVInstructionSelector::getUcharPtrTypeReg (
1589
1593
MachineInstr &I, SPIRV::StorageClass::StorageClass SC) const {
1590
1594
return GR.getSPIRVTypeID (GR.getOrCreateSPIRVPointerType (
1591
- GR. getOrCreateSPIRVIntegerType ( 8 , I, TII) , I, TII , SC));
1595
+ Type::getInt8Ty (I. getMF ()-> getFunction (). getContext ()) , I, SC));
1592
1596
}
1593
1597
1594
1598
MachineInstrBuilder
@@ -1606,8 +1610,8 @@ SPIRVInstructionSelector::buildSpecConstantOp(MachineInstr &I, Register Dest,
1606
1610
MachineInstrBuilder
1607
1611
SPIRVInstructionSelector::buildConstGenericPtr (MachineInstr &I, Register SrcPtr,
1608
1612
SPIRVType *SrcPtrTy) const {
1609
- SPIRVType *GenericPtrTy = GR. getOrCreateSPIRVPointerType (
1610
- GR.getPointeeType (SrcPtrTy), I, TII, SPIRV::StorageClass::Generic);
1613
+ SPIRVType *GenericPtrTy =
1614
+ GR.changePointerStorageClass (SrcPtrTy, SPIRV::StorageClass::Generic, I );
1611
1615
Register Tmp = MRI->createVirtualRegister (&SPIRV::pIDRegClass);
1612
1616
MRI->setType (Tmp, LLT::pointer (storageClassToAddressSpace (
1613
1617
SPIRV::StorageClass::Generic),
@@ -1692,8 +1696,8 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
1692
1696
return selectUnOp (ResVReg, ResType , I, SPIRV::OpGenericCastToPtr);
1693
1697
// Casting between 2 eligible pointers using Generic as an intermediary.
1694
1698
if (isGenericCastablePtr (SrcSC) && isGenericCastablePtr (DstSC)) {
1695
- SPIRVType *GenericPtrTy = GR. getOrCreateSPIRVPointerType (
1696
- GR.getPointeeType (SrcPtrTy), I, TII, SPIRV::StorageClass::Generic);
1699
+ SPIRVType *GenericPtrTy =
1700
+ GR.changePointerStorageClass (SrcPtrTy, SPIRV::StorageClass::Generic, I );
1697
1701
Register Tmp = createVirtualRegister (GenericPtrTy, &GR, MRI, MRI->getMF ());
1698
1702
bool Result = BuildMI (BB, I, DL, TII.get (SPIRV::OpPtrCastToGeneric))
1699
1703
.addDef (Tmp)
@@ -3364,18 +3368,20 @@ bool SPIRVInstructionSelector::selectImageWriteIntrinsic(
3364
3368
}
3365
3369
3366
3370
Register SPIRVInstructionSelector::buildPointerToResource (
3367
- const SPIRVType *ResType , SPIRV::StorageClass::StorageClass SC,
3371
+ const SPIRVType *SpirvResType , SPIRV::StorageClass::StorageClass SC,
3368
3372
uint32_t Set, uint32_t Binding, uint32_t ArraySize, Register IndexReg,
3369
3373
bool IsNonUniform, MachineIRBuilder MIRBuilder) const {
3374
+ const Type *ResType = GR.getTypeForSPIRVType (SpirvResType);
3370
3375
if (ArraySize == 1 ) {
3371
3376
SPIRVType *PtrType =
3372
3377
GR.getOrCreateSPIRVPointerType (ResType , MIRBuilder, SC);
3378
+ assert (GR.getPointeeType (PtrType) == SpirvResType &&
3379
+ " SpirvResType did not have an explicit layout." );
3373
3380
return GR.getOrCreateGlobalVariableWithBinding (PtrType, Set, Binding,
3374
3381
MIRBuilder);
3375
3382
}
3376
3383
3377
- const SPIRVType *VarType = GR.getOrCreateSPIRVArrayType (
3378
- ResType , ArraySize, *MIRBuilder.getInsertPt (), TII);
3384
+ const Type *VarType = ArrayType::get (const_cast <Type *>(ResType ), ArraySize);
3379
3385
SPIRVType *VarPointerType =
3380
3386
GR.getOrCreateSPIRVPointerType (VarType, MIRBuilder, SC);
3381
3387
Register VarReg = GR.getOrCreateGlobalVariableWithBinding (
@@ -3805,17 +3811,6 @@ bool SPIRVInstructionSelector::selectGlobalValue(
3805
3811
MachineIRBuilder MIRBuilder (I);
3806
3812
const GlobalValue *GV = I.getOperand (1 ).getGlobal ();
3807
3813
Type *GVType = toTypedPointer (GR.getDeducedGlobalValueType (GV));
3808
- SPIRVType *PointerBaseType;
3809
- if (GVType->isArrayTy ()) {
3810
- SPIRVType *ArrayElementType =
3811
- GR.getOrCreateSPIRVType (GVType->getArrayElementType (), MIRBuilder,
3812
- SPIRV::AccessQualifier::ReadWrite, false );
3813
- PointerBaseType = GR.getOrCreateSPIRVArrayType (
3814
- ArrayElementType, GVType->getArrayNumElements (), I, TII);
3815
- } else {
3816
- PointerBaseType = GR.getOrCreateSPIRVType (
3817
- GVType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false );
3818
- }
3819
3814
3820
3815
std::string GlobalIdent;
3821
3816
if (!GV->hasName ()) {
@@ -3848,7 +3843,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
3848
3843
? dyn_cast<Function>(GV)
3849
3844
: nullptr ;
3850
3845
SPIRVType *ResType = GR.getOrCreateSPIRVPointerType (
3851
- PointerBaseType , I, TII ,
3846
+ GVType , I,
3852
3847
GVFun ? SPIRV::StorageClass::CodeSectionINTEL
3853
3848
: addressSpaceToStorageClass (GV->getAddressSpace (), STI));
3854
3849
if (GVFun) {
@@ -3906,8 +3901,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
3906
3901
const unsigned AddrSpace = GV->getAddressSpace ();
3907
3902
SPIRV::StorageClass::StorageClass StorageClass =
3908
3903
addressSpaceToStorageClass (AddrSpace, STI);
3909
- SPIRVType *ResType =
3910
- GR.getOrCreateSPIRVPointerType (PointerBaseType, I, TII, StorageClass);
3904
+ SPIRVType *ResType = GR.getOrCreateSPIRVPointerType (GVType, I, StorageClass);
3911
3905
Register Reg = GR.buildGlobalVariable (
3912
3906
ResVReg, ResType , GlobalIdent, GV, StorageClass, Init,
3913
3907
GlobalVar->isConstant (), HasLnkTy, LnkType, MIRBuilder, true );
0 commit comments