@@ -445,12 +445,12 @@ static std::tuple<Register, SPIRVType *>
445445buildBoolRegister (MachineIRBuilder &MIRBuilder, const SPIRVType *ResultType,
446446 SPIRVGlobalRegistry *GR) {
447447 LLT Type;
448- SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
448+ SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
449449
450450 if (ResultType->getOpcode () == SPIRV::OpTypeVector) {
451451 unsigned VectorElements = ResultType->getOperand (2 ).getImm ();
452- BoolType =
453- GR-> getOrCreateSPIRVVectorType (BoolType, VectorElements, MIRBuilder);
452+ BoolType = GR-> getOrCreateSPIRVVectorType (BoolType, VectorElements,
453+ MIRBuilder, true );
454454 const FixedVectorType *LLVMVectorType =
455455 cast<FixedVectorType>(GR->getTypeForSPIRVType (BoolType));
456456 Type = LLT::vector (LLVMVectorType->getElementCount (), 1 );
@@ -476,11 +476,12 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
476476 if (ReturnType->getOpcode () == SPIRV::OpTypeVector) {
477477 unsigned Bits = GR->getScalarOrVectorBitWidth (ReturnType);
478478 uint64_t AllOnes = APInt::getAllOnes (Bits).getZExtValue ();
479- TrueConst = GR->getOrCreateConsIntVector (AllOnes, MIRBuilder, ReturnType);
480- FalseConst = GR->getOrCreateConsIntVector (0 , MIRBuilder, ReturnType);
479+ TrueConst =
480+ GR->getOrCreateConsIntVector (AllOnes, MIRBuilder, ReturnType, true );
481+ FalseConst = GR->getOrCreateConsIntVector (0 , MIRBuilder, ReturnType, true );
481482 } else {
482- TrueConst = GR->buildConstantInt (1 , MIRBuilder, ReturnType);
483- FalseConst = GR->buildConstantInt (0 , MIRBuilder, ReturnType);
483+ TrueConst = GR->buildConstantInt (1 , MIRBuilder, ReturnType, true );
484+ FalseConst = GR->buildConstantInt (0 , MIRBuilder, ReturnType, true );
484485 }
485486
486487 return MIRBuilder.buildSelect (ReturnRegister, SourceRegister, TrueConst,
@@ -580,8 +581,8 @@ static SPIRV::Scope::Scope getSPIRVScope(SPIRV::CLMemoryScope ClScope) {
580581static Register buildConstantIntReg32 (uint64_t Val,
581582 MachineIRBuilder &MIRBuilder,
582583 SPIRVGlobalRegistry *GR) {
583- return GR->buildConstantInt (Val, MIRBuilder,
584- GR->getOrCreateSPIRVIntegerType (32 , MIRBuilder));
584+ return GR->buildConstantInt (
585+ Val, MIRBuilder, GR->getOrCreateSPIRVIntegerType (32 , MIRBuilder), true );
585586}
586587
587588static Register buildScopeReg (Register CLScopeRegister,
@@ -1170,7 +1171,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11701171
11711172 Register Arg0;
11721173 if (GroupBuiltin->HasBoolArg ) {
1173- SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
1174+ SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
11741175 Register BoolReg = Call->Arguments [0 ];
11751176 SPIRVType *BoolRegType = GR->getSPIRVTypeForVReg (BoolReg);
11761177 if (!BoolRegType)
@@ -1179,14 +1180,15 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11791180 if (ArgInstruction->getOpcode () == TargetOpcode::G_CONSTANT) {
11801181 if (BoolRegType->getOpcode () != SPIRV::OpTypeBool)
11811182 Arg0 = GR->buildConstantInt (getIConstVal (BoolReg, MRI), MIRBuilder,
1182- BoolType);
1183+ BoolType, true );
11831184 } else {
11841185 if (BoolRegType->getOpcode () == SPIRV::OpTypeInt) {
11851186 Arg0 = MRI->createGenericVirtualRegister (LLT::scalar (1 ));
11861187 MRI->setRegClass (Arg0, &SPIRV::iIDRegClass);
11871188 GR->assignSPIRVTypeToVReg (BoolType, Arg0, MIRBuilder.getMF ());
1188- MIRBuilder.buildICmp (CmpInst::ICMP_NE, Arg0, BoolReg,
1189- GR->buildConstantInt (0 , MIRBuilder, BoolRegType));
1189+ MIRBuilder.buildICmp (
1190+ CmpInst::ICMP_NE, Arg0, BoolReg,
1191+ GR->buildConstantInt (0 , MIRBuilder, BoolRegType, true ));
11901192 insertAssignInstr (Arg0, nullptr , BoolType, GR, MIRBuilder,
11911193 MIRBuilder.getMF ().getRegInfo ());
11921194 } else if (BoolRegType->getOpcode () != SPIRV::OpTypeBool) {
@@ -1231,7 +1233,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
12311233 LLT::fixed_vector (VecLen, MRI->getType (ElemReg)));
12321234 MRI->setRegClass (VecReg, &SPIRV::vIDRegClass);
12331235 SPIRVType *VecType =
1234- GR->getOrCreateSPIRVVectorType (ElemType, VecLen, MIRBuilder);
1236+ GR->getOrCreateSPIRVVectorType (ElemType, VecLen, MIRBuilder, true );
12351237 GR->assignSPIRVTypeToVReg (VecType, VecReg, MIRBuilder.getMF ());
12361238 auto MIB =
12371239 MIRBuilder.buildInstr (TargetOpcode::G_BUILD_VECTOR).addDef (VecReg);
@@ -1475,11 +1477,11 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
14751477 ToTruncate = DefaultReg;
14761478 }
14771479 auto NewRegister =
1478- GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType);
1480+ GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType, true );
14791481 MIRBuilder.buildCopy (DefaultReg, NewRegister);
14801482 } else { // If it could be in range, we need to load from the given builtin.
14811483 auto Vec3Ty =
1482- GR->getOrCreateSPIRVVectorType (PointerSizeType, 3 , MIRBuilder);
1484+ GR->getOrCreateSPIRVVectorType (PointerSizeType, 3 , MIRBuilder, true );
14831485 Register LoadedVector =
14841486 buildBuiltinVariableLoad (MIRBuilder, Vec3Ty, GR, BuiltinValue,
14851487 LLT::fixed_vector (3 , PointerSize));
@@ -1502,21 +1504,22 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
15021504 *MRI);
15031505
15041506 auto IndexType = GR->getSPIRVTypeForVReg (IndexRegister);
1505- auto BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
1507+ auto BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
15061508
15071509 Register CompareRegister =
15081510 MRI->createGenericVirtualRegister (LLT::scalar (1 ));
15091511 MRI->setRegClass (CompareRegister, &SPIRV::iIDRegClass);
15101512 GR->assignSPIRVTypeToVReg (BoolType, CompareRegister, MIRBuilder.getMF ());
15111513
15121514 // Use G_ICMP to check if idxVReg < 3.
1513- MIRBuilder.buildICmp (CmpInst::ICMP_ULT, CompareRegister, IndexRegister,
1514- GR->buildConstantInt (3 , MIRBuilder, IndexType));
1515+ MIRBuilder.buildICmp (
1516+ CmpInst::ICMP_ULT, CompareRegister, IndexRegister,
1517+ GR->buildConstantInt (3 , MIRBuilder, IndexType, true ));
15151518
15161519 // Get constant for the default value (0 or 1 depending on which
15171520 // function).
15181521 Register DefaultRegister =
1519- GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType);
1522+ GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType, true );
15201523
15211524 // Get a register for the selection result (possibly a new temporary one).
15221525 Register SelectionResult = Call->ReturnRegister ;
@@ -1830,7 +1833,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
18301833 MIRBuilder.getMRI ()->setRegClass (QueryResult, &SPIRV::vIDRegClass);
18311834 SPIRVType *IntTy = GR->getOrCreateSPIRVIntegerType (32 , MIRBuilder);
18321835 QueryResultType = GR->getOrCreateSPIRVVectorType (
1833- IntTy, NumActualRetComponents, MIRBuilder);
1836+ IntTy, NumActualRetComponents, MIRBuilder, true );
18341837 GR->assignSPIRVTypeToVReg (QueryResultType, QueryResult, MIRBuilder.getMF ());
18351838 }
18361839 bool IsDimBuf = ImgType->getOperand (2 ).getImm () == SPIRV::Dim::DIM_Buffer;
@@ -1987,7 +1990,7 @@ static bool generateReadImageInst(const StringRef DemangledCall,
19871990
19881991 if (Call->ReturnType ->getOpcode () != SPIRV::OpTypeVector) {
19891992 SPIRVType *TempType =
1990- GR->getOrCreateSPIRVVectorType (Call->ReturnType , 4 , MIRBuilder);
1993+ GR->getOrCreateSPIRVVectorType (Call->ReturnType , 4 , MIRBuilder, true );
19911994 Register TempRegister =
19921995 MRI->createGenericVirtualRegister (GR->getRegType (TempType));
19931996 MRI->setRegClass (TempRegister, GR->getRegClass (TempType));
@@ -2085,7 +2088,7 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
20852088 SPIRVType *Type =
20862089 Call->ReturnType
20872090 ? Call->ReturnType
2088- : GR->getOrCreateSPIRVTypeByName (ReturnType, MIRBuilder);
2091+ : GR->getOrCreateSPIRVTypeByName (ReturnType, MIRBuilder, true );
20892092 if (!Type) {
20902093 std::string DiagMsg =
20912094 " Unable to recognize SPIRV type name: " + ReturnType;
@@ -2294,7 +2297,8 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
22942297 unsigned BitWidth = GR->getPointerSize () == 64 ? 64 : 32 ;
22952298 Type *BaseTy = IntegerType::get (MF.getFunction ().getContext (), BitWidth);
22962299 Type *FieldTy = ArrayType::get (BaseTy, Size);
2297- SPIRVType *SpvFieldTy = GR->getOrCreateSPIRVType (FieldTy, MIRBuilder);
2300+ SPIRVType *SpvFieldTy = GR->getOrCreateSPIRVType (
2301+ FieldTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true );
22982302 GlobalWorkSize = MRI->createVirtualRegister (&SPIRV::iIDRegClass);
22992303 GR->assignSPIRVTypeToVReg (SpvFieldTy, GlobalWorkSize, MF);
23002304 MIRBuilder.buildInstr (SPIRV::OpLoad)
@@ -2306,7 +2310,7 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
23062310 Const = GR->getOrCreateConstIntArray (0 , Size, *MIRBuilder.getInsertPt (),
23072311 SpvFieldTy, *ST.getInstrInfo ());
23082312 } else {
2309- Const = GR->buildConstantInt (0 , MIRBuilder, SpvTy);
2313+ Const = GR->buildConstantInt (0 , MIRBuilder, SpvTy, true );
23102314 }
23112315 if (!LocalWorkSize.isValid ())
23122316 LocalWorkSize = Const;
@@ -2332,7 +2336,8 @@ getOrCreateSPIRVDeviceEventPointer(MachineIRBuilder &MIRBuilder,
23322336 LLVMContext &Context = MIRBuilder.getMF ().getFunction ().getContext ();
23332337 unsigned SC1 = storageClassToAddressSpace (SPIRV::StorageClass::Generic);
23342338 Type *PtrType = PointerType::get (Context, SC1);
2335- return GR->getOrCreateSPIRVType (PtrType, MIRBuilder);
2339+ return GR->getOrCreateSPIRVType (PtrType, MIRBuilder,
2340+ SPIRV::AccessQualifier::ReadWrite, true );
23362341}
23372342
23382343static bool buildEnqueueKernel (const SPIRV::IncomingCall *Call,
@@ -2481,7 +2486,7 @@ static bool generateAsyncCopy(const SPIRV::IncomingCall *Call,
24812486 SPIRVType *NewType =
24822487 Call->ReturnType ->getOpcode () == SPIRV::OpTypeEvent
24832488 ? nullptr
2484- : GR->getOrCreateSPIRVTypeByName (" spirv.Event" , MIRBuilder);
2489+ : GR->getOrCreateSPIRVTypeByName (" spirv.Event" , MIRBuilder, true );
24852490 Register TypeReg = GR->getSPIRVTypeID (NewType ? NewType : Call->ReturnType );
24862491 unsigned NumArgs = Call->Arguments .size ();
24872492 Register EventReg = Call->Arguments [NumArgs - 1 ];
@@ -2984,12 +2989,13 @@ static SPIRVType *getCoopMatrType(const TargetExtType *ExtensionType,
29842989 assert (ExtensionType->getNumTypeParameters () == 1 &&
29852990 " SPIR-V coop matrices builtin type must have a type parameter!" );
29862991 const SPIRVType *ElemType =
2987- GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder);
2992+ GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder,
2993+ SPIRV::AccessQualifier::ReadWrite, true );
29882994 // Create or get an existing type from GlobalRegistry.
29892995 return GR->getOrCreateOpTypeCoopMatr (
29902996 MIRBuilder, ExtensionType, ElemType, ExtensionType->getIntParameter (0 ),
29912997 ExtensionType->getIntParameter (1 ), ExtensionType->getIntParameter (2 ),
2992- ExtensionType->getIntParameter (3 ));
2998+ ExtensionType->getIntParameter (3 ), true );
29932999}
29943000
29953001static SPIRVType *
@@ -2999,7 +3005,8 @@ getImageType(const TargetExtType *ExtensionType,
29993005 assert (ExtensionType->getNumTypeParameters () == 1 &&
30003006 " SPIR-V image builtin type must have sampled type parameter!" );
30013007 const SPIRVType *SampledType =
3002- GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder);
3008+ GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder,
3009+ SPIRV::AccessQualifier::ReadWrite, true );
30033010 assert ((ExtensionType->getNumIntParameters () == 7 ||
30043011 ExtensionType->getNumIntParameters () == 6 ) &&
30053012 " Invalid number of parameters for SPIR-V image builtin!" );
0 commit comments