@@ -59,6 +59,16 @@ Type *IRBuilderBase::getCurrentFunctionReturnType() const {
59
59
assert (BB && BB->getParent () && " No current function!" );
60
60
return BB->getParent ()->getReturnType ();
61
61
}
62
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
63
+ Value *IRBuilderBase::getCastedInt8PtrValue (Value *Ptr) {
64
+ auto *PT = cast<PointerType>(Ptr->getType ());
65
+ if (PT->isOpaqueOrPointeeTypeMatches (getInt8Ty ()))
66
+ return Ptr;
67
+
68
+ // Otherwise, we need to insert a bitcast.
69
+ return CreateBitCast (Ptr, getInt8PtrTy (PT->getAddressSpace ()));
70
+ }
71
+ #endif
62
72
63
73
DebugLoc IRBuilderBase::getCurrentDebugLocation () const {
64
74
for (auto &KV : MetadataToCopy)
@@ -138,6 +148,9 @@ CallInst *IRBuilderBase::CreateMemSet(Value *Ptr, Value *Val, Value *Size,
138
148
MaybeAlign Align, bool isVolatile,
139
149
MDNode *TBAATag, MDNode *ScopeTag,
140
150
MDNode *NoAliasTag) {
151
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
152
+ Ptr = getCastedInt8PtrValue (Ptr);
153
+ #endif
141
154
Value *Ops[] = {Ptr, Val, Size, getInt1 (isVolatile)};
142
155
Type *Tys[] = { Ptr->getType (), Size->getType () };
143
156
Module *M = BB->getParent ()->getParent ();
@@ -166,6 +179,9 @@ CallInst *IRBuilderBase::CreateMemSetInline(Value *Dst, MaybeAlign DstAlign,
166
179
bool IsVolatile, MDNode *TBAATag,
167
180
MDNode *ScopeTag,
168
181
MDNode *NoAliasTag) {
182
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
183
+ Dst = getCastedInt8PtrValue (Dst);
184
+ #endif
169
185
Value *Ops[] = {Dst, Val, Size, getInt1 (IsVolatile)};
170
186
Type *Tys[] = {Dst->getType (), Size->getType ()};
171
187
Module *M = BB->getParent ()->getParent ();
@@ -192,7 +208,9 @@ CallInst *IRBuilderBase::CreateMemSetInline(Value *Dst, MaybeAlign DstAlign,
192
208
CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemSet (
193
209
Value *Ptr, Value *Val, Value *Size, Align Alignment, uint32_t ElementSize,
194
210
MDNode *TBAATag, MDNode *ScopeTag, MDNode *NoAliasTag) {
195
-
211
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
212
+ Ptr = getCastedInt8PtrValue (Ptr);
213
+ #endif
196
214
Value *Ops[] = {Ptr, Val, Size, getInt32 (ElementSize)};
197
215
Type *Tys[] = {Ptr->getType (), Size->getType ()};
198
216
Module *M = BB->getParent ()->getParent ();
@@ -220,6 +238,11 @@ CallInst *IRBuilderBase::CreateMemTransferInst(
220
238
Intrinsic::ID IntrID, Value *Dst, MaybeAlign DstAlign, Value *Src,
221
239
MaybeAlign SrcAlign, Value *Size, bool isVolatile, MDNode *TBAATag,
222
240
MDNode *TBAAStructTag, MDNode *ScopeTag, MDNode *NoAliasTag) {
241
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
242
+ Dst = getCastedInt8PtrValue (Dst);
243
+ Src = getCastedInt8PtrValue (Src);
244
+ #endif
245
+
223
246
Value *Ops[] = {Dst, Src, Size, getInt1 (isVolatile)};
224
247
Type *Tys[] = { Dst->getType (), Src->getType (), Size->getType () };
225
248
Module *M = BB->getParent ()->getParent ();
@@ -254,6 +277,11 @@ CallInst *IRBuilderBase::CreateMemCpyInline(
254
277
Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign,
255
278
Value *Size, bool IsVolatile, MDNode *TBAATag, MDNode *TBAAStructTag,
256
279
MDNode *ScopeTag, MDNode *NoAliasTag) {
280
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
281
+ Dst = getCastedInt8PtrValue (Dst);
282
+ Src = getCastedInt8PtrValue (Src);
283
+ #endif
284
+
257
285
Value *Ops[] = {Dst, Src, Size, getInt1 (IsVolatile)};
258
286
Type *Tys[] = {Dst->getType (), Src->getType (), Size->getType ()};
259
287
Function *F = BB->getParent ();
@@ -293,6 +321,11 @@ CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy(
293
321
" Pointer alignment must be at least element size" );
294
322
assert (SrcAlign >= ElementSize &&
295
323
" Pointer alignment must be at least element size" );
324
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
325
+ Dst = getCastedInt8PtrValue (Dst);
326
+ Src = getCastedInt8PtrValue (Src);
327
+ #endif
328
+
296
329
Value *Ops[] = {Dst, Src, Size, getInt32 (ElementSize)};
297
330
Type *Tys[] = {Dst->getType (), Src->getType (), Size->getType ()};
298
331
Module *M = BB->getParent ()->getParent ();
@@ -328,6 +361,11 @@ CallInst *IRBuilderBase::CreateMemMove(Value *Dst, MaybeAlign DstAlign,
328
361
Value *Size, bool isVolatile,
329
362
MDNode *TBAATag, MDNode *ScopeTag,
330
363
MDNode *NoAliasTag) {
364
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
365
+ Dst = getCastedInt8PtrValue (Dst);
366
+ Src = getCastedInt8PtrValue (Src);
367
+ #endif
368
+
331
369
Value *Ops[] = {Dst, Src, Size, getInt1 (isVolatile)};
332
370
Type *Tys[] = { Dst->getType (), Src->getType (), Size->getType () };
333
371
Module *M = BB->getParent ()->getParent ();
@@ -362,6 +400,11 @@ CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemMove(
362
400
" Pointer alignment must be at least element size" );
363
401
assert (SrcAlign >= ElementSize &&
364
402
" Pointer alignment must be at least element size" );
403
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
404
+ Dst = getCastedInt8PtrValue (Dst);
405
+ Src = getCastedInt8PtrValue (Src);
406
+ #endif
407
+
365
408
Value *Ops[] = {Dst, Src, Size, getInt32 (ElementSize)};
366
409
Type *Tys[] = {Dst->getType (), Src->getType (), Size->getType ()};
367
410
Module *M = BB->getParent ()->getParent ();
@@ -466,6 +509,9 @@ CallInst *IRBuilderBase::CreateFPMinimumReduce(Value *Src) {
466
509
CallInst *IRBuilderBase::CreateLifetimeStart (Value *Ptr, ConstantInt *Size) {
467
510
assert (isa<PointerType>(Ptr->getType ()) &&
468
511
" lifetime.start only applies to pointers." );
512
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
513
+ Ptr = getCastedInt8PtrValue (Ptr);
514
+ #endif
469
515
if (!Size)
470
516
Size = getInt64 (-1 );
471
517
else
@@ -481,6 +527,9 @@ CallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) {
481
527
CallInst *IRBuilderBase::CreateLifetimeEnd (Value *Ptr, ConstantInt *Size) {
482
528
assert (isa<PointerType>(Ptr->getType ()) &&
483
529
" lifetime.end only applies to pointers." );
530
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
531
+ Ptr = getCastedInt8PtrValue (Ptr);
532
+ #endif
484
533
if (!Size)
485
534
Size = getInt64 (-1 );
486
535
else
@@ -497,6 +546,9 @@ CallInst *IRBuilderBase::CreateInvariantStart(Value *Ptr, ConstantInt *Size) {
497
546
498
547
assert (isa<PointerType>(Ptr->getType ()) &&
499
548
" invariant.start only applies to pointers." );
549
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
550
+ Ptr = getCastedInt8PtrValue (Ptr);
551
+ #endif
500
552
if (!Size)
501
553
Size = getInt64 (-1 );
502
554
else
@@ -576,6 +628,9 @@ CallInst *IRBuilderBase::CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment,
576
628
const Twine &Name) {
577
629
auto *PtrTy = cast<PointerType>(Ptr->getType ());
578
630
assert (Ty->isVectorTy () && " Type should be vector" );
631
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
632
+ assert (PtrTy->isOpaqueOrPointeeTypeMatches (Ty) && " Wrong element type" );
633
+ #endif
579
634
assert (Mask && " Mask should not be all-ones (null)" );
580
635
if (!PassThru)
581
636
PassThru = PoisonValue::get (Ty);
@@ -596,6 +651,9 @@ CallInst *IRBuilderBase::CreateMaskedStore(Value *Val, Value *Ptr,
596
651
auto *PtrTy = cast<PointerType>(Ptr->getType ());
597
652
Type *DataTy = Val->getType ();
598
653
assert (DataTy->isVectorTy () && " Val should be a vector" );
654
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
655
+ assert (PtrTy->isOpaqueOrPointeeTypeMatches (DataTy) && " Wrong element type" );
656
+ #endif
599
657
assert (Mask && " Mask should not be all-ones (null)" );
600
658
Type *OverloadedTypes[] = { DataTy, PtrTy };
601
659
Value *Ops[] = {Val, Ptr, getInt32 (Alignment.value ()), Mask};
@@ -630,6 +688,12 @@ CallInst *IRBuilderBase::CreateMaskedGather(Type *Ty, Value *Ptrs,
630
688
auto *VecTy = cast<VectorType>(Ty);
631
689
ElementCount NumElts = VecTy->getElementCount ();
632
690
auto *PtrsTy = cast<VectorType>(Ptrs->getType ());
691
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
692
+ assert (cast<PointerType>(PtrsTy->getElementType ())
693
+ ->isOpaqueOrPointeeTypeMatches (
694
+ cast<VectorType>(Ty)->getElementType ()) &&
695
+ " Element type mismatch" );
696
+ #endif
633
697
assert (NumElts == PtrsTy->getElementCount () && " Element count mismatch" );
634
698
635
699
if (!Mask)
@@ -660,6 +724,15 @@ CallInst *IRBuilderBase::CreateMaskedScatter(Value *Data, Value *Ptrs,
660
724
auto *DataTy = cast<VectorType>(Data->getType ());
661
725
ElementCount NumElts = PtrsTy->getElementCount ();
662
726
727
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
728
+ #ifndef NDEBUG
729
+ auto *PtrTy = cast<PointerType>(PtrsTy->getElementType ());
730
+ assert (NumElts == DataTy->getElementCount () &&
731
+ PtrTy->isOpaqueOrPointeeTypeMatches (DataTy->getElementType ()) &&
732
+ " Incompatible pointer and data types" );
733
+ #endif
734
+ #endif
735
+
663
736
if (!Mask)
664
737
Mask = getAllOnesMask (NumElts);
665
738
@@ -682,7 +755,16 @@ CallInst *IRBuilderBase::CreateMaskedScatter(Value *Data, Value *Ptrs,
682
755
CallInst *IRBuilderBase::CreateMaskedExpandLoad (Type *Ty, Value *Ptr,
683
756
Value *Mask, Value *PassThru,
684
757
const Twine &Name) {
758
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
759
+ auto *PtrTy = cast<PointerType>(Ptr->getType ());
760
+ #endif
685
761
assert (Ty->isVectorTy () && " Type should be vector" );
762
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
763
+ assert (PtrTy->isOpaqueOrPointeeTypeMatches (
764
+ cast<FixedVectorType>(Ty)->getElementType ()) &&
765
+ " Wrong element type" );
766
+ (void )PtrTy;
767
+ #endif
686
768
assert (Mask && " Mask should not be all-ones (null)" );
687
769
if (!PassThru)
688
770
PassThru = PoisonValue::get (Ty);
@@ -699,8 +781,17 @@ CallInst *IRBuilderBase::CreateMaskedExpandLoad(Type *Ty, Value *Ptr,
699
781
// / be accessed in memory
700
782
CallInst *IRBuilderBase::CreateMaskedCompressStore (Value *Val, Value *Ptr,
701
783
Value *Mask) {
784
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
785
+ auto *PtrTy = cast<PointerType>(Ptr->getType ());
786
+ #endif
702
787
Type *DataTy = Val->getType ();
703
788
assert (DataTy->isVectorTy () && " Val should be a vector" );
789
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
790
+ assert (PtrTy->isOpaqueOrPointeeTypeMatches (
791
+ cast<FixedVectorType>(DataTy)->getElementType ()) &&
792
+ " Wrong element type" );
793
+ (void )PtrTy;
794
+ #endif
704
795
assert (Mask && " Mask should not be all-ones (null)" );
705
796
Type *OverloadedTypes[] = {DataTy};
706
797
Value *Ops[] = {Val, Ptr, Mask};
@@ -1121,6 +1212,11 @@ Value *IRBuilderBase::CreatePtrDiff(Type *ElemTy, Value *LHS, Value *RHS,
1121
1212
const Twine &Name) {
1122
1213
assert (LHS->getType () == RHS->getType () &&
1123
1214
" Pointer subtraction operand types must match!" );
1215
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1216
+ assert (cast<PointerType>(LHS->getType ())
1217
+ ->isOpaqueOrPointeeTypeMatches (ElemTy) &&
1218
+ " Pointer type must match element type" );
1219
+ #endif
1124
1220
Value *LHS_int = CreatePtrToInt (LHS, Type::getInt64Ty (Context));
1125
1221
Value *RHS_int = CreatePtrToInt (RHS, Type::getInt64Ty (Context));
1126
1222
Value *Difference = CreateSub (LHS_int, RHS_int);
@@ -1131,8 +1227,29 @@ Value *IRBuilderBase::CreatePtrDiff(Type *ElemTy, Value *LHS, Value *RHS,
1131
1227
Value *IRBuilderBase::CreateLaunderInvariantGroup (Value *Ptr) {
1132
1228
assert (isa<PointerType>(Ptr->getType ()) &&
1133
1229
" launder.invariant.group only applies to pointers." );
1230
+ // FIXME: we could potentially avoid casts to/from i8*.
1134
1231
auto *PtrType = Ptr->getType ();
1232
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1233
+ auto *Int8PtrTy = getInt8PtrTy (PtrType->getPointerAddressSpace ());
1234
+ if (PtrType != Int8PtrTy)
1235
+ Ptr = CreateBitCast (Ptr, Int8PtrTy);
1236
+ #endif
1135
1237
Module *M = BB->getParent ()->getParent ();
1238
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1239
+ Function *FnLaunderInvariantGroup = Intrinsic::getDeclaration (
1240
+ M, Intrinsic::launder_invariant_group, {Int8PtrTy});
1241
+
1242
+ assert (FnLaunderInvariantGroup->getReturnType () == Int8PtrTy &&
1243
+ FnLaunderInvariantGroup->getFunctionType ()->getParamType (0 ) ==
1244
+ Int8PtrTy &&
1245
+ " LaunderInvariantGroup should take and return the same type" );
1246
+
1247
+ CallInst *Fn = CreateCall (FnLaunderInvariantGroup, {Ptr});
1248
+
1249
+ if (PtrType != Int8PtrTy)
1250
+ return CreateBitCast (Fn, PtrType);
1251
+ return Fn;
1252
+ #else
1136
1253
Function *FnLaunderInvariantGroup = Intrinsic::getDeclaration (
1137
1254
M, Intrinsic::launder_invariant_group, {PtrType});
1138
1255
@@ -1142,14 +1259,36 @@ Value *IRBuilderBase::CreateLaunderInvariantGroup(Value *Ptr) {
1142
1259
" LaunderInvariantGroup should take and return the same type" );
1143
1260
1144
1261
return CreateCall (FnLaunderInvariantGroup, {Ptr});
1262
+ #endif
1145
1263
}
1146
1264
1147
1265
Value *IRBuilderBase::CreateStripInvariantGroup (Value *Ptr) {
1148
1266
assert (isa<PointerType>(Ptr->getType ()) &&
1149
1267
" strip.invariant.group only applies to pointers." );
1150
1268
1269
+ // FIXME: we could potentially avoid casts to/from i8*.
1151
1270
auto *PtrType = Ptr->getType ();
1271
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1272
+ auto *Int8PtrTy = getInt8PtrTy (PtrType->getPointerAddressSpace ());
1273
+ if (PtrType != Int8PtrTy)
1274
+ Ptr = CreateBitCast (Ptr, Int8PtrTy);
1275
+ #endif
1152
1276
Module *M = BB->getParent ()->getParent ();
1277
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1278
+ Function *FnStripInvariantGroup = Intrinsic::getDeclaration (
1279
+ M, Intrinsic::strip_invariant_group, {Int8PtrTy});
1280
+
1281
+ assert (FnStripInvariantGroup->getReturnType () == Int8PtrTy &&
1282
+ FnStripInvariantGroup->getFunctionType ()->getParamType (0 ) ==
1283
+ Int8PtrTy &&
1284
+ " StripInvariantGroup should take and return the same type" );
1285
+
1286
+ CallInst *Fn = CreateCall (FnStripInvariantGroup, {Ptr});
1287
+
1288
+ if (PtrType != Int8PtrTy)
1289
+ return CreateBitCast (Fn, PtrType);
1290
+ return Fn;
1291
+ #else
1153
1292
Function *FnStripInvariantGroup = Intrinsic::getDeclaration (
1154
1293
M, Intrinsic::strip_invariant_group, {PtrType});
1155
1294
@@ -1159,6 +1298,7 @@ Value *IRBuilderBase::CreateStripInvariantGroup(Value *Ptr) {
1159
1298
" StripInvariantGroup should take and return the same type" );
1160
1299
1161
1300
return CreateCall (FnStripInvariantGroup, {Ptr});
1301
+ #endif
1162
1302
}
1163
1303
1164
1304
Value *IRBuilderBase::CreateVectorReverse (Value *V, const Twine &Name) {
@@ -1254,6 +1394,10 @@ Value *IRBuilderBase::CreatePreserveArrayAccessIndex(
1254
1394
auto *BaseType = Base->getType ();
1255
1395
assert (isa<PointerType>(BaseType) &&
1256
1396
" Invalid Base ptr type for preserve.array.access.index." );
1397
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1398
+ assert (cast<PointerType>(BaseType)->isOpaqueOrPointeeTypeMatches (ElTy) &&
1399
+ " Pointer element type mismatch" );
1400
+ #endif
1257
1401
1258
1402
Value *LastIndexV = getInt32 (LastIndex);
1259
1403
Constant *Zero = ConstantInt::get (Type::getInt32Ty (Context), 0 );
@@ -1307,6 +1451,10 @@ Value *IRBuilderBase::CreatePreserveStructAccessIndex(
1307
1451
auto *BaseType = Base->getType ();
1308
1452
assert (isa<PointerType>(BaseType) &&
1309
1453
" Invalid Base ptr type for preserve.struct.access.index." );
1454
+ #ifndef INTEL_SYCL_OPAQUEPOINTER_READY
1455
+ assert (cast<PointerType>(BaseType)->isOpaqueOrPointeeTypeMatches (ElTy) &&
1456
+ " Pointer element type mismatch" );
1457
+ #endif
1310
1458
1311
1459
Value *GEPIndex = getInt32 (Index);
1312
1460
Constant *Zero = ConstantInt::get (Type::getInt32Ty (Context), 0 );
0 commit comments