@@ -445,12 +445,12 @@ static std::tuple<Register, SPIRVType *>
445
445
buildBoolRegister (MachineIRBuilder &MIRBuilder, const SPIRVType *ResultType,
446
446
SPIRVGlobalRegistry *GR) {
447
447
LLT Type;
448
- SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
448
+ SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
449
449
450
450
if (ResultType->getOpcode () == SPIRV::OpTypeVector) {
451
451
unsigned VectorElements = ResultType->getOperand (2 ).getImm ();
452
- BoolType =
453
- GR-> getOrCreateSPIRVVectorType (BoolType, VectorElements, MIRBuilder);
452
+ BoolType = GR-> getOrCreateSPIRVVectorType (BoolType, VectorElements,
453
+ MIRBuilder, true );
454
454
const FixedVectorType *LLVMVectorType =
455
455
cast<FixedVectorType>(GR->getTypeForSPIRVType (BoolType));
456
456
Type = LLT::vector (LLVMVectorType->getElementCount (), 1 );
@@ -476,11 +476,12 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
476
476
if (ReturnType->getOpcode () == SPIRV::OpTypeVector) {
477
477
unsigned Bits = GR->getScalarOrVectorBitWidth (ReturnType);
478
478
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 );
481
482
} 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 );
484
485
}
485
486
486
487
return MIRBuilder.buildSelect (ReturnRegister, SourceRegister, TrueConst,
@@ -580,8 +581,8 @@ static SPIRV::Scope::Scope getSPIRVScope(SPIRV::CLMemoryScope ClScope) {
580
581
static Register buildConstantIntReg32 (uint64_t Val,
581
582
MachineIRBuilder &MIRBuilder,
582
583
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 );
585
586
}
586
587
587
588
static Register buildScopeReg (Register CLScopeRegister,
@@ -1170,7 +1171,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
1170
1171
1171
1172
Register Arg0;
1172
1173
if (GroupBuiltin->HasBoolArg ) {
1173
- SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
1174
+ SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
1174
1175
Register BoolReg = Call->Arguments [0 ];
1175
1176
SPIRVType *BoolRegType = GR->getSPIRVTypeForVReg (BoolReg);
1176
1177
if (!BoolRegType)
@@ -1179,14 +1180,15 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
1179
1180
if (ArgInstruction->getOpcode () == TargetOpcode::G_CONSTANT) {
1180
1181
if (BoolRegType->getOpcode () != SPIRV::OpTypeBool)
1181
1182
Arg0 = GR->buildConstantInt (getIConstVal (BoolReg, MRI), MIRBuilder,
1182
- BoolType);
1183
+ BoolType, true );
1183
1184
} else {
1184
1185
if (BoolRegType->getOpcode () == SPIRV::OpTypeInt) {
1185
1186
Arg0 = MRI->createGenericVirtualRegister (LLT::scalar (1 ));
1186
1187
MRI->setRegClass (Arg0, &SPIRV::iIDRegClass);
1187
1188
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 ));
1190
1192
insertAssignInstr (Arg0, nullptr , BoolType, GR, MIRBuilder,
1191
1193
MIRBuilder.getMF ().getRegInfo ());
1192
1194
} else if (BoolRegType->getOpcode () != SPIRV::OpTypeBool) {
@@ -1231,7 +1233,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
1231
1233
LLT::fixed_vector (VecLen, MRI->getType (ElemReg)));
1232
1234
MRI->setRegClass (VecReg, &SPIRV::vIDRegClass);
1233
1235
SPIRVType *VecType =
1234
- GR->getOrCreateSPIRVVectorType (ElemType, VecLen, MIRBuilder);
1236
+ GR->getOrCreateSPIRVVectorType (ElemType, VecLen, MIRBuilder, true );
1235
1237
GR->assignSPIRVTypeToVReg (VecType, VecReg, MIRBuilder.getMF ());
1236
1238
auto MIB =
1237
1239
MIRBuilder.buildInstr (TargetOpcode::G_BUILD_VECTOR).addDef (VecReg);
@@ -1475,11 +1477,11 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
1475
1477
ToTruncate = DefaultReg;
1476
1478
}
1477
1479
auto NewRegister =
1478
- GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType);
1480
+ GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType, true );
1479
1481
MIRBuilder.buildCopy (DefaultReg, NewRegister);
1480
1482
} else { // If it could be in range, we need to load from the given builtin.
1481
1483
auto Vec3Ty =
1482
- GR->getOrCreateSPIRVVectorType (PointerSizeType, 3 , MIRBuilder);
1484
+ GR->getOrCreateSPIRVVectorType (PointerSizeType, 3 , MIRBuilder, true );
1483
1485
Register LoadedVector =
1484
1486
buildBuiltinVariableLoad (MIRBuilder, Vec3Ty, GR, BuiltinValue,
1485
1487
LLT::fixed_vector (3 , PointerSize));
@@ -1502,21 +1504,22 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
1502
1504
*MRI);
1503
1505
1504
1506
auto IndexType = GR->getSPIRVTypeForVReg (IndexRegister);
1505
- auto BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder);
1507
+ auto BoolType = GR->getOrCreateSPIRVBoolType (MIRBuilder, true );
1506
1508
1507
1509
Register CompareRegister =
1508
1510
MRI->createGenericVirtualRegister (LLT::scalar (1 ));
1509
1511
MRI->setRegClass (CompareRegister, &SPIRV::iIDRegClass);
1510
1512
GR->assignSPIRVTypeToVReg (BoolType, CompareRegister, MIRBuilder.getMF ());
1511
1513
1512
1514
// 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 ));
1515
1518
1516
1519
// Get constant for the default value (0 or 1 depending on which
1517
1520
// function).
1518
1521
Register DefaultRegister =
1519
- GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType);
1522
+ GR->buildConstantInt (DefaultValue, MIRBuilder, PointerSizeType, true );
1520
1523
1521
1524
// Get a register for the selection result (possibly a new temporary one).
1522
1525
Register SelectionResult = Call->ReturnRegister ;
@@ -1830,7 +1833,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
1830
1833
MIRBuilder.getMRI ()->setRegClass (QueryResult, &SPIRV::vIDRegClass);
1831
1834
SPIRVType *IntTy = GR->getOrCreateSPIRVIntegerType (32 , MIRBuilder);
1832
1835
QueryResultType = GR->getOrCreateSPIRVVectorType (
1833
- IntTy, NumActualRetComponents, MIRBuilder);
1836
+ IntTy, NumActualRetComponents, MIRBuilder, true );
1834
1837
GR->assignSPIRVTypeToVReg (QueryResultType, QueryResult, MIRBuilder.getMF ());
1835
1838
}
1836
1839
bool IsDimBuf = ImgType->getOperand (2 ).getImm () == SPIRV::Dim::DIM_Buffer;
@@ -1987,7 +1990,7 @@ static bool generateReadImageInst(const StringRef DemangledCall,
1987
1990
1988
1991
if (Call->ReturnType ->getOpcode () != SPIRV::OpTypeVector) {
1989
1992
SPIRVType *TempType =
1990
- GR->getOrCreateSPIRVVectorType (Call->ReturnType , 4 , MIRBuilder);
1993
+ GR->getOrCreateSPIRVVectorType (Call->ReturnType , 4 , MIRBuilder, true );
1991
1994
Register TempRegister =
1992
1995
MRI->createGenericVirtualRegister (GR->getRegType (TempType));
1993
1996
MRI->setRegClass (TempRegister, GR->getRegClass (TempType));
@@ -2085,7 +2088,7 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
2085
2088
SPIRVType *Type =
2086
2089
Call->ReturnType
2087
2090
? Call->ReturnType
2088
- : GR->getOrCreateSPIRVTypeByName (ReturnType, MIRBuilder);
2091
+ : GR->getOrCreateSPIRVTypeByName (ReturnType, MIRBuilder, true );
2089
2092
if (!Type) {
2090
2093
std::string DiagMsg =
2091
2094
" Unable to recognize SPIRV type name: " + ReturnType;
@@ -2294,7 +2297,8 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
2294
2297
unsigned BitWidth = GR->getPointerSize () == 64 ? 64 : 32 ;
2295
2298
Type *BaseTy = IntegerType::get (MF.getFunction ().getContext (), BitWidth);
2296
2299
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 );
2298
2302
GlobalWorkSize = MRI->createVirtualRegister (&SPIRV::iIDRegClass);
2299
2303
GR->assignSPIRVTypeToVReg (SpvFieldTy, GlobalWorkSize, MF);
2300
2304
MIRBuilder.buildInstr (SPIRV::OpLoad)
@@ -2306,7 +2310,7 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
2306
2310
Const = GR->getOrCreateConstIntArray (0 , Size , *MIRBuilder.getInsertPt (),
2307
2311
SpvFieldTy, *ST.getInstrInfo ());
2308
2312
} else {
2309
- Const = GR->buildConstantInt (0 , MIRBuilder, SpvTy);
2313
+ Const = GR->buildConstantInt (0 , MIRBuilder, SpvTy, true );
2310
2314
}
2311
2315
if (!LocalWorkSize.isValid ())
2312
2316
LocalWorkSize = Const;
@@ -2332,7 +2336,8 @@ getOrCreateSPIRVDeviceEventPointer(MachineIRBuilder &MIRBuilder,
2332
2336
LLVMContext &Context = MIRBuilder.getMF ().getFunction ().getContext ();
2333
2337
unsigned SC1 = storageClassToAddressSpace (SPIRV::StorageClass::Generic);
2334
2338
Type *PtrType = PointerType::get (Context, SC1);
2335
- return GR->getOrCreateSPIRVType (PtrType, MIRBuilder);
2339
+ return GR->getOrCreateSPIRVType (PtrType, MIRBuilder,
2340
+ SPIRV::AccessQualifier::ReadWrite, true );
2336
2341
}
2337
2342
2338
2343
static bool buildEnqueueKernel (const SPIRV::IncomingCall *Call,
@@ -2481,7 +2486,7 @@ static bool generateAsyncCopy(const SPIRV::IncomingCall *Call,
2481
2486
SPIRVType *NewType =
2482
2487
Call->ReturnType ->getOpcode () == SPIRV::OpTypeEvent
2483
2488
? nullptr
2484
- : GR->getOrCreateSPIRVTypeByName (" spirv.Event" , MIRBuilder);
2489
+ : GR->getOrCreateSPIRVTypeByName (" spirv.Event" , MIRBuilder, true );
2485
2490
Register TypeReg = GR->getSPIRVTypeID (NewType ? NewType : Call->ReturnType );
2486
2491
unsigned NumArgs = Call->Arguments .size ();
2487
2492
Register EventReg = Call->Arguments [NumArgs - 1 ];
@@ -2984,12 +2989,13 @@ static SPIRVType *getCoopMatrType(const TargetExtType *ExtensionType,
2984
2989
assert (ExtensionType->getNumTypeParameters () == 1 &&
2985
2990
" SPIR-V coop matrices builtin type must have a type parameter!" );
2986
2991
const SPIRVType *ElemType =
2987
- GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder);
2992
+ GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder,
2993
+ SPIRV::AccessQualifier::ReadWrite, true );
2988
2994
// Create or get an existing type from GlobalRegistry.
2989
2995
return GR->getOrCreateOpTypeCoopMatr (
2990
2996
MIRBuilder, ExtensionType, ElemType, ExtensionType->getIntParameter (0 ),
2991
2997
ExtensionType->getIntParameter (1 ), ExtensionType->getIntParameter (2 ),
2992
- ExtensionType->getIntParameter (3 ));
2998
+ ExtensionType->getIntParameter (3 ), true );
2993
2999
}
2994
3000
2995
3001
static SPIRVType *
@@ -2999,7 +3005,8 @@ getImageType(const TargetExtType *ExtensionType,
2999
3005
assert (ExtensionType->getNumTypeParameters () == 1 &&
3000
3006
" SPIR-V image builtin type must have sampled type parameter!" );
3001
3007
const SPIRVType *SampledType =
3002
- GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder);
3008
+ GR->getOrCreateSPIRVType (ExtensionType->getTypeParameter (0 ), MIRBuilder,
3009
+ SPIRV::AccessQualifier::ReadWrite, true );
3003
3010
assert ((ExtensionType->getNumIntParameters () == 7 ||
3004
3011
ExtensionType->getNumIntParameters () == 6 ) &&
3005
3012
" Invalid number of parameters for SPIR-V image builtin!" );
0 commit comments