Skip to content

Commit d21b2e6

Browse files
[SPIR-V] Fix generation of gMIR vs. SPIR-V code from utility methods (#128159)
The SPIR-V Backend uses the same set of utility functions, mostly though not entirely from SPIRVGlobalRegistry, to generate gMIR and SPIR-V opcodes, depending on the current stage of translation. This is controlled by an explicit EmitIR flag rather than the current translation pass, and there are legacy pieces of code where the EmitIR flag is declared so that it has a default true value, allowing using utility functions without explicitly declaring their intent to work either in gMIR or in SPIR-V part of the lowering process. While it may be ok to leave this default EmitIR flag as is in generation of scalar integer/float types, as we don't expect to see any dependent opcodes derived from such OpTypeXXX instructions, using of EmitIR by default in aggregation types is a source of hidden logical flaws and actual issues. This PR provides a partial fix to the problem by removing default status of EmitIR, requiring a user call site to explicitly announce its intent to generate gMIR or SPIR-V code, fixes several cases of misuse of EmitIR, and, the most important, fixes a nasty logical error that breaks passing of actually asked EmitIR value by the default value in the middle of the chain of calls, in the `findSPIRVType` call. The latter error was a source of issues in the post-instruction selection pass that has been getting gMIR code where SPIR-V was explicitly requested due to overloaded with default parameters internal API in SPIRVGlobalRegistry (most notably, `findSPIRVType`).
1 parent 089f988 commit d21b2e6

11 files changed

+190
-141
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -445,12 +445,12 @@ static std::tuple<Register, SPIRVType *>
445445
buildBoolRegister(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) {
580581
static 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

587588
static 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

23382343
static 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

29953001
static 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!");

llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,15 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
209209
// If OriginalArgType is non-pointer, use the OriginalArgType (the type cannot
210210
// be legally reassigned later).
211211
if (!isPointerTy(OriginalArgType))
212-
return GR->getOrCreateSPIRVType(OriginalArgType, MIRBuilder, ArgAccessQual);
212+
return GR->getOrCreateSPIRVType(OriginalArgType, MIRBuilder, ArgAccessQual,
213+
true);
213214

214215
Argument *Arg = F.getArg(ArgIdx);
215216
Type *ArgType = Arg->getType();
216217
if (isTypedPointerTy(ArgType)) {
217218
SPIRVType *ElementType = GR->getOrCreateSPIRVType(
218-
cast<TypedPointerType>(ArgType)->getElementType(), MIRBuilder);
219+
cast<TypedPointerType>(ArgType)->getElementType(), MIRBuilder,
220+
SPIRV::AccessQualifier::ReadWrite, true);
219221
return GR->getOrCreateSPIRVPointerType(
220222
ElementType, MIRBuilder,
221223
addressSpaceToStorageClass(getPointerAddressSpace(ArgType), ST));
@@ -231,7 +233,8 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
231233
// type.
232234
if (hasPointeeTypeAttr(Arg)) {
233235
SPIRVType *ElementType =
234-
GR->getOrCreateSPIRVType(getPointeeTypeByAttr(Arg), MIRBuilder);
236+
GR->getOrCreateSPIRVType(getPointeeTypeByAttr(Arg), MIRBuilder,
237+
SPIRV::AccessQualifier::ReadWrite, true);
235238
return GR->getOrCreateSPIRVPointerType(
236239
ElementType, MIRBuilder,
237240
addressSpaceToStorageClass(getPointerAddressSpace(ArgType), ST));
@@ -245,7 +248,8 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
245248
Type *BuiltinType =
246249
cast<ConstantAsMetadata>(VMD->getMetadata())->getType();
247250
assert(BuiltinType->isTargetExtTy() && "Expected TargetExtType");
248-
return GR->getOrCreateSPIRVType(BuiltinType, MIRBuilder, ArgAccessQual);
251+
return GR->getOrCreateSPIRVType(BuiltinType, MIRBuilder, ArgAccessQual,
252+
true);
249253
}
250254

251255
// Check if this is spv_assign_ptr_type assigning pointer element type.
@@ -255,7 +259,8 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
255259
MetadataAsValue *VMD = cast<MetadataAsValue>(II->getOperand(1));
256260
Type *ElementTy =
257261
toTypedPointer(cast<ConstantAsMetadata>(VMD->getMetadata())->getType());
258-
SPIRVType *ElementType = GR->getOrCreateSPIRVType(ElementTy, MIRBuilder);
262+
SPIRVType *ElementType = GR->getOrCreateSPIRVType(
263+
ElementTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
259264
return GR->getOrCreateSPIRVPointerType(
260265
ElementType, MIRBuilder,
261266
addressSpaceToStorageClass(
@@ -265,7 +270,7 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
265270
// Replace PointerType with TypedPointerType to be able to map SPIR-V types to
266271
// LLVM types in a consistent manner
267272
return GR->getOrCreateSPIRVType(toTypedPointer(OriginalArgType), MIRBuilder,
268-
ArgAccessQual);
273+
ArgAccessQual, true);
269274
}
270275

271276
static SPIRV::ExecutionModel::ExecutionModel
@@ -405,7 +410,8 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
405410
FRetTy = DerivedTy;
406411
}
407412
}
408-
SPIRVType *RetTy = GR->getOrCreateSPIRVType(FRetTy, MIRBuilder);
413+
SPIRVType *RetTy = GR->getOrCreateSPIRVType(
414+
FRetTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
409415
FTy = fixFunctionTypeIfPtrArgs(GR, F, FTy, RetTy, ArgTypeVRegs);
410416
SPIRVType *FuncTy = GR->getOrCreateOpTypeFunctionWithArgs(
411417
FTy, RetTy, ArgTypeVRegs, MIRBuilder);
@@ -486,10 +492,12 @@ void SPIRVCallLowering::produceIndirectPtrTypes(
486492
// Create indirect call data types if any
487493
MachineFunction &MF = MIRBuilder.getMF();
488494
for (auto const &IC : IndirectCalls) {
489-
SPIRVType *SpirvRetTy = GR->getOrCreateSPIRVType(IC.RetTy, MIRBuilder);
495+
SPIRVType *SpirvRetTy = GR->getOrCreateSPIRVType(
496+
IC.RetTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
490497
SmallVector<SPIRVType *, 4> SpirvArgTypes;
491498
for (size_t i = 0; i < IC.ArgTys.size(); ++i) {
492-
SPIRVType *SPIRVTy = GR->getOrCreateSPIRVType(IC.ArgTys[i], MIRBuilder);
499+
SPIRVType *SPIRVTy = GR->getOrCreateSPIRVType(
500+
IC.ArgTys[i], MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
493501
SpirvArgTypes.push_back(SPIRVTy);
494502
if (!GR->getSPIRVTypeForVReg(IC.ArgRegs[i]))
495503
GR->assignSPIRVTypeToVReg(SPIRVTy, IC.ArgRegs[i], MF);
@@ -557,10 +565,12 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
557565
RetTy =
558566
TypedPointerType::get(ElemTy, PtrRetTy->getAddressSpace());
559567
}
560-
setRegClassType(ResVReg, RetTy, GR, MIRBuilder);
568+
setRegClassType(ResVReg, RetTy, GR, MIRBuilder,
569+
SPIRV::AccessQualifier::ReadWrite, true);
561570
}
562571
} else {
563-
ResVReg = createVirtualRegister(OrigRetTy, GR, MIRBuilder);
572+
ResVReg = createVirtualRegister(OrigRetTy, GR, MIRBuilder,
573+
SPIRV::AccessQualifier::ReadWrite, true);
564574
}
565575
SmallVector<Register, 8> ArgVRegs;
566576
for (auto Arg : Info.OrigArgs) {
@@ -584,7 +594,8 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
584594
ArgTy = Arg.Ty;
585595
}
586596
if (ArgTy) {
587-
SpvType = GR->getOrCreateSPIRVType(ArgTy, MIRBuilder);
597+
SpvType = GR->getOrCreateSPIRVType(
598+
ArgTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
588599
GR->assignSPIRVTypeToVReg(SpvType, ArgReg, MF);
589600
}
590601
}
@@ -669,7 +680,8 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
669680
// Make sure there's a valid return reg, even for functions returning void.
670681
if (!ResVReg.isValid())
671682
ResVReg = MIRBuilder.getMRI()->createVirtualRegister(&SPIRV::iIDRegClass);
672-
SPIRVType *RetType = GR->assignTypeToVReg(OrigRetTy, ResVReg, MIRBuilder);
683+
SPIRVType *RetType = GR->assignTypeToVReg(
684+
OrigRetTy, ResVReg, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
673685

674686
// Emit the call instruction and its args.
675687
auto MIB = MIRBuilder.buildInstr(CallOp)

llvm/lib/Target/SPIRV/SPIRVEmitNonSemanticDI.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ bool SPIRVEmitNonSemanticDI::emitGlobalDI(MachineFunction &MF) {
193193
};
194194

195195
const SPIRVType *VoidTy =
196-
GR->getOrCreateSPIRVType(Type::getVoidTy(*Context), MIRBuilder);
196+
GR->getOrCreateSPIRVType(Type::getVoidTy(*Context), MIRBuilder,
197+
SPIRV::AccessQualifier::ReadWrite, false);
197198

198199
const auto EmitDIInstruction =
199200
[&](SPIRV::NonSemanticExtInst::NonSemanticExtInst Inst,
@@ -217,7 +218,8 @@ bool SPIRVEmitNonSemanticDI::emitGlobalDI(MachineFunction &MF) {
217218
};
218219

219220
const SPIRVType *I32Ty =
220-
GR->getOrCreateSPIRVType(Type::getInt32Ty(*Context), MIRBuilder);
221+
GR->getOrCreateSPIRVType(Type::getInt32Ty(*Context), MIRBuilder,
222+
SPIRV::AccessQualifier::ReadWrite, false);
221223

222224
const Register DwarfVersionReg =
223225
GR->buildConstantInt(DwarfVersion, MIRBuilder, I32Ty, false);

0 commit comments

Comments
 (0)