Skip to content

Commit

Permalink
[AIE2] Alias Analysis using AddrSpace Info
Browse files Browse the repository at this point in the history
  • Loading branch information
krishnamtibrewala committed Aug 28, 2024
1 parent c246ea0 commit decda4b
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 56 deletions.
67 changes: 67 additions & 0 deletions llvm/lib/Target/AIE/AIE2AddrSpace.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
//
//===----------------------------------------------------------------------===//

#include <bitset>

#ifndef LLVM_SUPPORT_AIE2ADDRSPACE_H
#define LLVM_SUPPORT_AIE2ADDRSPACE_H

Expand Down Expand Up @@ -40,6 +42,71 @@ enum class AddressSpaces {

enum class AIEBanks { A, B, C, D, TileMemory };

static inline uint64_t getDefaultMemoryBank() {
std::bitset<32> MemoryBanks;
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::C))
.set(static_cast<unsigned>(AIEBanks::D));
return MemoryBanks.to_ulong();
}

static inline uint64_t getMemoryBanksFromAddressSpace(unsigned AddrSpace) {
std::bitset<32> MemoryBanks;

switch (static_cast<AddressSpaces>(AddrSpace)) {
case AddressSpaces::a:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A));
break;
case AddressSpaces::b:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B));
break;
case AddressSpaces::c:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::d:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::ab:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::B));
break;
case AddressSpaces::ac:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::ad:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::bc:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::bd:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::cd:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::C))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::TM:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::TileMemory));
break;
default:
MemoryBanks.set();
break;
}

return MemoryBanks.to_ulong();
}

static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) {
return getMemoryBanksFromAddressSpace(AS1) &
getMemoryBanksFromAddressSpace(AS2);
}

} // end namespace AIE2
} // end namespace llvm

Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/Target/AIE/AIE2AliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include "AIE2AliasAnalysis.h"
#include "AIE2.h"
#include "AIE2AddrSpace.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/ValueTracking.h"
Expand All @@ -27,6 +28,10 @@

using namespace llvm;

static cl::opt<bool>
ASBasedAA("aie2-AS-AA", cl::init(false),
cl::desc("Alias Analysis based on Address Space"), cl::Hidden);

#define DEBUG_TYPE "aie2-aa"

char AIE2AAWrapperPass::ID = 0;
Expand All @@ -50,5 +55,14 @@ void AIE2AAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AliasResult AIE2AAResult::alias(const MemoryLocation &LocA,
const MemoryLocation &LocB, AAQueryInfo &AAQI,
const Instruction *CtxI) {
if (ASBasedAA) {
unsigned ASLocA = LocA.Ptr->getType()->getPointerAddressSpace();
unsigned ASLocB = LocB.Ptr->getType()->getPointerAddressSpace();

LLVM_DEBUG(dbgs() << "ASLocA: " << ASLocA << " ASLocB: " << ASLocB << "\n");
if (!AIE2::addrspacesMayAlias(ASLocA, ASLocB))
return AliasResult::NoAlias;
}

return AIEBaseAAResult::alias(LocA, LocB, AAQI, CtxI);
}
58 changes: 2 additions & 56 deletions llvm/lib/Target/AIE/AIE2Subtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,64 +78,10 @@ InstructionSelector *AIE2Subtarget::getInstructionSelector() const {
}

MemoryBankBits AIE2Subtarget::getDefaultMemoryBank() const {
using namespace AIE2;
std::bitset<32> MemoryBanks;
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::C))
.set(static_cast<unsigned>(AIEBanks::D));
return MemoryBanks.to_ulong();
return AIE2::getDefaultMemoryBank();
}

MemoryBankBits
AIE2Subtarget::getMemoryBanksFromAddressSpace(unsigned AddrSpace) const {
using namespace AIE2;
std::bitset<32> MemoryBanks;

switch (static_cast<AddressSpaces>(AddrSpace)) {
case AddressSpaces::a:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A));
break;
case AddressSpaces::b:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B));
break;
case AddressSpaces::c:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::d:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::ab:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::B));
break;
case AddressSpaces::ac:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::ad:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::A))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::bc:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::C));
break;
case AddressSpaces::bd:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::B))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::cd:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::C))
.set(static_cast<unsigned>(AIEBanks::D));
break;
case AddressSpaces::TM:
MemoryBanks.set(static_cast<unsigned>(AIEBanks::TileMemory));
break;
default:
return getDefaultMemoryBank();
break;
}

return MemoryBanks.to_ulong();
return AIE2::getMemoryBanksFromAddressSpace(AddrSpace);
}

0 comments on commit decda4b

Please sign in to comment.