Skip to content

Commit 9a73710

Browse files
[SPIR-V] Improve type inference, addrspacecast and dependencies between SPIR-V entities and required capability/extensions (#94626)
This PR continues #94467 and contains fixes in emission of type intrinsics, constant recording and corresponding test cases: * type-deduce-global-dup.ll -- fix of integer constant emission on 32-bit platforms and correct type deduction for globals * type-deduce-simple-for.ll -- fix of GEP translation (there was an issue previously that led to incorrect translation/broken logic of for-range implementation) This PR also: * fixes a cast between identical storage classes and updates the test case to include validation run by spirv-val, * ensures that Bitcast for pointers satisfies the requirement that the address spaces must match and adds the corresponding test case, * improve encode in Tablegen and decode in code of dependencies between SPIR-V entities and required capability/extensions, * prevent emission of identical OpTypePointer instructions.
1 parent d3bcd9b commit 9a73710

15 files changed

+251
-98
lines changed

llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp

+6-13
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,8 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
243243
continue;
244244

245245
MetadataAsValue *VMD = cast<MetadataAsValue>(II->getOperand(1));
246-
Type *ElementTy = cast<ConstantAsMetadata>(VMD->getMetadata())->getType();
247-
if (isUntypedPointerTy(ElementTy))
248-
ElementTy =
249-
TypedPointerType::get(IntegerType::getInt8Ty(II->getContext()),
250-
getPointerAddressSpace(ElementTy));
246+
Type *ElementTy =
247+
toTypedPointer(cast<ConstantAsMetadata>(VMD->getMetadata())->getType());
251248
SPIRVType *ElementType = GR->getOrCreateSPIRVType(ElementTy, MIRBuilder);
252249
return GR->getOrCreateSPIRVPointerType(
253250
ElementType, MIRBuilder,
@@ -257,12 +254,8 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
257254

258255
// Replace PointerType with TypedPointerType to be able to map SPIR-V types to
259256
// LLVM types in a consistent manner
260-
if (isUntypedPointerTy(OriginalArgType)) {
261-
OriginalArgType =
262-
TypedPointerType::get(Type::getInt8Ty(F.getContext()),
263-
getPointerAddressSpace(OriginalArgType));
264-
}
265-
return GR->getOrCreateSPIRVType(OriginalArgType, MIRBuilder, ArgAccessQual);
257+
return GR->getOrCreateSPIRVType(toTypedPointer(OriginalArgType), MIRBuilder,
258+
ArgAccessQual);
266259
}
267260

268261
static SPIRV::ExecutionModel::ExecutionModel
@@ -386,8 +379,8 @@ bool SPIRVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
386379
Type *FRetTy = FTy->getReturnType();
387380
if (isUntypedPointerTy(FRetTy)) {
388381
if (Type *FRetElemTy = GR->findDeducedElementType(&F)) {
389-
TypedPointerType *DerivedTy =
390-
TypedPointerType::get(FRetElemTy, getPointerAddressSpace(FRetTy));
382+
TypedPointerType *DerivedTy = TypedPointerType::get(
383+
toTypedPointer(FRetElemTy), getPointerAddressSpace(FRetTy));
391384
GR->addReturnType(&F, DerivedTy);
392385
FRetTy = DerivedTy;
393386
}

llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp

+29-38
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ void initializeSPIRVEmitIntrinsicsPass(PassRegistry &);
5050
} // namespace llvm
5151

5252
namespace {
53+
54+
inline MetadataAsValue *buildMD(Value *Arg) {
55+
LLVMContext &Ctx = Arg->getContext();
56+
return MetadataAsValue::get(
57+
Ctx, MDNode::get(Ctx, ValueAsMetadata::getConstant(Arg)));
58+
}
59+
5360
class SPIRVEmitIntrinsics
5461
: public ModulePass,
5562
public InstVisitor<SPIRVEmitIntrinsics, Instruction *> {
@@ -84,12 +91,9 @@ class SPIRVEmitIntrinsics
8491
CallInst *buildIntrWithMD(Intrinsic::ID IntrID, ArrayRef<Type *> Types,
8592
Value *Arg, Value *Arg2, ArrayRef<Constant *> Imms,
8693
IRBuilder<> &B) {
87-
ConstantAsMetadata *CM = ValueAsMetadata::getConstant(Arg);
88-
MDTuple *TyMD = MDNode::get(F->getContext(), CM);
89-
MetadataAsValue *VMD = MetadataAsValue::get(F->getContext(), TyMD);
9094
SmallVector<Value *, 4> Args;
9195
Args.push_back(Arg2);
92-
Args.push_back(VMD);
96+
Args.push_back(buildMD(Arg));
9397
for (auto *Imm : Imms)
9498
Args.push_back(Imm);
9599
return B.CreateIntrinsic(IntrID, {Types}, Args);
@@ -228,20 +232,23 @@ void SPIRVEmitIntrinsics::buildAssignType(IRBuilder<> &B, Type *Ty,
228232
void SPIRVEmitIntrinsics::buildAssignPtr(IRBuilder<> &B, Type *ElemTy,
229233
Value *Arg) {
230234
Value *OfType = PoisonValue::get(ElemTy);
231-
CallInst *AssignPtrTyCI = buildIntrWithMD(
232-
Intrinsic::spv_assign_ptr_type, {Arg->getType()}, OfType, Arg,
233-
{B.getInt32(getPointerAddressSpace(Arg->getType()))}, B);
234-
GR->addDeducedElementType(AssignPtrTyCI, ElemTy);
235-
GR->addDeducedElementType(Arg, ElemTy);
236-
GR->addAssignPtrTypeInstr(Arg, AssignPtrTyCI);
235+
CallInst *AssignPtrTyCI = GR->findAssignPtrTypeInstr(Arg);
236+
if (AssignPtrTyCI == nullptr ||
237+
AssignPtrTyCI->getParent()->getParent() != F) {
238+
AssignPtrTyCI = buildIntrWithMD(
239+
Intrinsic::spv_assign_ptr_type, {Arg->getType()}, OfType, Arg,
240+
{B.getInt32(getPointerAddressSpace(Arg->getType()))}, B);
241+
GR->addDeducedElementType(AssignPtrTyCI, ElemTy);
242+
GR->addDeducedElementType(Arg, ElemTy);
243+
GR->addAssignPtrTypeInstr(Arg, AssignPtrTyCI);
244+
} else {
245+
updateAssignType(AssignPtrTyCI, Arg, OfType);
246+
}
237247
}
238248

239249
void SPIRVEmitIntrinsics::updateAssignType(CallInst *AssignCI, Value *Arg,
240250
Value *OfType) {
241-
LLVMContext &Ctx = Arg->getContext();
242-
AssignCI->setArgOperand(
243-
1, MetadataAsValue::get(
244-
Ctx, MDNode::get(Ctx, ValueAsMetadata::getConstant(OfType))));
251+
AssignCI->setArgOperand(1, buildMD(OfType));
245252
if (cast<IntrinsicInst>(AssignCI)->getIntrinsicID() !=
246253
Intrinsic::spv_assign_ptr_type)
247254
return;
@@ -560,9 +567,7 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(Instruction *I) {
560567
B.SetInsertPoint(F->getEntryBlock().getFirstNonPHIOrDbgOrAlloca());
561568
}
562569
SmallVector<Type *, 2> Types = {OpTy, OpTy};
563-
MetadataAsValue *VMD = MetadataAsValue::get(
564-
Ctx, MDNode::get(Ctx, ValueAsMetadata::getConstant(OpTyVal)));
565-
SmallVector<Value *, 2> Args = {Op, VMD,
570+
SmallVector<Value *, 2> Args = {Op, buildMD(OpTyVal),
566571
B.getInt32(getPointerAddressSpace(OpTy))};
567572
CallInst *PtrCastI =
568573
B.CreateIntrinsic(Intrinsic::spv_ptrcast, {Types}, Args);
@@ -689,8 +694,7 @@ Instruction *SPIRVEmitIntrinsics::visitCallInst(CallInst &Call) {
689694
Constant *TyC = UndefValue::get(IA->getFunctionType());
690695
MDString *ConstraintString = MDString::get(Ctx, IA->getConstraintString());
691696
SmallVector<Value *> Args = {
692-
MetadataAsValue::get(Ctx,
693-
MDNode::get(Ctx, ValueAsMetadata::getConstant(TyC))),
697+
buildMD(TyC),
694698
MetadataAsValue::get(Ctx, MDNode::get(Ctx, ConstraintString))};
695699
for (unsigned OpIdx = 0; OpIdx < Call.arg_size(); OpIdx++)
696700
Args.push_back(Call.getArgOperand(OpIdx));
@@ -822,12 +826,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
822826
return;
823827

824828
setInsertPointSkippingPhis(B, I);
825-
Constant *ExpectedElementTypeConst =
826-
Constant::getNullValue(ExpectedElementType);
827-
ConstantAsMetadata *CM =
828-
ValueAsMetadata::getConstant(ExpectedElementTypeConst);
829-
MDTuple *TyMD = MDNode::get(F->getContext(), CM);
830-
MetadataAsValue *VMD = MetadataAsValue::get(F->getContext(), TyMD);
829+
MetadataAsValue *VMD = buildMD(PoisonValue::get(ExpectedElementType));
831830
unsigned AddressSpace = getPointerAddressSpace(Pointer->getType());
832831
bool FirstPtrCastOrAssignPtrType = true;
833832

@@ -873,12 +872,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
873872
// spv_assign_ptr_type instead.
874873
if (FirstPtrCastOrAssignPtrType &&
875874
(isa<Instruction>(Pointer) || isa<Argument>(Pointer))) {
876-
CallInst *CI = buildIntrWithMD(
877-
Intrinsic::spv_assign_ptr_type, {Pointer->getType()},
878-
ExpectedElementTypeConst, Pointer, {B.getInt32(AddressSpace)}, B);
879-
GR->addDeducedElementType(CI, ExpectedElementType);
880-
GR->addDeducedElementType(Pointer, ExpectedElementType);
881-
GR->addAssignPtrTypeInstr(Pointer, CI);
875+
buildAssignPtr(B, ExpectedElementType, Pointer);
882876
return;
883877
}
884878

@@ -1167,12 +1161,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeIntrs(Instruction *I,
11671161

11681162
setInsertPointAfterDef(B, I);
11691163
Type *ElemTy = deduceElementType(I);
1170-
Constant *EltTyConst = UndefValue::get(ElemTy);
1171-
unsigned AddressSpace = getPointerAddressSpace(I->getType());
1172-
CallInst *CI = buildIntrWithMD(Intrinsic::spv_assign_ptr_type, {I->getType()},
1173-
EltTyConst, I, {B.getInt32(AddressSpace)}, B);
1174-
GR->addDeducedElementType(CI, ElemTy);
1175-
GR->addAssignPtrTypeInstr(I, CI);
1164+
buildAssignPtr(B, ElemTy, I);
11761165
}
11771166

11781167
void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
@@ -1407,12 +1396,14 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
14071396
continue;
14081397

14091398
insertAssignPtrTypeIntrs(I, B);
1410-
deduceOperandElementType(I);
14111399
insertAssignTypeIntrs(I, B);
14121400
insertPtrCastOrAssignTypeInstr(I, B);
14131401
insertSpirvDecorations(I, B);
14141402
}
14151403

1404+
for (auto &I : instructions(Func))
1405+
deduceOperandElementType(&I);
1406+
14161407
for (auto *I : Worklist) {
14171408
TrackConstants = true;
14181409
if (!I->getType()->isVoidTy() || isa<StoreInst>(I))

llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -742,8 +742,7 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeStruct(const StructType *Ty,
742742
bool EmitIR) {
743743
SmallVector<Register, 4> FieldTypes;
744744
for (const auto &Elem : Ty->elements()) {
745-
SPIRVType *ElemTy =
746-
findSPIRVType(toTypedPointer(Elem, Ty->getContext()), MIRBuilder);
745+
SPIRVType *ElemTy = findSPIRVType(toTypedPointer(Elem), MIRBuilder);
747746
assert(ElemTy && ElemTy->getOpcode() != SPIRV::OpTypeVoid &&
748747
"Invalid struct element type");
749748
FieldTypes.push_back(getSPIRVTypeID(ElemTy));

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,11 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
10861086

10871087
// don't generate a cast between identical storage classes
10881088
if (SrcSC == DstSC)
1089-
return true;
1089+
return BuildMI(*I.getParent(), I, I.getDebugLoc(),
1090+
TII.get(TargetOpcode::COPY))
1091+
.addDef(ResVReg)
1092+
.addUse(SrcPtr)
1093+
.constrainAllUses(TII, TRI, RBI);
10901094

10911095
// Casting from an eligible pointer to Generic.
10921096
if (DstSC == SPIRV::StorageClass::Generic && isGenericCastablePtr(SrcSC))
@@ -1121,10 +1125,13 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
11211125
if (SrcSC == SPIRV::StorageClass::CrossWorkgroup && isUSMStorageClass(DstSC))
11221126
return selectUnOp(ResVReg, ResType, I,
11231127
SPIRV::OpCrossWorkgroupCastToPtrINTEL);
1128+
if (isUSMStorageClass(SrcSC) && DstSC == SPIRV::StorageClass::Generic)
1129+
return selectUnOp(ResVReg, ResType, I, SPIRV::OpPtrCastToGeneric);
1130+
if (SrcSC == SPIRV::StorageClass::Generic && isUSMStorageClass(DstSC))
1131+
return selectUnOp(ResVReg, ResType, I, SPIRV::OpGenericCastToPtr);
11241132

1125-
// TODO Should this case just be disallowed completely?
1126-
// We're casting 2 other arbitrary address spaces, so have to bitcast.
1127-
return selectUnOp(ResVReg, ResType, I, SPIRV::OpBitcast);
1133+
// Bitcast for pointers requires that the address spaces must match
1134+
return false;
11281135
}
11291136

11301137
static unsigned getFCmpOpcode(unsigned PredNum) {

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category,
9595
if (ReqCaps.size() == 1) {
9696
auto Cap = ReqCaps[0];
9797
if (Reqs.isCapabilityAvailable(Cap))
98-
return {true, {Cap}, {}, ReqMinVer, ReqMaxVer};
98+
return {true, {Cap}, ReqExts, ReqMinVer, ReqMaxVer};
9999
} else {
100100
// By SPIR-V specification: "If an instruction, enumerant, or other
101101
// feature specifies multiple enabling capabilities, only one such
@@ -110,7 +110,7 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category,
110110
for (size_t i = 0, Sz = UseCaps.size(); i < Sz; ++i) {
111111
auto Cap = UseCaps[i];
112112
if (i == Sz - 1 || !AvoidCaps.S.contains(Cap))
113-
return {true, {Cap}, {}, ReqMinVer, ReqMaxVer};
113+
return {true, {Cap}, ReqExts, ReqMinVer, ReqMaxVer};
114114
}
115115
}
116116
}

llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ static void insertBitcasts(MachineFunction &MF, SPIRVGlobalRegistry *GR,
166166
}
167167
Register Def = MI.getOperand(0).getReg();
168168
Register Source = MI.getOperand(2).getReg();
169-
SPIRVType *BaseTy = GR->getOrCreateSPIRVType(
170-
getMDOperandAsType(MI.getOperand(3).getMetadata(), 0), MIB);
169+
Type *ElemTy = getMDOperandAsType(MI.getOperand(3).getMetadata(), 0);
170+
SPIRVType *BaseTy = GR->getOrCreateSPIRVType(ElemTy, MIB);
171171
SPIRVType *AssignedPtrType = GR->getOrCreateSPIRVPointerType(
172172
BaseTy, MI, *MF.getSubtarget<SPIRVSubtarget>().getInstrInfo(),
173173
addressSpaceToStorageClass(MI.getOperand(4).getImm(), *ST));
@@ -220,7 +220,7 @@ static SPIRVType *propagateSPIRVType(MachineInstr *MI, SPIRVGlobalRegistry *GR,
220220
MIB.setInsertPt(*MI->getParent(), MI);
221221
const GlobalValue *Global = MI->getOperand(1).getGlobal();
222222
Type *ElementTy = GR->getDeducedGlobalValueType(Global);
223-
auto *Ty = TypedPointerType::get(ElementTy,
223+
auto *Ty = TypedPointerType::get(toTypedPointer(ElementTy),
224224
Global->getType()->getAddressSpace());
225225
SpirvTy = GR->getOrCreateSPIRVType(Ty, MIB);
226226
break;
@@ -409,8 +409,8 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
409409
if (isSpvIntrinsic(MI, Intrinsic::spv_assign_ptr_type)) {
410410
Register Reg = MI.getOperand(1).getReg();
411411
MIB.setInsertPt(*MI.getParent(), MI.getIterator());
412-
SPIRVType *BaseTy = GR->getOrCreateSPIRVType(
413-
getMDOperandAsType(MI.getOperand(2).getMetadata(), 0), MIB);
412+
Type *ElementTy = getMDOperandAsType(MI.getOperand(2).getMetadata(), 0);
413+
SPIRVType *BaseTy = GR->getOrCreateSPIRVType(ElementTy, MIB);
414414
SPIRVType *AssignedPtrType = GR->getOrCreateSPIRVPointerType(
415415
BaseTy, MI, *MF.getSubtarget<SPIRVSubtarget>().getInstrInfo(),
416416
addressSpaceToStorageClass(MI.getOperand(3).getImm(), *ST));
@@ -453,6 +453,7 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
453453
Ty = TargetExtIt == TargetExtConstTypes.end()
454454
? MI.getOperand(1).getCImm()->getType()
455455
: TargetExtIt->second;
456+
GR->add(MI.getOperand(1).getCImm(), &MF, Reg);
456457
} else if (MIOp == TargetOpcode::G_FCONSTANT) {
457458
Ty = MI.getOperand(1).getFPImm()->getType();
458459
} else {

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

+27-27
Original file line numberDiff line numberDiff line change
@@ -689,34 +689,34 @@ class StorageClass<string name, bits<32> value> {
689689
bits<32> Value = value;
690690
}
691691

692-
multiclass StorageClassOperand<bits<32> value, list<Capability> reqCapabilities> {
692+
multiclass StorageClassOperand<bits<32> value, list<Extension> reqExtensions, list<Capability> reqCapabilities> {
693693
def : StorageClass<NAME, value>;
694-
defm : SymbolicOperandWithRequirements<StorageClassOperand, value, NAME, 0, 0, [], reqCapabilities>;
695-
}
696-
697-
defm UniformConstant : StorageClassOperand<0, []>;
698-
defm Input : StorageClassOperand<1, []>;
699-
defm Uniform : StorageClassOperand<2, [Shader]>;
700-
defm Output : StorageClassOperand<3, [Shader]>;
701-
defm Workgroup : StorageClassOperand<4, []>;
702-
defm CrossWorkgroup : StorageClassOperand<5, []>;
703-
defm Private : StorageClassOperand<6, [Shader]>;
704-
defm Function : StorageClassOperand<7, []>;
705-
defm Generic : StorageClassOperand<8, [GenericPointer]>;
706-
defm PushConstant : StorageClassOperand<9, [Shader]>;
707-
defm AtomicCounter : StorageClassOperand<10, [AtomicStorage]>;
708-
defm Image : StorageClassOperand<11, []>;
709-
defm StorageBuffer : StorageClassOperand<12, [Shader]>;
710-
defm CallableDataNV : StorageClassOperand<5328, [RayTracingNV]>;
711-
defm IncomingCallableDataNV : StorageClassOperand<5329, [RayTracingNV]>;
712-
defm RayPayloadNV : StorageClassOperand<5338, [RayTracingNV]>;
713-
defm HitAttributeNV : StorageClassOperand<5339, [RayTracingNV]>;
714-
defm IncomingRayPayloadNV : StorageClassOperand<5342, [RayTracingNV]>;
715-
defm ShaderRecordBufferNV : StorageClassOperand<5343, [RayTracingNV]>;
716-
defm PhysicalStorageBufferEXT : StorageClassOperand<5349, [PhysicalStorageBufferAddressesEXT]>;
717-
defm CodeSectionINTEL : StorageClassOperand<5605, [FunctionPointersINTEL]>;
718-
defm DeviceOnlyINTEL : StorageClassOperand<5936, [USMStorageClassesINTEL]>;
719-
defm HostOnlyINTEL : StorageClassOperand<5937, [USMStorageClassesINTEL]>;
694+
defm : SymbolicOperandWithRequirements<StorageClassOperand, value, NAME, 0, 0, reqExtensions, reqCapabilities>;
695+
}
696+
697+
defm UniformConstant : StorageClassOperand<0, [], []>;
698+
defm Input : StorageClassOperand<1, [], []>;
699+
defm Uniform : StorageClassOperand<2, [], [Shader]>;
700+
defm Output : StorageClassOperand<3, [], [Shader]>;
701+
defm Workgroup : StorageClassOperand<4, [], []>;
702+
defm CrossWorkgroup : StorageClassOperand<5, [], []>;
703+
defm Private : StorageClassOperand<6, [], [Shader]>;
704+
defm Function : StorageClassOperand<7, [], []>;
705+
defm Generic : StorageClassOperand<8, [], [GenericPointer]>;
706+
defm PushConstant : StorageClassOperand<9, [], [Shader]>;
707+
defm AtomicCounter : StorageClassOperand<10, [], [AtomicStorage]>;
708+
defm Image : StorageClassOperand<11, [], []>;
709+
defm StorageBuffer : StorageClassOperand<12, [], [Shader]>;
710+
defm CallableDataNV : StorageClassOperand<5328, [], [RayTracingNV]>;
711+
defm IncomingCallableDataNV : StorageClassOperand<5329, [], [RayTracingNV]>;
712+
defm RayPayloadNV : StorageClassOperand<5338, [], [RayTracingNV]>;
713+
defm HitAttributeNV : StorageClassOperand<5339, [], [RayTracingNV]>;
714+
defm IncomingRayPayloadNV : StorageClassOperand<5342, [], [RayTracingNV]>;
715+
defm ShaderRecordBufferNV : StorageClassOperand<5343, [], [RayTracingNV]>;
716+
defm PhysicalStorageBufferEXT : StorageClassOperand<5349, [], [PhysicalStorageBufferAddressesEXT]>;
717+
defm CodeSectionINTEL : StorageClassOperand<5605, [SPV_INTEL_function_pointers], [FunctionPointersINTEL]>;
718+
defm DeviceOnlyINTEL : StorageClassOperand<5936, [SPV_INTEL_usm_storage_classes], [USMStorageClassesINTEL]>;
719+
defm HostOnlyINTEL : StorageClassOperand<5937, [SPV_INTEL_usm_storage_classes], [USMStorageClassesINTEL]>;
720720

721721
//===----------------------------------------------------------------------===//
722722
// Multiclass used to define Dim enum values and at the same time

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ bool isSpvIntrinsic(const MachineInstr &MI, Intrinsic::ID IntrinsicID) {
280280

281281
Type *getMDOperandAsType(const MDNode *N, unsigned I) {
282282
Type *ElementTy = cast<ValueAsMetadata>(N->getOperand(I))->getType();
283-
return toTypedPointer(ElementTy, N->getContext());
283+
return toTypedPointer(ElementTy);
284284
}
285285

286286
// The set of names is borrowed from the SPIR-V translator.

llvm/lib/Target/SPIRV/SPIRVUtils.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ inline bool isTypedPointerTy(const Type *T) {
113113

114114
// True if this is an instance of PointerType.
115115
inline bool isUntypedPointerTy(const Type *T) {
116-
return T->getTypeID() == Type::PointerTyID;
116+
return T && T->getTypeID() == Type::PointerTyID;
117117
}
118118

119119
// True if this is an instance of PointerType or TypedPointerType.
@@ -153,9 +153,9 @@ inline Type *reconstructFunctionType(Function *F) {
153153
return FunctionType::get(F->getReturnType(), ArgTys, F->isVarArg());
154154
}
155155

156-
inline Type *toTypedPointer(Type *Ty, LLVMContext &Ctx) {
156+
inline Type *toTypedPointer(Type *Ty) {
157157
return isUntypedPointerTy(Ty)
158-
? TypedPointerType::get(IntegerType::getInt8Ty(Ctx),
158+
? TypedPointerType::get(IntegerType::getInt8Ty(Ty->getContext()),
159159
getPointerAddressSpace(Ty))
160160
: Ty;
161161
}

llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_usm_storage_classes/intel-usm-addrspaces.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
; Modified from: https://github.com/KhronosGroup/SPIRV-LLVM-Translator/test/extensions/INTEL/SPV_INTEL_usm_storage_classes/intel_usm_addrspaces.ll
22

33
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_usm_storage_classes %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-EXT
4-
; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_usm_storage_classes %s -o - -filetype=obj | spirv-val %}
4+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_usm_storage_classes %s -o - -filetype=obj | spirv-val %}
55
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-WITHOUT
6-
; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
77

88
; CHECK-: Capability USMStorageClassesINTEL
99
; CHECK-SPIRV-WITHOUT-NO: Capability USMStorageClassesINTEL

llvm/test/CodeGen/SPIRV/passes/SPIRVEmitIntrinsics-no-divergent-spv_assign_ptr_type.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
define spir_kernel void @test_pointer_cast(ptr addrspace(1) %src) {
77
; CHECK-NOT: call{{.*}} void @llvm.spv.assign.ptr.type.p1(ptr addrspace(1) %src, metadata i8 undef, i32 1)
8-
; CHECK: call{{.*}} void @llvm.spv.assign.ptr.type.p1(ptr addrspace(1) %src, metadata i32 0, i32 1)
8+
; CHECK: call{{.*}} void @llvm.spv.assign.ptr.type.p1(ptr addrspace(1) %src, metadata i32 poison, i32 1)
99
%b = bitcast ptr addrspace(1) %src to ptr addrspace(1)
1010
%g = getelementptr inbounds i32, ptr addrspace(1) %b, i64 52
1111
ret void

0 commit comments

Comments
 (0)