Skip to content

Commit f15671d

Browse files
remove EmitIR default call chains
1 parent cfe50c1 commit f15671d

File tree

8 files changed

+123
-92
lines changed

8 files changed

+123
-92
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 28 additions & 23 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);
@@ -480,8 +480,8 @@ static bool buildSelectInst(MachineIRBuilder &MIRBuilder,
480480
GR->getOrCreateConsIntVector(AllOnes, MIRBuilder, ReturnType, true);
481481
FalseConst = GR->getOrCreateConsIntVector(0, MIRBuilder, ReturnType, true);
482482
} else {
483-
TrueConst = GR->buildConstantInt(1, MIRBuilder, ReturnType);
484-
FalseConst = GR->buildConstantInt(0, MIRBuilder, ReturnType);
483+
TrueConst = GR->buildConstantInt(1, MIRBuilder, ReturnType, true);
484+
FalseConst = GR->buildConstantInt(0, MIRBuilder, ReturnType, true);
485485
}
486486

487487
return MIRBuilder.buildSelect(ReturnRegister, SourceRegister, TrueConst,
@@ -581,8 +581,8 @@ static SPIRV::Scope::Scope getSPIRVScope(SPIRV::CLMemoryScope ClScope) {
581581
static Register buildConstantIntReg32(uint64_t Val,
582582
MachineIRBuilder &MIRBuilder,
583583
SPIRVGlobalRegistry *GR) {
584-
return GR->buildConstantInt(Val, MIRBuilder,
585-
GR->getOrCreateSPIRVIntegerType(32, MIRBuilder));
584+
return GR->buildConstantInt(
585+
Val, MIRBuilder, GR->getOrCreateSPIRVIntegerType(32, MIRBuilder), true);
586586
}
587587

588588
static Register buildScopeReg(Register CLScopeRegister,
@@ -1153,7 +1153,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11531153

11541154
Register Arg0;
11551155
if (GroupBuiltin->HasBoolArg) {
1156-
SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder);
1156+
SPIRVType *BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
11571157
Register BoolReg = Call->Arguments[0];
11581158
SPIRVType *BoolRegType = GR->getSPIRVTypeForVReg(BoolReg);
11591159
if (!BoolRegType)
@@ -1162,14 +1162,15 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11621162
if (ArgInstruction->getOpcode() == TargetOpcode::G_CONSTANT) {
11631163
if (BoolRegType->getOpcode() != SPIRV::OpTypeBool)
11641164
Arg0 = GR->buildConstantInt(getIConstVal(BoolReg, MRI), MIRBuilder,
1165-
BoolType);
1165+
BoolType, true);
11661166
} else {
11671167
if (BoolRegType->getOpcode() == SPIRV::OpTypeInt) {
11681168
Arg0 = MRI->createGenericVirtualRegister(LLT::scalar(1));
11691169
MRI->setRegClass(Arg0, &SPIRV::iIDRegClass);
11701170
GR->assignSPIRVTypeToVReg(BoolType, Arg0, MIRBuilder.getMF());
1171-
MIRBuilder.buildICmp(CmpInst::ICMP_NE, Arg0, BoolReg,
1172-
GR->buildConstantInt(0, MIRBuilder, BoolRegType));
1171+
MIRBuilder.buildICmp(
1172+
CmpInst::ICMP_NE, Arg0, BoolReg,
1173+
GR->buildConstantInt(0, MIRBuilder, BoolRegType, true));
11731174
insertAssignInstr(Arg0, nullptr, BoolType, GR, MIRBuilder,
11741175
MIRBuilder.getMF().getRegInfo());
11751176
} else if (BoolRegType->getOpcode() != SPIRV::OpTypeBool) {
@@ -1214,7 +1215,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
12141215
LLT::fixed_vector(VecLen, MRI->getType(ElemReg)));
12151216
MRI->setRegClass(VecReg, &SPIRV::vIDRegClass);
12161217
SPIRVType *VecType =
1217-
GR->getOrCreateSPIRVVectorType(ElemType, VecLen, MIRBuilder);
1218+
GR->getOrCreateSPIRVVectorType(ElemType, VecLen, MIRBuilder, true);
12181219
GR->assignSPIRVTypeToVReg(VecType, VecReg, MIRBuilder.getMF());
12191220
auto MIB =
12201221
MIRBuilder.buildInstr(TargetOpcode::G_BUILD_VECTOR).addDef(VecReg);
@@ -1462,7 +1463,7 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
14621463
MIRBuilder.buildCopy(DefaultReg, NewRegister);
14631464
} else { // If it could be in range, we need to load from the given builtin.
14641465
auto Vec3Ty =
1465-
GR->getOrCreateSPIRVVectorType(PointerSizeType, 3, MIRBuilder);
1466+
GR->getOrCreateSPIRVVectorType(PointerSizeType, 3, MIRBuilder, true);
14661467
Register LoadedVector =
14671468
buildBuiltinVariableLoad(MIRBuilder, Vec3Ty, GR, BuiltinValue,
14681469
LLT::fixed_vector(3, PointerSize));
@@ -1485,7 +1486,7 @@ static bool genWorkgroupQuery(const SPIRV::IncomingCall *Call,
14851486
*MRI);
14861487

14871488
auto IndexType = GR->getSPIRVTypeForVReg(IndexRegister);
1488-
auto BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder);
1489+
auto BoolType = GR->getOrCreateSPIRVBoolType(MIRBuilder, true);
14891490

14901491
Register CompareRegister =
14911492
MRI->createGenericVirtualRegister(LLT::scalar(1));
@@ -1814,7 +1815,7 @@ static bool generateImageSizeQueryInst(const SPIRV::IncomingCall *Call,
18141815
MIRBuilder.getMRI()->setRegClass(QueryResult, &SPIRV::vIDRegClass);
18151816
SPIRVType *IntTy = GR->getOrCreateSPIRVIntegerType(32, MIRBuilder);
18161817
QueryResultType = GR->getOrCreateSPIRVVectorType(
1817-
IntTy, NumActualRetComponents, MIRBuilder);
1818+
IntTy, NumActualRetComponents, MIRBuilder, true);
18181819
GR->assignSPIRVTypeToVReg(QueryResultType, QueryResult, MIRBuilder.getMF());
18191820
}
18201821
bool IsDimBuf = ImgType->getOperand(2).getImm() == SPIRV::Dim::DIM_Buffer;
@@ -1971,7 +1972,7 @@ static bool generateReadImageInst(const StringRef DemangledCall,
19711972

19721973
if (Call->ReturnType->getOpcode() != SPIRV::OpTypeVector) {
19731974
SPIRVType *TempType =
1974-
GR->getOrCreateSPIRVVectorType(Call->ReturnType, 4, MIRBuilder);
1975+
GR->getOrCreateSPIRVVectorType(Call->ReturnType, 4, MIRBuilder, true);
19751976
Register TempRegister =
19761977
MRI->createGenericVirtualRegister(GR->getRegType(TempType));
19771978
MRI->setRegClass(TempRegister, GR->getRegClass(TempType));
@@ -2069,7 +2070,7 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
20692070
SPIRVType *Type =
20702071
Call->ReturnType
20712072
? Call->ReturnType
2072-
: GR->getOrCreateSPIRVTypeByName(ReturnType, MIRBuilder);
2073+
: GR->getOrCreateSPIRVTypeByName(ReturnType, MIRBuilder, true);
20732074
if (!Type) {
20742075
std::string DiagMsg =
20752076
"Unable to recognize SPIRV type name: " + ReturnType;
@@ -2267,7 +2268,8 @@ static bool buildNDRange(const SPIRV::IncomingCall *Call,
22672268
unsigned BitWidth = GR->getPointerSize() == 64 ? 64 : 32;
22682269
Type *BaseTy = IntegerType::get(MF.getFunction().getContext(), BitWidth);
22692270
Type *FieldTy = ArrayType::get(BaseTy, Size);
2270-
SPIRVType *SpvFieldTy = GR->getOrCreateSPIRVType(FieldTy, MIRBuilder);
2271+
SPIRVType *SpvFieldTy = GR->getOrCreateSPIRVType(
2272+
FieldTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
22712273
GlobalWorkSize = MRI->createVirtualRegister(&SPIRV::iIDRegClass);
22722274
GR->assignSPIRVTypeToVReg(SpvFieldTy, GlobalWorkSize, MF);
22732275
MIRBuilder.buildInstr(SPIRV::OpLoad)
@@ -2305,7 +2307,8 @@ getOrCreateSPIRVDeviceEventPointer(MachineIRBuilder &MIRBuilder,
23052307
LLVMContext &Context = MIRBuilder.getMF().getFunction().getContext();
23062308
unsigned SC1 = storageClassToAddressSpace(SPIRV::StorageClass::Generic);
23072309
Type *PtrType = PointerType::get(Context, SC1);
2308-
return GR->getOrCreateSPIRVType(PtrType, MIRBuilder);
2310+
return GR->getOrCreateSPIRVType(PtrType, MIRBuilder,
2311+
SPIRV::AccessQualifier::ReadWrite, true);
23092312
}
23102313

23112314
static bool buildEnqueueKernel(const SPIRV::IncomingCall *Call,
@@ -2454,7 +2457,7 @@ static bool generateAsyncCopy(const SPIRV::IncomingCall *Call,
24542457
SPIRVType *NewType =
24552458
Call->ReturnType->getOpcode() == SPIRV::OpTypeEvent
24562459
? nullptr
2457-
: GR->getOrCreateSPIRVTypeByName("spirv.Event", MIRBuilder);
2460+
: GR->getOrCreateSPIRVTypeByName("spirv.Event", MIRBuilder, true);
24582461
Register TypeReg = GR->getSPIRVTypeID(NewType ? NewType : Call->ReturnType);
24592462
unsigned NumArgs = Call->Arguments.size();
24602463
Register EventReg = Call->Arguments[NumArgs - 1];
@@ -2955,12 +2958,13 @@ static SPIRVType *getCoopMatrType(const TargetExtType *ExtensionType,
29552958
assert(ExtensionType->getNumTypeParameters() == 1 &&
29562959
"SPIR-V coop matrices builtin type must have a type parameter!");
29572960
const SPIRVType *ElemType =
2958-
GR->getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder);
2961+
GR->getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder,
2962+
SPIRV::AccessQualifier::ReadWrite, true);
29592963
// Create or get an existing type from GlobalRegistry.
29602964
return GR->getOrCreateOpTypeCoopMatr(
29612965
MIRBuilder, ExtensionType, ElemType, ExtensionType->getIntParameter(0),
29622966
ExtensionType->getIntParameter(1), ExtensionType->getIntParameter(2),
2963-
ExtensionType->getIntParameter(3));
2967+
ExtensionType->getIntParameter(3), true);
29642968
}
29652969

29662970
static SPIRVType *
@@ -2970,7 +2974,8 @@ getImageType(const TargetExtType *ExtensionType,
29702974
assert(ExtensionType->getNumTypeParameters() == 1 &&
29712975
"SPIR-V image builtin type must have sampled type parameter!");
29722976
const SPIRVType *SampledType =
2973-
GR->getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder);
2977+
GR->getOrCreateSPIRVType(ExtensionType->getTypeParameter(0), MIRBuilder,
2978+
SPIRV::AccessQualifier::ReadWrite, true);
29742979
assert((ExtensionType->getNumIntParameters() == 7 ||
29752980
ExtensionType->getNumIntParameters() == 6) &&
29762981
"Invalid number of parameters for SPIR-V image builtin!");

llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp

Lines changed: 19 additions & 10 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);
@@ -586,7 +594,8 @@ bool SPIRVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
586594
ArgTy = Arg.Ty;
587595
}
588596
if (ArgTy) {
589-
SpvType = GR->getOrCreateSPIRVType(ArgTy, MIRBuilder);
597+
SpvType = GR->getOrCreateSPIRVType(
598+
ArgTy, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true);
590599
GR->assignSPIRVTypeToVReg(SpvType, ArgReg, MF);
591600
}
592601
}

0 commit comments

Comments
 (0)