Skip to content

Commit 5ec8426

Browse files
Prevent type change of GEP results in type inference
1 parent 3aa9980 commit 5ec8426

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,20 @@ void SPIRVEmitIntrinsics::maybeAssignPtrType(Type *&Ty, Value *Op, Type *RefTy,
646646
Ty = RefTy;
647647
}
648648

649+
Type *getGEPType(GetElementPtrInst *Ref) {
650+
Type *Ty = nullptr;
651+
// TODO: not sure if GetElementPtrInst::getTypeAtIndex() does anything
652+
// useful here
653+
if (isNestedPointer(Ref->getSourceElementType())) {
654+
Ty = Ref->getSourceElementType();
655+
for (Use &U : drop_begin(Ref->indices()))
656+
Ty = GetElementPtrInst::getTypeAtIndex(Ty, U.get());
657+
} else {
658+
Ty = Ref->getResultElementType();
659+
}
660+
return Ty;
661+
}
662+
649663
Type *SPIRVEmitIntrinsics::deduceElementTypeHelper(
650664
Value *I, std::unordered_set<Value *> &Visited, bool UnknownElemTypeI8,
651665
bool IgnoreKnownType) {
@@ -668,15 +682,7 @@ Type *SPIRVEmitIntrinsics::deduceElementTypeHelper(
668682
if (auto *Ref = dyn_cast<AllocaInst>(I)) {
669683
maybeAssignPtrType(Ty, I, Ref->getAllocatedType(), UnknownElemTypeI8);
670684
} else if (auto *Ref = dyn_cast<GetElementPtrInst>(I)) {
671-
// TODO: not sure if GetElementPtrInst::getTypeAtIndex() does anything
672-
// useful here
673-
if (isNestedPointer(Ref->getSourceElementType())) {
674-
Ty = Ref->getSourceElementType();
675-
for (Use &U : drop_begin(Ref->indices()))
676-
Ty = GetElementPtrInst::getTypeAtIndex(Ty, U.get());
677-
} else {
678-
Ty = Ref->getResultElementType();
679-
}
685+
Ty = getGEPType(Ref);
680686
} else if (auto *Ref = dyn_cast<LoadInst>(I)) {
681687
Value *Op = Ref->getPointerOperand();
682688
Type *KnownTy = GR->findDeducedElementType(Op);
@@ -2374,6 +2380,15 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
23742380
AggrConstTypes.clear();
23752381
AggrStores.clear();
23762382

2383+
// fix GEP result types ahead of inference
2384+
for (auto &I : instructions(Func)) {
2385+
auto *Ref = dyn_cast<GetElementPtrInst>(&I);
2386+
if (!Ref || GR->findDeducedElementType(Ref))
2387+
continue;
2388+
if (Type *GepTy = getGEPType(Ref))
2389+
GR->addDeducedElementType(Ref, normalizeType(GepTy));
2390+
}
2391+
23772392
processParamTypesByFunHeader(CurrF, B);
23782393

23792394
// StoreInst's operand type can be changed during the next transformations,

0 commit comments

Comments
 (0)