@@ -1257,14 +1257,18 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
12571257 Register SrcReg = I.getOperand (1 ).getReg ();
12581258 bool Result = true ;
12591259 if (I.getOpcode () == TargetOpcode::G_MEMSET) {
1260+ MachineIRBuilder MIRBuilder (I);
12601261 assert (I.getOperand (1 ).isReg () && I.getOperand (2 ).isReg ());
12611262 unsigned Val = getIConstVal (I.getOperand (1 ).getReg (), MRI);
12621263 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);
12661266 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);
12681272 // TODO: check if we have such GV, add init, use buildGlobalVariable.
12691273 Function &CurFunction = GR.CurMF ->getFunction ();
12701274 Type *LLVMArrTy =
@@ -1287,7 +1291,7 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
12871291
12881292 buildOpDecorate (VarReg, I, TII, SPIRV::Decoration::Constant, {});
12891293 SPIRVType *SourceTy = GR.getOrCreateSPIRVPointerType (
1290- ValTy, I, TII, SPIRV::StorageClass::UniformConstant);
1294+ ValTy, I, SPIRV::StorageClass::UniformConstant);
12911295 SrcReg = MRI->createGenericVirtualRegister (LLT::scalar (64 ));
12921296 selectOpWithSrcs (SrcReg, SourceTy, I, {VarReg}, SPIRV::OpBitcast);
12931297 }
@@ -1588,7 +1592,7 @@ static bool isASCastInGVar(MachineRegisterInfo *MRI, Register ResVReg) {
15881592Register SPIRVInstructionSelector::getUcharPtrTypeReg (
15891593 MachineInstr &I, SPIRV::StorageClass::StorageClass SC) const {
15901594 return GR.getSPIRVTypeID (GR.getOrCreateSPIRVPointerType (
1591- GR. getOrCreateSPIRVIntegerType ( 8 , I, TII) , I, TII , SC));
1595+ Type::getInt8Ty (I. getMF ()-> getFunction (). getContext ()) , I, SC));
15921596}
15931597
15941598MachineInstrBuilder
@@ -1606,8 +1610,8 @@ SPIRVInstructionSelector::buildSpecConstantOp(MachineInstr &I, Register Dest,
16061610MachineInstrBuilder
16071611SPIRVInstructionSelector::buildConstGenericPtr (MachineInstr &I, Register SrcPtr,
16081612 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 );
16111615 Register Tmp = MRI->createVirtualRegister (&SPIRV::pIDRegClass);
16121616 MRI->setType (Tmp, LLT::pointer (storageClassToAddressSpace (
16131617 SPIRV::StorageClass::Generic),
@@ -1692,8 +1696,8 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
16921696 return selectUnOp (ResVReg, ResType, I, SPIRV::OpGenericCastToPtr);
16931697 // Casting between 2 eligible pointers using Generic as an intermediary.
16941698 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 );
16971701 Register Tmp = createVirtualRegister (GenericPtrTy, &GR, MRI, MRI->getMF ());
16981702 bool Result = BuildMI (BB, I, DL, TII.get (SPIRV::OpPtrCastToGeneric))
16991703 .addDef (Tmp)
@@ -3364,18 +3368,20 @@ bool SPIRVInstructionSelector::selectImageWriteIntrinsic(
33643368}
33653369
33663370Register SPIRVInstructionSelector::buildPointerToResource (
3367- const SPIRVType *ResType , SPIRV::StorageClass::StorageClass SC,
3371+ const SPIRVType *SpirvResType , SPIRV::StorageClass::StorageClass SC,
33683372 uint32_t Set, uint32_t Binding, uint32_t ArraySize, Register IndexReg,
33693373 bool IsNonUniform, MachineIRBuilder MIRBuilder) const {
3374+ const Type *ResType = GR.getTypeForSPIRVType (SpirvResType);
33703375 if (ArraySize == 1 ) {
33713376 SPIRVType *PtrType =
33723377 GR.getOrCreateSPIRVPointerType (ResType, MIRBuilder, SC);
3378+ assert (GR.getPointeeType (PtrType) == SpirvResType &&
3379+ " SpirvResType did not have an explicit layout." );
33733380 return GR.getOrCreateGlobalVariableWithBinding (PtrType, Set, Binding,
33743381 MIRBuilder);
33753382 }
33763383
3377- const SPIRVType *VarType = GR.getOrCreateSPIRVArrayType (
3378- ResType, ArraySize, *MIRBuilder.getInsertPt (), TII);
3384+ const Type *VarType = ArrayType::get (const_cast <Type *>(ResType), ArraySize);
33793385 SPIRVType *VarPointerType =
33803386 GR.getOrCreateSPIRVPointerType (VarType, MIRBuilder, SC);
33813387 Register VarReg = GR.getOrCreateGlobalVariableWithBinding (
@@ -3805,17 +3811,6 @@ bool SPIRVInstructionSelector::selectGlobalValue(
38053811 MachineIRBuilder MIRBuilder (I);
38063812 const GlobalValue *GV = I.getOperand (1 ).getGlobal ();
38073813 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- }
38193814
38203815 std::string GlobalIdent;
38213816 if (!GV->hasName ()) {
@@ -3848,7 +3843,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
38483843 ? dyn_cast<Function>(GV)
38493844 : nullptr ;
38503845 SPIRVType *ResType = GR.getOrCreateSPIRVPointerType (
3851- PointerBaseType , I, TII ,
3846+ GVType , I,
38523847 GVFun ? SPIRV::StorageClass::CodeSectionINTEL
38533848 : addressSpaceToStorageClass (GV->getAddressSpace (), STI));
38543849 if (GVFun) {
@@ -3906,8 +3901,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
39063901 const unsigned AddrSpace = GV->getAddressSpace ();
39073902 SPIRV::StorageClass::StorageClass StorageClass =
39083903 addressSpaceToStorageClass (AddrSpace, STI);
3909- SPIRVType *ResType =
3910- GR.getOrCreateSPIRVPointerType (PointerBaseType, I, TII, StorageClass);
3904+ SPIRVType *ResType = GR.getOrCreateSPIRVPointerType (GVType, I, StorageClass);
39113905 Register Reg = GR.buildGlobalVariable (
39123906 ResVReg, ResType, GlobalIdent, GV, StorageClass, Init,
39133907 GlobalVar->isConstant (), HasLnkTy, LnkType, MIRBuilder, true );
0 commit comments