Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions llvm/lib/Target/AIE/AIE2TargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ using namespace llvm;
#define DEBUG_TYPE "aie2tti"

static std::optional<Instruction *>
instCombineDemandedBits(InstCombiner &IC, IntrinsicInst &II, unsigned numBits) {
instCombineDemandedBits(InstCombiner &IC, IntrinsicInst &II, unsigned NumBits) {
KnownBits ScalarKnown(32);
if (IC.SimplifyDemandedBits(&II, 0, APInt::getLowBitsSet(32, numBits),
if (IC.SimplifyDemandedBits(&II, 0, APInt::getLowBitsSet(32, NumBits),
ScalarKnown, 0)) {
return &II;
}
Expand Down Expand Up @@ -63,3 +63,18 @@ bool AIE2TTIImpl::isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE,
bool AIE2TTIImpl::isProfitableOuterLSR(const Loop &L) const {
return Common.isProfitableOuterLSR(L);
}

bool AIE2TTIImpl::addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
if (AS0 == AS1)
return true;

// Tile Memory and Data Memory are disjoint, since we allways annotate Tile
// Memory access even if another address space is not annotated we can assume
// that they are disjoint.
const unsigned TileMemoryAS = static_cast<unsigned>(AIE2::AddressSpaces::TM);
if (AS0 == TileMemoryAS || AS1 == TileMemoryAS)
return false;

const AIEBaseAddrSpaceInfo &ASI = getST()->getAddrSpaceInfo();
return ASI.addrspacesMayAlias(AS0, AS1);
}
2 changes: 2 additions & 0 deletions llvm/lib/Target/AIE/AIE2TargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class AIE2TTIImpl : public AIEBaseTTIImpl<AIE2TTIImpl> {
AssumptionCache &AC, TargetLibraryInfo *LibInfo,
HardwareLoopInfo &HWLoopInfo);
bool isProfitableOuterLSR(const Loop &L) const;

bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const;
};

} // end namespace llvm
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Target/AIE/AIEBaseAddrSpaceInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ class AIEBaseAddrSpaceInfo {
// By default assume conflicts.
return ~0;
}

virtual bool addrspacesMayAlias(unsigned AS1, unsigned AS2) const {
return getMemoryBanksFromAddressSpace(AS1) &
getMemoryBanksFromAddressSpace(AS2);
}
};

} // end namespace llvm
Expand Down
14 changes: 14 additions & 0 deletions llvm/lib/Target/AIE/AIEBaseAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ static cl::opt<bool> DisambiguateAccessSameOriginPointers(
cl::desc("Disambiguate pointers derived from the same origin"),
cl::init(true), cl::Hidden);

static cl::opt<bool>
AddrSpaceAA("aie-alias-analysis-addrspace",
cl::desc("Disambiguate pointers based on address space"),
cl::init(false), cl::Hidden);

#define DEBUG_TYPE "aie-aa"

AnalysisKey AIEBaseAA::Key;
Expand Down Expand Up @@ -71,6 +76,7 @@ AIEBaseAAWrapperPass::AIEBaseAAWrapperPass() : ImmutablePass(ID) {

void AIEBaseAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
AU.addRequired<TargetTransformInfoWrapperPass>();
}

