@@ -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+
649663Type *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