@@ -427,7 +427,7 @@ Type *SPIRVEmitIntrinsics::reconstructType(Value *Op, bool UnknownElemTypeI8,
427427
428428void 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
448448void 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
14981500void 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 (
0 commit comments