static bool isAIEPtrAddIntrinsic(Intrinsic::ID ID, unsigned &InPtrIdx) {
Expand Down Expand Up @@ -597,6 +603,14 @@ AliasResult AIEBaseAAResult::alias(const MemoryLocation &LocA,
const Value *BaseA = getUnderlyingObjectAIE(LocA.Ptr);
const Value *BaseB = getUnderlyingObjectAIE(LocB.Ptr);

if (AddrSpaceAA) {
const unsigned AddrSpaceA = LocA.Ptr->getType()->getPointerAddressSpace();
const unsigned AddrSpaceB = LocB.Ptr->getType()->getPointerAddressSpace();

if (!TTI.addrspacesMayAlias(AddrSpaceA, AddrSpaceB))
return AliasResult::NoAlias;
}

if (DisambiguateAccessSameOriginPointers &&
aliasAIEIntrinsic(LocA.Ptr, LocB.Ptr, BaseA, BaseB, 0, 0
/*No virtually unrolled*/) == AliasResult::NoAlias)
Expand Down
17 changes: 13 additions & 4 deletions llvm/lib/Target/AIE/AIEBaseAliasAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "AIE.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/TargetTransformInfo.h"

namespace llvm {

Expand All @@ -37,11 +38,13 @@ AliasResult aliasAcrossVirtualUnrolls(const MachineInstr *MIA,

class AIEBaseAAResult : public AAResultBase {
const DataLayout &DL;
const TargetTransformInfo &TTI;

public:
explicit AIEBaseAAResult(const DataLayout &DL) : DL(DL) {}
explicit AIEBaseAAResult(const DataLayout &DL, const TargetTransformInfo &TTI)
: DL(DL), TTI(TTI) {}
AIEBaseAAResult(AIEBaseAAResult &&Arg)
: AAResultBase(std::move(Arg)), DL(Arg.DL) {}
: AAResultBase(std::move(Arg)), DL(Arg.DL), TTI(Arg.TTI) {}

/// Handle invalidation events from the new pass manager.
///
Expand All @@ -65,7 +68,8 @@ class AIEBaseAA : public AnalysisInfoMixin<AIEBaseAA> {
using Result = AIEBaseAAResult;

AIEBaseAAResult run(Function &F, AnalysisManager<Function> &AM) {
return AIEBaseAAResult(F.getParent()->getDataLayout());
const TargetTransformInfo &TTI = AM.getResult<TargetIRAnalysis>(F);
return AIEBaseAAResult(F.getParent()->getDataLayout(), TTI);
}
};

Expand All @@ -82,7 +86,12 @@ class AIEBaseAAWrapperPass : public ImmutablePass {
const AIEBaseAAResult &getResult() const { return *Result; }

bool doInitialization(Module &M) override {
Result.reset(new AIEBaseAAResult(M.getDataLayout()));
if (!M.getFunctionList().empty()) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we do not have a function list in the module, shouldn't we still reset previous AliasResults`?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Theoretically yes. Although no one is going to query it in a module without functions. It seems to need TTI, which is normally found in the function. I wouldn't know where to find it otherwise.

const TargetTransformInfo &TTI =
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
M.getFunctionList().front());
Result.reset(new AIEBaseAAResult(M.getDataLayout(), TTI));
}
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/AIE/AIEBaseTargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ template <typename T> class AIEBaseTTIImpl : public BasicTTIImplBase<T> {
const AIESubtarget *ST;
const AIEBaseTargetLowering *TLI;

const AIESubtarget *getST() const { return ST; }
const AIEBaseTargetLowering *getTLI() const { return TLI; }
/// Helper function to access this as a T.
T *thisT() { return static_cast<T *>(this); }

protected:
const AIESubtarget *getST() const { return ST; }
explicit AIEBaseTTIImpl(const TargetMachine *TM, const DataLayout &DL,
const AIESubtarget *Subtarget)
: BaseT(TM, DL), ST(Subtarget), TLI(Subtarget->getTargetLowering()) {}
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/Target/AIE/AIETargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ class AIETTIImpl : public BasicTTIImplBase<AIETTIImpl> {
UP.Threshold = 200;
BaseT::getUnrollingPreferences(L, SE, UP, ORE);
}

bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
if (AS0 == AS1)
return true;

const AIEBaseAddrSpaceInfo &ASI = ST->getAddrSpaceInfo();
return ASI.addrspacesMayAlias(AS0, AS1);
}
};

} // end namespace llvm
Expand Down
148 changes: 148 additions & 0 deletions llvm/test/CodeGen/AIE/alias-analysis-AA.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
;
; This file is licensed under the Apache License v2.0 with LLVM Exceptions.
; See https://llvm.org/LICENSE.txt for license information.
; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
;
; (c) Copyright 2024 Advanced Micro Devices, Inc. or its affiliates
; RUN: opt -mtriple=aie2 -passes=aa-eval -print-all-alias-modref-info --aie-alias-analysis-addrspace=true -disable-output < %s 2>&1 | FileCheck %s --check-prefixes=CHECK,ENABLED-AIE-AS-AA
; RUN: opt -mtriple=aie2 -passes=aa-eval -print-all-alias-modref-info --aie-alias-analysis-addrspace=false -disable-output < %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DISABLED-AIE-AS-AA

; CHECK-LABEL: Function: basic_without_AS
; CHECK: MayAlias: i8* %p, i8* %p1
define void @basic_without_AS(ptr %p, ptr %p1) {
load i8, ptr %p
load i8, ptr %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_56
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(6)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_56
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(6)* %p1
define void @basic_withAS_56(ptr addrspace(5) %p, ptr addrspace(6) %p1) {
load i8, ptr addrspace(5) %p
load i8, ptr addrspace(6) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_67
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(6)* %p, i8 addrspace(7)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_67
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(7)* %p1
define void @basic_withAS_67(ptr addrspace(6) %p, ptr addrspace(7) %p1) {
load i8, ptr addrspace(6) %p
load i8, ptr addrspace(7) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_78
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(8)* %p, i8 addrspace(7)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_78
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(8)* %p, i8 addrspace(7)* %p1
define void @basic_withAS_78(ptr addrspace(8) %p, ptr addrspace(7) %p1) {
load i8, ptr addrspace(8) %p
load i8, ptr addrspace(7) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_58
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(8)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_58
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(8)* %p1
define void @basic_withAS_58(ptr addrspace(5) %p, ptr addrspace(8) %p1) {
load i8, ptr addrspace(5) %p
load i8, ptr addrspace(8) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_A_AB
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(9)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_A_AB
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(9)* %p1
define void @basic_withAS_compund_A_AB(ptr addrspace(5) %p, ptr addrspace(9) %p1) {
load i8, ptr addrspace(5) %p
load i8, ptr addrspace(9) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_B_AB
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(9)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_B_AB
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(9)* %p1
define void @basic_withAS_compund_B_AB(ptr addrspace(6) %p, ptr addrspace(9) %p1) {
load i8, ptr addrspace(6) %p
load i8, ptr addrspace(9) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_C_AB
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(7)* %p, i8 addrspace(9)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_C_AB
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(7)* %p, i8 addrspace(9)* %p1
define void @basic_withAS_compund_C_AB(ptr addrspace(7) %p, ptr addrspace(9) %p1) {
load i8, ptr addrspace(7) %p
load i8, ptr addrspace(9) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_AB_CD
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(9)* %p, i8 addrspace(14)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_AB_CD
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(9)* %p, i8 addrspace(14)* %p1
define void @basic_withAS_compund_AB_CD(ptr addrspace(9) %p, ptr addrspace(14) %p1) {
load i8, ptr addrspace(9) %p
load i8, ptr addrspace(14) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_TM_noAS
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(15)* %p, i8* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_TM_noAS
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8* %p1
define void @basic_TM_noAS(ptr addrspace(15) %p, ptr %p1) {
load i8, ptr addrspace(15) %p
load i8, ptr %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_noAS_TM
; ENABLED-AIE-AS-AA: NoAlias: i8* %p, i8 addrspace(15)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_noAS_TM
; DISABLED-AIE-AS-AA: MayAlias: i8* %p, i8 addrspace(15)* %p1
define void @basic_noAS_TM(ptr %p, ptr addrspace(15) %p1) {
load i8, ptr %p
load i8, ptr addrspace(15) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_TM_TM
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8 addrspace(15)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_TM_TM
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8 addrspace(15)* %p1
define void @basic_withAS_TM_TM(ptr addrspace(15) %p, ptr addrspace(15) %p1) {
load i8, ptr addrspace(15) %p
load i8, ptr addrspace(15) %p1
ret void
}

; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_A_TM
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(15)* %p1

; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_A_TM
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(15)* %p1
define void @basic_withAS_A_TM(ptr addrspace(5) %p, ptr addrspace(15) %p1) {
load i8, ptr addrspace(5) %p
load i8, ptr addrspace(15) %p1
ret void
}