@@ -278,6 +278,43 @@ int SCEVAffinator::getLoopDepth(const Loop *L) {
278
278
return L->getLoopDepth () - outerLoop->getLoopDepth ();
279
279
}
280
280
281
+ ScopArrayInfo::ScopArrayInfo (Value *BasePtr, Type *AccessType, isl_ctx *Ctx,
282
+ const SmallVector<const SCEV *, 4 > &DimensionSizes)
283
+ : BasePtr(BasePtr), AccessType(AccessType), DimensionSizes(DimensionSizes) {
284
+ const std::string BasePtrName = getIslCompatibleName (" MemRef_" , BasePtr, " " );
285
+ Id = isl_id_alloc (Ctx, BasePtrName.c_str (), this );
286
+ }
287
+
288
+ ScopArrayInfo::~ScopArrayInfo () { isl_id_free (Id); }
289
+
290
+ isl_id *ScopArrayInfo::getBasePtrId () const { return isl_id_copy (Id); }
291
+
292
+ void ScopArrayInfo::dump () const { print (errs ()); }
293
+
294
+ void ScopArrayInfo::print (raw_ostream &OS) const {
295
+ OS << " ScopArrayInfo:\n " ;
296
+ OS << " Base: " << *getBasePtr () << " \n " ;
297
+ OS << " Type: " << *getType () << " \n " ;
298
+ OS << " Dimension Sizes:\n " ;
299
+ for (unsigned u = 0 ; u < getNumberOfDimensions (); u++)
300
+ OS << " " << u << " ) " << *DimensionSizes[u] << " \n " ;
301
+ OS << " \n " ;
302
+ }
303
+
304
+ const ScopArrayInfo *
305
+ ScopArrayInfo::getFromAccessFunction (__isl_keep isl_pw_multi_aff *PMA) {
306
+ isl_id *Id = isl_pw_multi_aff_get_tuple_id (PMA, isl_dim_out);
307
+ assert (Id && " Output dimension didn't have an ID" );
308
+ return getFromId (Id);
309
+ }
310
+
311
+ const ScopArrayInfo *ScopArrayInfo::getFromId (isl_id *Id) {
312
+ void *User = isl_id_get_user (Id);
313
+ const ScopArrayInfo *SAI = static_cast <ScopArrayInfo *>(User);
314
+ isl_id_free (Id);
315
+ return SAI;
316
+ }
317
+
281
318
const std::string
282
319
MemoryAccess::getReductionOperatorStr (MemoryAccess::ReductionType RT) {
283
320
switch (RT) {
@@ -348,6 +385,14 @@ static MemoryAccess::AccessType getMemoryAccessType(const IRAccess &Access) {
348
385
llvm_unreachable (" Unknown IRAccess type!" );
349
386
}
350
387
388
+ const ScopArrayInfo *MemoryAccess::getScopArrayInfo () const {
389
+ isl_id *ArrayId = getArrayId ();
390
+ void *User = isl_id_get_user (ArrayId);
391
+ const ScopArrayInfo *SAI = static_cast <ScopArrayInfo *>(User);
392
+ isl_id_free (ArrayId);
393
+ return SAI;
394
+ }
395
+
351
396
isl_id *MemoryAccess::getArrayId () const {
352
397
return isl_map_get_tuple_id (AccessRelation, isl_dim_out);
353
398
}
@@ -433,14 +478,15 @@ void MemoryAccess::assumeNoOutOfBound(const IRAccess &Access) {
433
478
}
434
479
435
480
MemoryAccess::MemoryAccess (const IRAccess &Access, Instruction *AccInst,
436
- ScopStmt *Statement)
481
+ ScopStmt *Statement, const ScopArrayInfo *SAI )
437
482
: Type(getMemoryAccessType(Access)), Statement(Statement), Inst(AccInst),
438
483
newAccessRelation(nullptr ) {
439
484
440
485
isl_ctx *Ctx = Statement->getIslCtx ();
441
486
BaseAddr = Access.getBase ();
442
487
BaseName = getIslCompatibleName (" MemRef_" , getBaseAddr (), " " );
443
- isl_id *BaseAddrId = isl_id_alloc (Ctx, getBaseName ().c_str (), nullptr );
488
+
489
+ isl_id *BaseAddrId = SAI->getBasePtrId ();
444
490
445
491
if (!Access.isAffine ()) {
446
492
// We overapproximate non-affine accesses with a possible access to the
@@ -666,18 +712,23 @@ void ScopStmt::buildScattering(SmallVectorImpl<unsigned> &Scatter) {
666
712
}
667
713
668
714
void ScopStmt::buildAccesses (TempScop &tempScop, const Region &CurRegion) {
669
- for (auto &&Access : *tempScop.getAccessFunctions (BB)) {
670
- MemAccs.push_back (new MemoryAccess (Access.first , Access.second , this ));
715
+ for (const auto &AccessPair : *tempScop.getAccessFunctions (BB)) {
716
+ const IRAccess &Access = AccessPair.first ;
717
+ Instruction *AccessInst = AccessPair.second ;
718
+
719
+ const ScopArrayInfo *SAI =
720
+ getParent ()->getOrCreateScopArrayInfo (Access, AccessInst);
721
+ MemAccs.push_back (new MemoryAccess (Access, AccessInst, this , SAI));
671
722
672
723
// We do not track locations for scalar memory accesses at the moment.
673
724
//
674
725
// We do not have a use for this information at the moment. If we need this
675
726
// at some point, the "instruction -> access" mapping needs to be enhanced
676
727
// as a single instruction could then possibly perform multiple accesses.
677
- if (!Access.first . isScalar ()) {
678
- assert (!InstructionToAccess.count (Access. second ) &&
728
+ if (!Access.isScalar ()) {
729
+ assert (!InstructionToAccess.count (AccessInst ) &&
679
730
" Unexpected 1-to-N mapping on instruction to access map!" );
680
- InstructionToAccess[Access. second ] = MemAccs.back ();
731
+ InstructionToAccess[AccessInst ] = MemAccs.back ();
681
732
}
682
733
}
683
734
}
@@ -1373,6 +1424,10 @@ Scop::~Scop() {
1373
1424
for (ScopStmt *Stmt : *this )
1374
1425
delete Stmt;
1375
1426
1427
+ // Free the ScopArrayInfo objects.
1428
+ for (auto &ScopArrayInfoPair : ScopArrayInfoMap)
1429
+ delete ScopArrayInfoPair.second ;
1430
+
1376
1431
// Free the alias groups
1377
1432
for (MinMaxVectorTy *MinMaxAccesses : MinMaxAliasGroups) {
1378
1433
for (MinMaxAccessTy &MMA : *MinMaxAccesses) {
@@ -1383,6 +1438,26 @@ Scop::~Scop() {
1383
1438
}
1384
1439
}
1385
1440
1441
+ const ScopArrayInfo *Scop::getOrCreateScopArrayInfo (const IRAccess &Access,
1442
+ Instruction *AccessInst) {
1443
+ Value *BasePtr = Access.getBase ();
1444
+ const ScopArrayInfo *&SAI = ScopArrayInfoMap[BasePtr];
1445
+ if (!SAI) {
1446
+ Type *AccessType = getPointerOperand (*AccessInst)->getType ();
1447
+ SAI = new ScopArrayInfo (BasePtr, AccessType, getIslCtx (), Access.Sizes );
1448
+ }
1449
+ return SAI;
1450
+ }
1451
+
1452
+ const ScopArrayInfo *Scop::getScopArrayInfo (Value *BasePtr) {
1453
+ const SCEV *PtrSCEV = SE->getSCEV (BasePtr);
1454
+ const SCEVUnknown *PtrBaseSCEV =
1455
+ cast<SCEVUnknown>(SE->getPointerBase (PtrSCEV));
1456
+ const ScopArrayInfo *SAI = ScopArrayInfoMap[PtrBaseSCEV->getValue ()];
1457
+ assert (SAI && " No ScopArrayInfo available for this base pointer" );
1458
+ return SAI;
1459
+ }
1460
+
1386
1461
std::string Scop::getContextStr () const { return stringFromIslObj (Context); }
1387
1462
std::string Scop::getAssumedContextStr () const {
1388
1463
return stringFromIslObj (AssumedContext);
0 commit comments