@@ -50,6 +50,13 @@ void initializeSPIRVEmitIntrinsicsPass(PassRegistry &);
50
50
} // namespace llvm
51
51
52
52
namespace {
53
+
54
+ inline MetadataAsValue *buildMD (Value *Arg) {
55
+ LLVMContext &Ctx = Arg->getContext ();
56
+ return MetadataAsValue::get (
57
+ Ctx, MDNode::get (Ctx, ValueAsMetadata::getConstant (Arg)));
58
+ }
59
+
53
60
class SPIRVEmitIntrinsics
54
61
: public ModulePass,
55
62
public InstVisitor<SPIRVEmitIntrinsics, Instruction *> {
@@ -84,12 +91,9 @@ class SPIRVEmitIntrinsics
84
91
CallInst *buildIntrWithMD (Intrinsic::ID IntrID, ArrayRef<Type *> Types,
85
92
Value *Arg, Value *Arg2, ArrayRef<Constant *> Imms,
86
93
IRBuilder<> &B) {
87
- ConstantAsMetadata *CM = ValueAsMetadata::getConstant (Arg);
88
- MDTuple *TyMD = MDNode::get (F->getContext (), CM);
89
- MetadataAsValue *VMD = MetadataAsValue::get (F->getContext (), TyMD);
90
94
SmallVector<Value *, 4 > Args;
91
95
Args.push_back (Arg2);
92
- Args.push_back (VMD );
96
+ Args.push_back (buildMD (Arg) );
93
97
for (auto *Imm : Imms)
94
98
Args.push_back (Imm);
95
99
return B.CreateIntrinsic (IntrID, {Types}, Args);
@@ -228,20 +232,23 @@ void SPIRVEmitIntrinsics::buildAssignType(IRBuilder<> &B, Type *Ty,
228
232
void SPIRVEmitIntrinsics::buildAssignPtr (IRBuilder<> &B, Type *ElemTy,
229
233
Value *Arg) {
230
234
Value *OfType = PoisonValue::get (ElemTy);
231
- CallInst *AssignPtrTyCI = buildIntrWithMD (
232
- Intrinsic::spv_assign_ptr_type, {Arg->getType ()}, OfType, Arg,
233
- {B.getInt32 (getPointerAddressSpace (Arg->getType ()))}, B);
234
- GR->addDeducedElementType (AssignPtrTyCI, ElemTy);
235
- GR->addDeducedElementType (Arg, ElemTy);
236
- GR->addAssignPtrTypeInstr (Arg, AssignPtrTyCI);
235
+ CallInst *AssignPtrTyCI = GR->findAssignPtrTypeInstr (Arg);
236
+ if (AssignPtrTyCI == nullptr ||
237
+ AssignPtrTyCI->getParent ()->getParent () != F) {
238
+ AssignPtrTyCI = buildIntrWithMD (
239
+ Intrinsic::spv_assign_ptr_type, {Arg->getType ()}, OfType, Arg,
240
+ {B.getInt32 (getPointerAddressSpace (Arg->getType ()))}, B);
241
+ GR->addDeducedElementType (AssignPtrTyCI, ElemTy);
242
+ GR->addDeducedElementType (Arg, ElemTy);
243
+ GR->addAssignPtrTypeInstr (Arg, AssignPtrTyCI);
244
+ } else {
245
+ updateAssignType (AssignPtrTyCI, Arg, OfType);
246
+ }
237
247
}
238
248
239
249
void SPIRVEmitIntrinsics::updateAssignType (CallInst *AssignCI, Value *Arg,
240
250
Value *OfType) {
241
- LLVMContext &Ctx = Arg->getContext ();
242
- AssignCI->setArgOperand (
243
- 1 , MetadataAsValue::get (
244
- Ctx, MDNode::get (Ctx, ValueAsMetadata::getConstant (OfType))));
251
+ AssignCI->setArgOperand (1 , buildMD (OfType));
245
252
if (cast<IntrinsicInst>(AssignCI)->getIntrinsicID () !=
246
253
Intrinsic::spv_assign_ptr_type)
247
254
return ;
@@ -560,9 +567,7 @@ void SPIRVEmitIntrinsics::deduceOperandElementType(Instruction *I) {
560
567
B.SetInsertPoint (F->getEntryBlock ().getFirstNonPHIOrDbgOrAlloca ());
561
568
}
562
569
SmallVector<Type *, 2 > Types = {OpTy, OpTy};
563
- MetadataAsValue *VMD = MetadataAsValue::get (
564
- Ctx, MDNode::get (Ctx, ValueAsMetadata::getConstant (OpTyVal)));
565
- SmallVector<Value *, 2 > Args = {Op, VMD,
570
+ SmallVector<Value *, 2 > Args = {Op, buildMD (OpTyVal),
566
571
B.getInt32 (getPointerAddressSpace (OpTy))};
567
572
CallInst *PtrCastI =
568
573
B.CreateIntrinsic (Intrinsic::spv_ptrcast, {Types}, Args);
@@ -689,8 +694,7 @@ Instruction *SPIRVEmitIntrinsics::visitCallInst(CallInst &Call) {
689
694
Constant *TyC = UndefValue::get (IA->getFunctionType ());
690
695
MDString *ConstraintString = MDString::get (Ctx, IA->getConstraintString ());
691
696
SmallVector<Value *> Args = {
692
- MetadataAsValue::get (Ctx,
693
- MDNode::get (Ctx, ValueAsMetadata::getConstant (TyC))),
697
+ buildMD (TyC),
694
698
MetadataAsValue::get (Ctx, MDNode::get (Ctx, ConstraintString))};
695
699
for (unsigned OpIdx = 0 ; OpIdx < Call.arg_size (); OpIdx++)
696
700
Args.push_back (Call.getArgOperand (OpIdx));
@@ -822,12 +826,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
822
826
return ;
823
827
824
828
setInsertPointSkippingPhis (B, I);
825
- Constant *ExpectedElementTypeConst =
826
- Constant::getNullValue (ExpectedElementType);
827
- ConstantAsMetadata *CM =
828
- ValueAsMetadata::getConstant (ExpectedElementTypeConst);
829
- MDTuple *TyMD = MDNode::get (F->getContext (), CM);
830
- MetadataAsValue *VMD = MetadataAsValue::get (F->getContext (), TyMD);
829
+ MetadataAsValue *VMD = buildMD (PoisonValue::get (ExpectedElementType));
831
830
unsigned AddressSpace = getPointerAddressSpace (Pointer->getType ());
832
831
bool FirstPtrCastOrAssignPtrType = true ;
833
832
@@ -873,12 +872,7 @@ void SPIRVEmitIntrinsics::replacePointerOperandWithPtrCast(
873
872
// spv_assign_ptr_type instead.
874
873
if (FirstPtrCastOrAssignPtrType &&
875
874
(isa<Instruction>(Pointer) || isa<Argument>(Pointer))) {
876
- CallInst *CI = buildIntrWithMD (
877
- Intrinsic::spv_assign_ptr_type, {Pointer->getType ()},
878
- ExpectedElementTypeConst, Pointer, {B.getInt32 (AddressSpace)}, B);
879
- GR->addDeducedElementType (CI, ExpectedElementType);
880
- GR->addDeducedElementType (Pointer, ExpectedElementType);
881
- GR->addAssignPtrTypeInstr (Pointer, CI);
875
+ buildAssignPtr (B, ExpectedElementType, Pointer);
882
876
return ;
883
877
}
884
878
@@ -1167,12 +1161,7 @@ void SPIRVEmitIntrinsics::insertAssignPtrTypeIntrs(Instruction *I,
1167
1161
1168
1162
setInsertPointAfterDef (B, I);
1169
1163
Type *ElemTy = deduceElementType (I);
1170
- Constant *EltTyConst = UndefValue::get (ElemTy);
1171
- unsigned AddressSpace = getPointerAddressSpace (I->getType ());
1172
- CallInst *CI = buildIntrWithMD (Intrinsic::spv_assign_ptr_type, {I->getType ()},
1173
- EltTyConst, I, {B.getInt32 (AddressSpace)}, B);
1174
- GR->addDeducedElementType (CI, ElemTy);
1175
- GR->addAssignPtrTypeInstr (I, CI);
1164
+ buildAssignPtr (B, ElemTy, I);
1176
1165
}
1177
1166
1178
1167
void SPIRVEmitIntrinsics::insertAssignTypeIntrs (Instruction *I,
@@ -1407,12 +1396,14 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
1407
1396
continue ;
1408
1397
1409
1398
insertAssignPtrTypeIntrs (I, B);
1410
- deduceOperandElementType (I);
1411
1399
insertAssignTypeIntrs (I, B);
1412
1400
insertPtrCastOrAssignTypeInstr (I, B);
1413
1401
insertSpirvDecorations (I, B);
1414
1402
}
1415
1403
1404
+ for (auto &I : instructions (Func))
1405
+ deduceOperandElementType (&I);
1406
+
1416
1407
for (auto *I : Worklist) {
1417
1408
TrackConstants = true ;
1418
1409
if (!I->getType ()->isVoidTy () || isa<StoreInst>(I))
0 commit comments