@@ -199,6 +199,8 @@ class SPIRVEmitIntrinsics
199199 DenseMap<Function *, CallInst *> Ptrcasts);
200200
201201 void replaceAllUsesWith (Value *Src, Value *Dest, bool DeleteOld = true );
202+ void replaceAllUsesWithAndErase (IRBuilder<> &B, Instruction *Src,
203+ Instruction *Dest, bool DeleteOld = true );
202204
203205 bool runOnFunction (Function &F);
204206 bool postprocessTypes (Module &M);
@@ -322,6 +324,17 @@ static inline void reportFatalOnTokenType(const Instruction *I) {
322324 false );
323325}
324326
327+ static void emitAssignName (Instruction *I, IRBuilder<> &B) {
328+ if (!I->hasName () || I->getType ()->isAggregateType () ||
329+ expectIgnoredInIRTranslation (I))
330+ return ;
331+ reportFatalOnTokenType (I);
332+ setInsertPointAfterDef (B, I);
333+ std::vector<Value *> Args = {I};
334+ addStringImm (I->getName (), B, Args);
335+ B.CreateIntrinsic (Intrinsic::spv_assign_name, {I->getType ()}, Args);
336+ }
337+
325338void SPIRVEmitIntrinsics::replaceAllUsesWith (Value *Src, Value *Dest,
326339 bool DeleteOld) {
327340 Src->replaceAllUsesWith (Dest);
@@ -336,6 +349,19 @@ void SPIRVEmitIntrinsics::replaceAllUsesWith(Value *Src, Value *Dest,
336349 }
337350}
338351
352+ void SPIRVEmitIntrinsics::replaceAllUsesWithAndErase (IRBuilder<> &B,
353+ Instruction *Src,
354+ Instruction *Dest,
355+ bool DeleteOld) {
356+ replaceAllUsesWith (Src, Dest, DeleteOld);
357+ std::string Name = Src->hasName () ? Src->getName ().str () : " " ;
358+ Src->eraseFromParent ();
359+ if (!Name.empty ()) {
360+ Dest->setName (Name);
361+ emitAssignName (Dest, B);
362+ }
363+ }
364+
339365static bool IsKernelArgInt8 (Function *F, StoreInst *SI) {
340366 return SI && F->getCallingConv () == CallingConv::SPIR_KERNEL &&
341367 isPointerTy (SI->getValueOperand ()->getType ()) &&
@@ -1308,8 +1334,7 @@ Instruction *SPIRVEmitIntrinsics::visitGetElementPtrInst(GetElementPtrInst &I) {
13081334 for (auto &Op : I.operands ())
13091335 Args.push_back (Op);
13101336 auto *NewI = B.CreateIntrinsic (Intrinsic::spv_gep, {Types}, {Args});
1311- replaceAllUsesWith (&I, NewI);
1312- I.eraseFromParent ();
1337+ replaceAllUsesWithAndErase (B, &I, NewI);
13131338 return NewI;
13141339}
13151340
@@ -1331,10 +1356,7 @@ Instruction *SPIRVEmitIntrinsics::visitBitCastInst(BitCastInst &I) {
13311356 SmallVector<Type *, 2 > Types = {I.getType (), Source->getType ()};
13321357 SmallVector<Value *> Args (I.op_begin (), I.op_end ());
13331358 auto *NewI = B.CreateIntrinsic (Intrinsic::spv_bitcast, {Types}, {Args});
1334- std::string InstName = I.hasName () ? I.getName ().str () : " " ;
1335- replaceAllUsesWith (&I, NewI);
1336- I.eraseFromParent ();
1337- NewI->setName (InstName);
1359+ replaceAllUsesWithAndErase (B, &I, NewI);
13381360 return NewI;
13391361}
13401362
@@ -1589,10 +1611,7 @@ Instruction *SPIRVEmitIntrinsics::visitInsertElementInst(InsertElementInst &I) {
15891611 B.SetInsertPoint (&I);
15901612 SmallVector<Value *> Args (I.op_begin (), I.op_end ());
15911613 auto *NewI = B.CreateIntrinsic (Intrinsic::spv_insertelt, {Types}, {Args});
1592- std::string InstName = I.hasName () ? I.getName ().str () : " " ;
1593- replaceAllUsesWith (&I, NewI);
1594- I.eraseFromParent ();
1595- NewI->setName (InstName);
1614+ replaceAllUsesWithAndErase (B, &I, NewI);
15961615 return NewI;
15971616}
15981617
@@ -1604,10 +1623,7 @@ SPIRVEmitIntrinsics::visitExtractElementInst(ExtractElementInst &I) {
16041623 I.getIndexOperand ()->getType ()};
16051624 SmallVector<Value *, 2 > Args = {I.getVectorOperand (), I.getIndexOperand ()};
16061625 auto *NewI = B.CreateIntrinsic (Intrinsic::spv_extractelt, {Types}, {Args});
1607- std::string InstName = I.hasName () ? I.getName ().str () : " " ;
1608- replaceAllUsesWith (&I, NewI);
1609- I.eraseFromParent ();
1610- NewI->setName (InstName);
1626+ replaceAllUsesWithAndErase (B, &I, NewI);
16111627 return NewI;
16121628}
16131629
@@ -1641,8 +1657,7 @@ Instruction *SPIRVEmitIntrinsics::visitExtractValueInst(ExtractValueInst &I) {
16411657 Args.push_back (B.getInt32 (Op));
16421658 auto *NewI =
16431659 B.CreateIntrinsic (Intrinsic::spv_extractv, {I.getType ()}, {Args});
1644- replaceAllUsesWith (&I, NewI);
1645- I.eraseFromParent ();
1660+ replaceAllUsesWithAndErase (B, &I, NewI);
16461661 return NewI;
16471662}
16481663
@@ -1701,10 +1716,7 @@ Instruction *SPIRVEmitIntrinsics::visitAllocaInst(AllocaInst &I) {
17011716 ArraySize ? B.CreateIntrinsic (Intrinsic::spv_alloca_array,
17021717 {PtrTy, ArraySize->getType ()}, {ArraySize})
17031718 : B.CreateIntrinsic (Intrinsic::spv_alloca, {PtrTy}, {});
1704- std::string InstName = I.hasName () ? I.getName ().str () : " " ;
1705- replaceAllUsesWith (&I, NewI);
1706- I.eraseFromParent ();
1707- NewI->setName (InstName);
1719+ replaceAllUsesWithAndErase (B, &I, NewI);
17081720 return NewI;
17091721}
17101722
@@ -1914,14 +1926,7 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
19141926 I->setOperand (OpNo, NewOp);
19151927 }
19161928 }
1917- if (I->hasName () && !I->getType ()->isAggregateType () &&
1918- !expectIgnoredInIRTranslation (I)) {
1919- reportFatalOnTokenType (I);
1920- setInsertPointAfterDef (B, I);
1921- std::vector<Value *> Args = {I};
1922- addStringImm (I->getName (), B, Args);
1923- B.CreateIntrinsic (Intrinsic::spv_assign_name, {I->getType ()}, Args);
1924- }
1929+ emitAssignName (I, B);
19251930}
19261931
19271932Type *SPIRVEmitIntrinsics::deduceFunParamElementType (Function *F,
0 commit comments