Skip to content

Commit f4c6727

Browse files
account for possible <1 x LLVM Type> input
1 parent 7211bf4 commit f4c6727

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ Type *SPIRVEmitIntrinsics::reconstructType(Value *Op, bool UnknownElemTypeI8,
427427

428428
void SPIRVEmitIntrinsics::buildAssignType(IRBuilder<> &B, Type *Ty,
429429
Value *Arg) {
430-
Value *OfType = PoisonValue::get(Ty);
430+
Value *OfType = getNormalizedPoisonValue(Ty);
431431
CallInst *AssignCI = nullptr;
432432
if (Arg->getType()->isAggregateType() && Ty->isAggregateType() &&
433433
allowEmitFakeUse(Arg)) {
@@ -447,6 +447,7 @@ void SPIRVEmitIntrinsics::buildAssignType(IRBuilder<> &B, Type *Ty,
447447

448448
void SPIRVEmitIntrinsics::buildAssignPtr(IRBuilder<> &B, Type *ElemTy,
449449
Value *Arg) {
450+
ElemTy = normalizeType(ElemTy);
450451
Value *OfType = PoisonValue::get(ElemTy);
451452
CallInst *AssignPtrTyCI = GR->findAssignPtrTypeInstr(Arg);
452453
if (AssignPtrTyCI == nullptr ||
@@ -470,7 +471,7 @@ void SPIRVEmitIntrinsics::updateAssignType(CallInst *AssignCI, Value *Arg,
470471
return;
471472

472473
// update association with the pointee type
473-
Type *ElemTy = OfType->getType();
474+
Type *ElemTy = normalizeType(OfType->getType());
474475
GR->addDeducedElementType(AssignCI, ElemTy);
475476
GR->addDeducedElementType(Arg, ElemTy);
476477
}
@@ -490,7 +491,7 @@ CallInst *SPIRVEmitIntrinsics::buildSpvPtrcast(Function *F, Value *Op,
490491
}
491492
Type *OpTy = Op->getType();
492493
SmallVector<Type *, 2> Types = {OpTy, OpTy};
493-
SmallVector<Value *, 2> Args = {Op, buildMD(PoisonValue::get(ElemTy)),
494+
SmallVector<Value *, 2> Args = {Op, buildMD(getNormalizedPoisonValue(ElemTy)),
494495
B.getInt32(getPointerAddressSpace(OpTy))};
495496
CallInst *PtrCasted =
496497
B.CreateIntrinsic(Intrinsic::spv_ptrcast, {Types}, Args);
@@ -766,7 +767,7 @@ Type *SPIRVEmitIntrinsics::deduceElementTypeHelper(
766767
// remember the found relationship
767768
if (Ty && !IgnoreKnownType) {
768769
// specify nested types if needed, otherwise return unchanged
769-
GR->addDeducedElementType(I, Ty);
770+
GR->addDeducedElementType(I, normalizeType(Ty));
770771
}
771772

772773
return Ty;
@@ -852,7 +853,7 @@ Type *SPIRVEmitIntrinsics::deduceNestedTypeHelper(
852853
}
853854
if (Ty != OpTy) {
854855
Type *NewTy = VectorType::get(Ty, VecTy->getElementCount());
855-
GR->addDeducedCompositeType(U, NewTy);
856+
GR->addDeducedCompositeType(U, normalizeType(NewTy));
856857
return NewTy;
857858
}
858859
}
@@ -990,6 +991,7 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeFunctionRet(
990991
if (KnownElemTy)
991992
return false;
992993
if (Type *OpElemTy = GR->findDeducedElementType(Op)) {
994+
OpElemTy = normalizeType(OpElemTy);
993995
GR->addDeducedElementType(F, OpElemTy);
994996
GR->addReturnType(
995997
F, TypedPointerType::get(OpElemTy,
@@ -1002,7 +1004,7 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeFunctionRet(
10021004
continue;
10031005
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr(CI)) {
10041006
if (Type *PrevElemTy = GR->findDeducedElementType(CI)) {
1005-
updateAssignType(AssignCI, CI, PoisonValue::get(OpElemTy));
1007+
updateAssignType(AssignCI, CI, getNormalizedPoisonValue(OpElemTy));
10061008
propagateElemType(CI, PrevElemTy, VisitedSubst);
10071009
}
10081010
}
@@ -1162,11 +1164,11 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(
11621164
Type *Ty = AskTy ? AskTy : GR->findDeducedElementType(Op);
11631165
if (Ty == KnownElemTy)
11641166
continue;
1165-
Value *OpTyVal = PoisonValue::get(KnownElemTy);
1167+
Value *OpTyVal = getNormalizedPoisonValue(KnownElemTy);
11661168
Type *OpTy = Op->getType();
11671169
if (!Ty || AskTy || isUntypedPointerTy(Ty) || isTodoType(Op)) {
11681170
Type *PrevElemTy = GR->findDeducedElementType(Op);
1169-
GR->addDeducedElementType(Op, KnownElemTy);
1171+
GR->addDeducedElementType(Op, normalizeType(KnownElemTy));
11701172
// check if KnownElemTy is complete
11711173
if (!Uncomplete)
11721174
eraseTodoType(Op);
@@ -1492,7 +1494,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeTargetExt(
14921494

14931495
// Our previous guess about the type seems to be wrong, let's update
14941496
// inferred type according to a new, more precise type information.
1495-
updateAssignType(AssignCI, V, PoisonValue::get(AssignedType));
1497+
updateAssignType(AssignCI, V, getNormalizedPoisonValue(AssignedType));
14961498
}
14971499

14981500
void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
@@ -1507,7 +1509,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
15071509
return;
15081510

15091511
setInsertPointSkippingPhis(B, I);
1510-
Value *ExpectedElementVal = PoisonValue::get(ExpectedElementType);
1512+
Value *ExpectedElementVal = getNormalizedPoisonValue(ExpectedElementType);
15111513
MetadataAsValue *VMD = buildMD(ExpectedElementVal);
15121514
unsigned AddressSpace = getPointerAddressSpace(Pointer->getType());
15131515
bool FirstPtrCastOrAssignPtrType = true;
@@ -1653,7 +1655,7 @@ void SPIRVEmitIntrinsics::insertPtrCastOrAssignTypeInstr(Instruction *I,
16531655
if (!ElemTy) {
16541656
ElemTy = getPointeeTypeByCallInst(DemangledName, CalledF, OpIdx);
16551657
if (ElemTy) {
1656-
GR->addDeducedElementType(CalledArg, ElemTy);
1658+
GR->addDeducedElementType(CalledArg, normalizeType(ElemTy));
16571659
} else {
16581660
for (User *U : CalledArg->users()) {
16591661
if (Instruction *Inst = dyn_cast<Instruction>(U)) {
@@ -1984,8 +1986,9 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
19841986
Type *ElemTy = GR->findDeducedElementType(Op);
19851987
buildAssignPtr(B, ElemTy ? ElemTy : deduceElementType(Op, true), Op);
19861988
} else {
1987-
CallInst *AssignCI = buildIntrWithMD(Intrinsic::spv_assign_type,
1988-
{OpTy}, Op, Op, {}, B);
1989+
CallInst *AssignCI =
1990+
buildIntrWithMD(Intrinsic::spv_assign_type, {OpTy},
1991+
getNormalizedPoisonValue(OpTy), Op, {}, B);
19891992
GR->addAssignPtrTypeInstr(Op, AssignCI);
19901993
}
19911994
}
@@ -2034,7 +2037,7 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
20342037
Type *OpTy = Op->getType();
20352038
Value *OpTyVal = Op;
20362039
if (OpTy->isTargetExtTy())
2037-
OpTyVal = PoisonValue::get(OpTy);
2040+
OpTyVal = getNormalizedPoisonValue(OpTy);
20382041
CallInst *NewOp =
20392042
buildIntrWithMD(Intrinsic::spv_track_constant,
20402043
{OpTy, OpTyVal->getType()}, Op, OpTyVal, {}, B);
@@ -2045,7 +2048,7 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
20452048
buildAssignPtr(B, IntegerType::getInt8Ty(I->getContext()), NewOp);
20462049
SmallVector<Type *, 2> Types = {OpTy, OpTy};
20472050
SmallVector<Value *, 2> Args = {
2048-
NewOp, buildMD(PoisonValue::get(OpElemTy)),
2051+
NewOp, buildMD(getNormalizedPoisonValue(OpElemTy)),
20492052
B.getInt32(getPointerAddressSpace(OpTy))};
20502053
CallInst *PtrCasted =
20512054
B.CreateIntrinsic(Intrinsic::spv_ptrcast, {Types}, Args);
@@ -2178,7 +2181,7 @@ void SPIRVEmitIntrinsics::processParamTypes(Function *F, IRBuilder<> &B) {
21782181
if (!ElemTy && (ElemTy = deduceFunParamElementType(F, OpIdx)) != nullptr) {
21792182
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr(Arg)) {
21802183
DenseSet<std::pair<Value *, Value *>> VisitedSubst;
2181-
updateAssignType(AssignCI, Arg, PoisonValue::get(ElemTy));
2184+
updateAssignType(AssignCI, Arg, getNormalizedPoisonValue(ElemTy));
21822185
propagateElemType(Arg, IntegerType::getInt8Ty(F->getContext()),
21832186
VisitedSubst);
21842187
} else {
@@ -2232,7 +2235,7 @@ bool SPIRVEmitIntrinsics::processFunctionPointers(Module &M) {
22322235
continue;
22332236
if (II->getIntrinsicID() == Intrinsic::spv_assign_ptr_type ||
22342237
II->getIntrinsicID() == Intrinsic::spv_ptrcast) {
2235-
updateAssignType(II, &F, PoisonValue::get(FPElemTy));
2238+
updateAssignType(II, &F, getNormalizedPoisonValue(FPElemTy));
22362239
break;
22372240
}
22382241
}
@@ -2256,7 +2259,7 @@ bool SPIRVEmitIntrinsics::processFunctionPointers(Module &M) {
22562259
for (Function *F : Worklist) {
22572260
SmallVector<Value *> Args;
22582261
for (const auto &Arg : F->args())
2259-
Args.push_back(PoisonValue::get(Arg.getType()));
2262+
Args.push_back(getNormalizedPoisonValue(Arg.getType()));
22602263
IRB.CreateCall(F, Args);
22612264
}
22622265
IRB.CreateRetVoid();
@@ -2286,7 +2289,7 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
22862289
buildAssignPtr(B, ElemTy, Arg);
22872290
}
22882291
} else if (isa<Instruction>(Param)) {
2289-
GR->addDeducedElementType(Param, ElemTy);
2292+
GR->addDeducedElementType(Param, normalizeType(ElemTy));
22902293
// insertAssignTypeIntrs() will complete buildAssignPtr()
22912294
} else {
22922295
B.SetInsertPoint(CI->getParent()
@@ -2302,6 +2305,7 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
23022305
if (!RefF || !isPointerTy(RefF->getReturnType()) ||
23032306
GR->findDeducedElementType(RefF))
23042307
continue;
2308+
ElemTy = normalizeType(ElemTy);
23052309
GR->addDeducedElementType(RefF, ElemTy);
23062310
GR->addReturnType(
23072311
RefF, TypedPointerType::get(

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,23 @@ inline const Type *unifyPtrType(const Type *Ty) {
383383
return toTypedPointer(const_cast<Type *>(Ty));
384384
}
385385

386+
// Modify an LLVM type to conform with future transformations in IRTranslator.
387+
// At the moment use cases comprise only a <1 x Type> vector. To extend when/if
388+
// needed.
389+
inline Type *normalizeType(Type *Ty) {
390+
auto *FVTy = dyn_cast<FixedVectorType>(Ty);
391+
if (!FVTy || FVTy->getNumElements() != 1)
392+
return Ty;
393+
// If it's a <1 x Type> vector type, replace it by the element type, because
394+
// it's not a legal vector type in LLT and IRTranslator will represent it as
395+
// the scalar eventually.
396+
return normalizeType(FVTy->getElementType());
397+
}
398+
399+
inline PoisonValue *getNormalizedPoisonValue(Type *Ty) {
400+
return PoisonValue::get(normalizeType(Ty));
401+
}
402+
386403
MachineInstr *getVRegDef(MachineRegisterInfo &MRI, Register Reg);
387404

388405
#define SPIRV_BACKEND_SERVICE_FUN_NAME "__spirv_backend_service_fun"

0 commit comments

Comments
 (0)