@@ -57,12 +57,6 @@ void initializeSPIRVEmitIntrinsicsPass(PassRegistry &);
57
57
58
58
namespace {
59
59
60
- inline MetadataAsValue *buildMD (Value *Arg) {
61
- LLVMContext &Ctx = Arg->getContext ();
62
- return MetadataAsValue::get (
63
- Ctx, MDNode::get (Ctx, ValueAsMetadata::getConstant (Arg)));
64
- }
65
-
66
60
class SPIRVEmitIntrinsics
67
61
: public ModulePass,
68
62
public InstVisitor<SPIRVEmitIntrinsics, Instruction *> {
@@ -142,24 +136,9 @@ class SPIRVEmitIntrinsics
142
136
void preprocessCompositeConstants (IRBuilder<> &B);
143
137
void preprocessUndefs (IRBuilder<> &B);
144
138
145
- CallInst *buildIntrWithMD (Intrinsic::ID IntrID, ArrayRef<Type *> Types,
146
- Value *Arg, Value *Arg2, ArrayRef<Constant *> Imms,
147
- IRBuilder<> &B) {
148
- SmallVector<Value *, 4 > Args;
149
- Args.push_back (Arg2);
150
- Args.push_back (buildMD (Arg));
151
- for (auto *Imm : Imms)
152
- Args.push_back (Imm);
153
- return B.CreateIntrinsic (IntrID, {Types}, Args);
154
- }
155
-
156
139
Type *reconstructType (Value *Op, bool UnknownElemTypeI8,
157
140
bool IsPostprocessing);
158
141
159
- void buildAssignType (IRBuilder<> &B, Type *ElemTy, Value *Arg);
160
- void buildAssignPtr (IRBuilder<> &B, Type *ElemTy, Value *Arg);
161
- void updateAssignType (CallInst *AssignCI, Value *Arg, Value *OfType);
162
-
163
142
void replaceMemInstrUses (Instruction *Old, Instruction *New, IRBuilder<> &B);
164
143
void processInstrAfterVisit (Instruction *I, IRBuilder<> &B);
165
144
bool insertAssignPtrTypeIntrs (Instruction *I, IRBuilder<> &B,
@@ -273,18 +252,6 @@ bool expectIgnoredInIRTranslation(const Instruction *I) {
273
252
}
274
253
}
275
254
276
- bool allowEmitFakeUse (const Value *Arg) {
277
- if (isSpvIntrinsic (Arg))
278
- return false ;
279
- if (dyn_cast<AtomicCmpXchgInst>(Arg) || dyn_cast<InsertValueInst>(Arg) ||
280
- dyn_cast<UndefValue>(Arg))
281
- return false ;
282
- if (const auto *LI = dyn_cast<LoadInst>(Arg))
283
- if (LI->getType ()->isAggregateType ())
284
- return false ;
285
- return true ;
286
- }
287
-
288
255
} // namespace
289
256
290
257
char SPIRVEmitIntrinsics::ID = 0 ;
@@ -355,10 +322,7 @@ static void emitAssignName(Instruction *I, IRBuilder<> &B) {
355
322
356
323
void SPIRVEmitIntrinsics::replaceAllUsesWith (Value *Src, Value *Dest,
357
324
bool DeleteOld) {
358
- Src->replaceAllUsesWith (Dest);
359
- // Update deduced type records
360
- GR->updateIfExistDeducedElementType (Src, Dest, DeleteOld);
361
- GR->updateIfExistAssignPtrTypeInstr (Src, Dest, DeleteOld);
325
+ GR->replaceAllUsesWith (Src, Dest, DeleteOld);
362
326
// Update uncomplete type records if any
363
327
if (isTodoType (Src)) {
364
328
if (DeleteOld)
@@ -425,57 +389,6 @@ Type *SPIRVEmitIntrinsics::reconstructType(Value *Op, bool UnknownElemTypeI8,
425
389
return nullptr ;
426
390
}
427
391
428
- void SPIRVEmitIntrinsics::buildAssignType (IRBuilder<> &B, Type *Ty,
429
- Value *Arg) {
430
- Value *OfType = getNormalizedPoisonValue (Ty);
431
- CallInst *AssignCI = nullptr ;
432
- if (Arg->getType ()->isAggregateType () && Ty->isAggregateType () &&
433
- allowEmitFakeUse (Arg)) {
434
- LLVMContext &Ctx = Arg->getContext ();
435
- SmallVector<Metadata *, 2 > ArgMDs{
436
- MDNode::get (Ctx, ValueAsMetadata::getConstant (OfType)),
437
- MDString::get (Ctx, Arg->getName ())};
438
- B.CreateIntrinsic (Intrinsic::spv_value_md, {},
439
- {MetadataAsValue::get (Ctx, MDTuple::get (Ctx, ArgMDs))});
440
- AssignCI = B.CreateIntrinsic (Intrinsic::fake_use, {}, {Arg});
441
- } else {
442
- AssignCI = buildIntrWithMD (Intrinsic::spv_assign_type, {Arg->getType ()},
443
- OfType, Arg, {}, B);
444
- }
445
- GR->addAssignPtrTypeInstr (Arg, AssignCI);
446
- }
447
-
448
- void SPIRVEmitIntrinsics::buildAssignPtr (IRBuilder<> &B, Type *ElemTy,
449
- Value *Arg) {
450
- ElemTy = normalizeType (ElemTy);
451
- Value *OfType = PoisonValue::get (ElemTy);
452
- CallInst *AssignPtrTyCI = GR->findAssignPtrTypeInstr (Arg);
453
- if (AssignPtrTyCI == nullptr ||
454
- AssignPtrTyCI->getParent ()->getParent () != CurrF) {
455
- AssignPtrTyCI = buildIntrWithMD (
456
- Intrinsic::spv_assign_ptr_type, {Arg->getType ()}, OfType, Arg,
457
- {B.getInt32 (getPointerAddressSpace (Arg->getType ()))}, B);
458
- GR->addDeducedElementType (AssignPtrTyCI, ElemTy);
459
- GR->addDeducedElementType (Arg, ElemTy);
460
- GR->addAssignPtrTypeInstr (Arg, AssignPtrTyCI);
461
- } else {
462
- updateAssignType (AssignPtrTyCI, Arg, OfType);
463
- }
464
- }
465
-
466
- void SPIRVEmitIntrinsics::updateAssignType (CallInst *AssignCI, Value *Arg,
467
- Value *OfType) {
468
- AssignCI->setArgOperand (1 , buildMD (OfType));
469
- if (cast<IntrinsicInst>(AssignCI)->getIntrinsicID () !=
470
- Intrinsic::spv_assign_ptr_type)
471
- return ;
472
-
473
- // update association with the pointee type
474
- Type *ElemTy = normalizeType (OfType->getType ());
475
- GR->addDeducedElementType (AssignCI, ElemTy);
476
- GR->addDeducedElementType (Arg, ElemTy);
477
- }
478
-
479
392
CallInst *SPIRVEmitIntrinsics::buildSpvPtrcast (Function *F, Value *Op,
480
393
Type *ElemTy) {
481
394
IRBuilder<> B (Op->getContext ());
@@ -495,7 +408,7 @@ CallInst *SPIRVEmitIntrinsics::buildSpvPtrcast(Function *F, Value *Op,
495
408
B.getInt32 (getPointerAddressSpace (OpTy))};
496
409
CallInst *PtrCasted =
497
410
B.CreateIntrinsic (Intrinsic::spv_ptrcast, {Types}, Args);
498
- buildAssignPtr (B, ElemTy, PtrCasted);
411
+ GR-> buildAssignPtr (B, ElemTy, PtrCasted);
499
412
return PtrCasted;
500
413
}
501
414
@@ -1032,7 +945,8 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeFunctionRet(
1032
945
continue ;
1033
946
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr (CI)) {
1034
947
if (Type *PrevElemTy = GR->findDeducedElementType (CI)) {
1035
- updateAssignType (AssignCI, CI, getNormalizedPoisonValue (OpElemTy));
948
+ GR->updateAssignType (AssignCI, CI,
949
+ getNormalizedPoisonValue (OpElemTy));
1036
950
propagateElemType (CI, PrevElemTy, VisitedSubst);
1037
951
}
1038
952
}
@@ -1218,7 +1132,7 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(
1218
1132
{B.getInt32 (getPointerAddressSpace (OpTy))}, B);
1219
1133
GR->addAssignPtrTypeInstr (Op, CI);
1220
1134
} else {
1221
- updateAssignType (AssignCI, Op, OpTyVal);
1135
+ GR-> updateAssignType (AssignCI, Op, OpTyVal);
1222
1136
DenseSet<std::pair<Value *, Value *>> VisitedSubst{
1223
1137
std::make_pair (I, Op)};
1224
1138
propagateElemTypeRec (Op, KnownElemTy, PrevElemTy, VisitedSubst);
@@ -1508,7 +1422,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeTargetExt(
1508
1422
1509
1423
CallInst *AssignCI = GR->findAssignPtrTypeInstr (V);
1510
1424
if (!AssignCI) {
1511
- buildAssignType (B, AssignedType, V);
1425
+ GR-> buildAssignType (B, AssignedType, V);
1512
1426
return ;
1513
1427
}
1514
1428
@@ -1528,7 +1442,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeTargetExt(
1528
1442
1529
1443
// Our previous guess about the type seems to be wrong, let's update
1530
1444
// inferred type according to a new, more precise type information.
1531
- updateAssignType (AssignCI, V, getNormalizedPoisonValue (AssignedType));
1445
+ GR-> updateAssignType (AssignCI, V, getNormalizedPoisonValue (AssignedType));
1532
1446
}
1533
1447
1534
1448
void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast (
@@ -1585,7 +1499,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
1585
1499
if (FirstPtrCastOrAssignPtrType) {
1586
1500
// If this would be the first spv_ptrcast, do not emit spv_ptrcast and
1587
1501
// emit spv_assign_ptr_type instead.
1588
- buildAssignPtr (B, ExpectedElementType, Pointer);
1502
+ GR-> buildAssignPtr (B, ExpectedElementType, Pointer);
1589
1503
return ;
1590
1504
} else if (isTodoType (Pointer)) {
1591
1505
eraseTodoType (Pointer);
@@ -1597,10 +1511,10 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
1597
1511
assert (PrevElemTy);
1598
1512
DenseSet<std::pair<Value *, Value *>> VisitedSubst{
1599
1513
std::make_pair (I, Pointer)};
1600
- updateAssignType (AssignCI, Pointer, ExpectedElementVal);
1514
+ GR-> updateAssignType (AssignCI, Pointer, ExpectedElementVal);
1601
1515
propagateElemType (Pointer, PrevElemTy, VisitedSubst);
1602
1516
} else {
1603
- buildAssignPtr (B, ExpectedElementType, Pointer);
1517
+ GR-> buildAssignPtr (B, ExpectedElementType, Pointer);
1604
1518
}
1605
1519
return ;
1606
1520
}
@@ -1613,7 +1527,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
1613
1527
auto *PtrCastI = B.CreateIntrinsic (Intrinsic::spv_ptrcast, {Types}, Args);
1614
1528
I->setOperand (OperandToReplace, PtrCastI);
1615
1529
// We need to set up a pointee type for the newly created spv_ptrcast.
1616
- buildAssignPtr (B, ExpectedElementType, PtrCastI);
1530
+ GR-> buildAssignPtr (B, ExpectedElementType, PtrCastI);
1617
1531
}
1618
1532
1619
1533
void SPIRVEmitIntrinsics::insertPtrCastOrAssignTypeInstr (Instruction *I,
@@ -1929,7 +1843,7 @@ bool SPIRVEmitIntrinsics::insertAssignPtrTypeIntrs(Instruction *I,
1929
1843
1930
1844
setInsertPointAfterDef (B, I);
1931
1845
if (Type *ElemTy = deduceElementType (I, UnknownElemTypeI8)) {
1932
- buildAssignPtr (B, ElemTy, I);
1846
+ GR-> buildAssignPtr (B, ElemTy, I);
1933
1847
return false ;
1934
1848
}
1935
1849
return true ;
@@ -1962,8 +1876,8 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
1962
1876
setInsertPointAfterDef (B, I);
1963
1877
switch (ResIt->second ) {
1964
1878
case WellKnownTypes::Event:
1965
- buildAssignType (B, TargetExtType::get (I-> getContext (), " spirv.Event " ),
1966
- I);
1879
+ GR-> buildAssignType (
1880
+ B, TargetExtType::get (I-> getContext (), " spirv.Event " ), I);
1967
1881
break ;
1968
1882
}
1969
1883
}
@@ -2008,7 +1922,7 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
2008
1922
}
2009
1923
}
2010
1924
TypeToAssign = restoreMutatedType (GR, I, TypeToAssign);
2011
- buildAssignType (B, TypeToAssign, I);
1925
+ GR-> buildAssignType (B, TypeToAssign, I);
2012
1926
}
2013
1927
for (const auto &Op : I->operands ()) {
2014
1928
if (isa<ConstantPointerNull>(Op) || isa<UndefValue>(Op) ||
@@ -2025,10 +1939,11 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
2025
1939
Type *OpTy = Op->getType ();
2026
1940
Type *OpTyElem = getPointeeType (OpTy);
2027
1941
if (OpTyElem) {
2028
- buildAssignPtr (B, OpTyElem, Op);
1942
+ GR-> buildAssignPtr (B, OpTyElem, Op);
2029
1943
} else if (isPointerTy (OpTy)) {
2030
1944
Type *ElemTy = GR->findDeducedElementType (Op);
2031
- buildAssignPtr (B, ElemTy ? ElemTy : deduceElementType (Op, true ), Op);
1945
+ GR->buildAssignPtr (B, ElemTy ? ElemTy : deduceElementType (Op, true ),
1946
+ Op);
2032
1947
} else {
2033
1948
CallInst *AssignCI =
2034
1949
buildIntrWithMD (Intrinsic::spv_assign_type, {OpTy},
@@ -2089,14 +2004,14 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
2089
2004
if (!IsConstComposite && isPointerTy (OpTy) &&
2090
2005
(OpElemTy = GR->findDeducedElementType (Op)) != nullptr &&
2091
2006
OpElemTy != IntegerType::getInt8Ty (I->getContext ())) {
2092
- buildAssignPtr (B, IntegerType::getInt8Ty (I->getContext ()), NewOp);
2007
+ GR-> buildAssignPtr (B, IntegerType::getInt8Ty (I->getContext ()), NewOp);
2093
2008
SmallVector<Type *, 2 > Types = {OpTy, OpTy};
2094
2009
SmallVector<Value *, 2 > Args = {
2095
2010
NewOp, buildMD (getNormalizedPoisonValue (OpElemTy)),
2096
2011
B.getInt32 (getPointerAddressSpace (OpTy))};
2097
2012
CallInst *PtrCasted =
2098
2013
B.CreateIntrinsic (Intrinsic::spv_ptrcast, {Types}, Args);
2099
- buildAssignPtr (B, OpElemTy, PtrCasted);
2014
+ GR-> buildAssignPtr (B, OpElemTy, PtrCasted);
2100
2015
NewOp = PtrCasted;
2101
2016
}
2102
2017
I->setOperand (OpNo, NewOp);
@@ -2178,7 +2093,7 @@ void SPIRVEmitIntrinsics::processParamTypesByFunHeader(Function *F,
2178
2093
continue ;
2179
2094
if (hasPointeeTypeAttr (Arg) &&
2180
2095
(ElemTy = getPointeeTypeByAttr (Arg)) != nullptr ) {
2181
- buildAssignPtr (B, ElemTy, Arg);
2096
+ GR-> buildAssignPtr (B, ElemTy, Arg);
2182
2097
continue ;
2183
2098
}
2184
2099
// search in function's call sites
@@ -2194,7 +2109,7 @@ void SPIRVEmitIntrinsics::processParamTypesByFunHeader(Function *F,
2194
2109
break ;
2195
2110
}
2196
2111
if (ElemTy) {
2197
- buildAssignPtr (B, ElemTy, Arg);
2112
+ GR-> buildAssignPtr (B, ElemTy, Arg);
2198
2113
continue ;
2199
2114
}
2200
2115
if (HaveFunPtrs) {
@@ -2206,7 +2121,7 @@ void SPIRVEmitIntrinsics::processParamTypesByFunHeader(Function *F,
2206
2121
SmallVector<std::pair<Value *, unsigned >> Ops;
2207
2122
deduceOperandElementTypeFunctionPointer (CI, Ops, ElemTy, false );
2208
2123
if (ElemTy) {
2209
- buildAssignPtr (B, ElemTy, Arg);
2124
+ GR-> buildAssignPtr (B, ElemTy, Arg);
2210
2125
break ;
2211
2126
}
2212
2127
}
@@ -2225,11 +2140,11 @@ void SPIRVEmitIntrinsics::processParamTypes(Function *F, IRBuilder<> &B) {
2225
2140
if (!ElemTy && (ElemTy = deduceFunParamElementType (F, OpIdx)) != nullptr ) {
2226
2141
if (CallInst *AssignCI = GR->findAssignPtrTypeInstr (Arg)) {
2227
2142
DenseSet<std::pair<Value *, Value *>> VisitedSubst;
2228
- updateAssignType (AssignCI, Arg, getNormalizedPoisonValue (ElemTy));
2143
+ GR-> updateAssignType (AssignCI, Arg, getNormalizedPoisonValue (ElemTy));
2229
2144
propagateElemType (Arg, IntegerType::getInt8Ty (F->getContext ()),
2230
2145
VisitedSubst);
2231
2146
} else {
2232
- buildAssignPtr (B, ElemTy, Arg);
2147
+ GR-> buildAssignPtr (B, ElemTy, Arg);
2233
2148
}
2234
2149
}
2235
2150
}
@@ -2279,7 +2194,7 @@ bool SPIRVEmitIntrinsics::processFunctionPointers(Module &M) {
2279
2194
continue ;
2280
2195
if (II->getIntrinsicID () == Intrinsic::spv_assign_ptr_type ||
2281
2196
II->getIntrinsicID () == Intrinsic::spv_ptrcast) {
2282
- updateAssignType (II, &F, getNormalizedPoisonValue (FPElemTy));
2197
+ GR-> updateAssignType (II, &F, getNormalizedPoisonValue (FPElemTy));
2283
2198
break ;
2284
2199
}
2285
2200
}
@@ -2331,7 +2246,7 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
2331
2246
if (!hasPointeeTypeAttr (Arg)) {
2332
2247
B.SetInsertPointPastAllocas (Arg->getParent ());
2333
2248
B.SetCurrentDebugLocation (DebugLoc ());
2334
- buildAssignPtr (B, ElemTy, Arg);
2249
+ GR-> buildAssignPtr (B, ElemTy, Arg);
2335
2250
}
2336
2251
} else if (isa<GetElementPtrInst>(Param)) {
2337
2252
replaceUsesOfWithSpvPtrcast (Param, normalizeType (ElemTy), CI,
@@ -2344,7 +2259,7 @@ void SPIRVEmitIntrinsics::applyDemangledPtrArgTypes(IRBuilder<> &B) {
2344
2259
->getParent ()
2345
2260
->getEntryBlock ()
2346
2261
.getFirstNonPHIOrDbgOrAlloca ());
2347
- buildAssignPtr (B, ElemTy, Param);
2262
+ GR-> buildAssignPtr (B, ElemTy, Param);
2348
2263
}
2349
2264
CallInst *Ref = dyn_cast<CallInst>(Param);
2350
2265
if (!Ref)
0 commit comments