Skip to content

Commit 02d53b8

Browse files
[AIE2] Alias Analysis using AddrSpace Info
1 parent 461f749 commit 02d53b8

File tree

7 files changed

+208
-6
lines changed

7 files changed

+208
-6
lines changed

llvm/lib/Target/AIE/AIE2TargetTransformInfo.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,18 @@ AIE2TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
197197
}
198198
return std::nullopt;
199199
}
200+
201+
bool AIE2TTIImpl::addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
202+
if (AS0 == AS1)
203+
return true;
204+
205+
// Tile Memory and Data Memory are disjoint, since we allways annotate Tile
206+
// Memory access even if another address space is not annotated we can assume
207+
// that they are disjoint.
208+
const unsigned TileMemoryAS = static_cast<unsigned>(AIE2::AddressSpaces::TM);
209+
if (AS0 == TileMemoryAS || AS1 == TileMemoryAS)
210+
return false;
211+
212+
const AIEBaseAddrSpaceInfo &ASI = ST->getAddrSpaceInfo();
213+
return ASI.addrspacesMayAlias(AS0, AS1);
214+
}

llvm/lib/Target/AIE/AIE2TargetTransformInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ class AIE2TTIImpl : public BasicTTIImplBase<AIE2TTIImpl> {
7171
// This type of code can lead to additional pointer arithmetics and
7272
// and pointer moves (especially due to the pre-pipeliner).
7373
bool isProfitableFoldGEPIntoPHI() const { return false; }
74+
75+
bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const;
7476
};
7577

7678
} // end namespace llvm

llvm/lib/Target/AIE/AIEBaseAddrSpaceInfo.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ class AIEBaseAddrSpaceInfo {
3535
// By default assume conflicts.
3636
return ~0;
3737
}
38+
39+
virtual bool addrspacesMayAlias(unsigned AS1, unsigned AS2) const {
40+
return getMemoryBanksFromAddressSpace(AS1) &
41+
getMemoryBanksFromAddressSpace(AS2);
42+
}
3843
};
3944

4045
} // end namespace llvm

llvm/lib/Target/AIE/AIEBaseAliasAnalysis.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ static cl::opt<bool> DisambiguateAccessSameOriginPointers(
3939
cl::desc("Disambiguate pointers derived from the same origin"),
4040
cl::init(true), cl::Hidden);
4141

42+
static cl::opt<bool>
43+
AddrSpaceAA("aie-alias-analysis-addrspace",
44+
cl::desc("Disambiguate pointers based on address space"),
45+
cl::init(false), cl::Hidden);
46+
4247
#define DEBUG_TYPE "aie-aa"
4348

4449
AnalysisKey AIEBaseAA::Key;
@@ -69,6 +74,7 @@ AIEBaseAAWrapperPass::AIEBaseAAWrapperPass() : ImmutablePass(ID) {
6974

7075
void AIEBaseAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
7176
AU.setPreservesAll();
77+
AU.addRequired<TargetTransformInfoWrapperPass>();
7278
}
7379

7480
static bool isAIEPtrAddIntrinsic(Intrinsic::ID ID, unsigned &InPtrIdx) {
@@ -478,6 +484,14 @@ AliasResult AIEBaseAAResult::alias(const MemoryLocation &LocA,
478484
const Value *BaseA = getUnderlyingObjectAIE(LocA.Ptr);
479485
const Value *BaseB = getUnderlyingObjectAIE(LocB.Ptr);
480486

487+
if (AddrSpaceAA) {
488+
const unsigned AddrSpaceA = LocA.Ptr->getType()->getPointerAddressSpace();
489+
const unsigned AddrSpaceB = LocB.Ptr->getType()->getPointerAddressSpace();
490+
491+
if (!TTI.addrspacesMayAlias(AddrSpaceA, AddrSpaceB))
492+
return AliasResult::NoAlias;
493+
}
494+
481495
if (DisambiguateAccessSameOriginPointers &&
482496
aliasAIEIntrinsic(LocA.Ptr, LocB.Ptr, BaseA, BaseB, 0, 0
483497
/*No virtually unrolled*/) == AliasResult::NoAlias)

llvm/lib/Target/AIE/AIEBaseAliasAnalysis.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "AIE.h"
1818
#include "llvm/Analysis/AliasAnalysis.h"
19+
#include "llvm/Analysis/TargetTransformInfo.h"
1920

2021
namespace llvm {
2122

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

3839
class AIEBaseAAResult : public AAResultBase {
3940
const DataLayout &DL;
41+
const TargetTransformInfo &TTI;
4042

4143
public:
42-
explicit AIEBaseAAResult(const DataLayout &DL) : DL(DL) {}
44+
explicit AIEBaseAAResult(const DataLayout &DL, const TargetTransformInfo &TTI)
45+
: DL(DL), TTI(TTI) {}
4346
AIEBaseAAResult(AIEBaseAAResult &&Arg)
44-
: AAResultBase(std::move(Arg)), DL(Arg.DL) {}
47+
: AAResultBase(std::move(Arg)), DL(Arg.DL), TTI(Arg.TTI) {}
4548

4649
/// Handle invalidation events from the new pass manager.
4750
///
@@ -51,8 +54,9 @@ class AIEBaseAAResult : public AAResultBase {
5154
return false;
5255
}
5356

54-
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
55-
AAQueryInfo &AAQI, const Instruction *CtxI);
57+
virtual AliasResult alias(const MemoryLocation &LocA,
58+
const MemoryLocation &LocB, AAQueryInfo &AAQI,
59+
const Instruction *CtxI);
5660
};
5761

5862
/// Analysis pass providing a never-invalidated alias analysis result.
@@ -65,7 +69,8 @@ class AIEBaseAA : public AnalysisInfoMixin<AIEBaseAA> {
6569
using Result = AIEBaseAAResult;
6670

6771
AIEBaseAAResult run(Function &F, AnalysisManager<Function> &AM) {
68-
return AIEBaseAAResult(F.getParent()->getDataLayout());
72+
const TargetTransformInfo &TTI = AM.getResult<TargetIRAnalysis>(F);
73+
return AIEBaseAAResult(F.getParent()->getDataLayout(), TTI);
6974
}
7075
};
7176

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

8489
bool doInitialization(Module &M) override {
85-
Result.reset(new AIEBaseAAResult(M.getDataLayout()));
90+
if (!M.getFunctionList().empty()) {
91+
const TargetTransformInfo &TTI =
92+
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
93+
M.getFunctionList().front());
94+
Result.reset(new AIEBaseAAResult(M.getDataLayout(), TTI));
95+
}
8696
return false;
8797
}
8898

llvm/lib/Target/AIE/AIETargetTransformInfo.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ class AIETTIImpl : public BasicTTIImplBase<AIETTIImpl> {
6262
UP.Threshold = 200;
6363
BaseT::getUnrollingPreferences(L, SE, UP, ORE);
6464
}
65+
66+
bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
67+
if (AS0 == AS1)
68+
return true;
69+
70+
const AIEBaseAddrSpaceInfo &ASI = ST->getAddrSpaceInfo();
71+
return ASI.addrspacesMayAlias(AS0, AS1);
72+
}
6573
};
6674

6775
} // end namespace llvm
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
;
2+
; This file is licensed under the Apache License v2.0 with LLVM Exceptions.
3+
; See https://llvm.org/LICENSE.txt for license information.
4+
; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5+
;
6+
; (c) Copyright 2024 Advanced Micro Devices, Inc. or its affiliates
7+
; 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
8+
; 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
9+
10+
; CHECK-LABEL: Function: basic_without_AS
11+
; CHECK: MayAlias: i8* %p, i8* %p1
12+
define void @basic_without_AS(ptr %p, ptr %p1) {
13+
load i8, ptr %p
14+
load i8, ptr %p1
15+
ret void
16+
}
17+
18+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_56
19+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(6)* %p1
20+
21+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_56
22+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(6)* %p1
23+
define void @basic_withAS_56(ptr addrspace(5) %p, ptr addrspace(6) %p1) {
24+
load i8, ptr addrspace(5) %p
25+
load i8, ptr addrspace(6) %p1
26+
ret void
27+
}
28+
29+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_67
30+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(6)* %p, i8 addrspace(7)* %p1
31+
32+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_67
33+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(7)* %p1
34+
define void @basic_withAS_67(ptr addrspace(6) %p, ptr addrspace(7) %p1) {
35+
load i8, ptr addrspace(6) %p
36+
load i8, ptr addrspace(7) %p1
37+
ret void
38+
}
39+
40+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_78
41+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(8)* %p, i8 addrspace(7)* %p1
42+
43+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_78
44+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(8)* %p, i8 addrspace(7)* %p1
45+
define void @basic_withAS_78(ptr addrspace(8) %p, ptr addrspace(7) %p1) {
46+
load i8, ptr addrspace(8) %p
47+
load i8, ptr addrspace(7) %p1
48+
ret void
49+
}
50+
51+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_58
52+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(8)* %p1
53+
54+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_58
55+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(8)* %p1
56+
define void @basic_withAS_58(ptr addrspace(5) %p, ptr addrspace(8) %p1) {
57+
load i8, ptr addrspace(5) %p
58+
load i8, ptr addrspace(8) %p1
59+
ret void
60+
}
61+
62+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_A_AB
63+
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(9)* %p1
64+
65+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_A_AB
66+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(9)* %p1
67+
define void @basic_withAS_compund_A_AB(ptr addrspace(5) %p, ptr addrspace(9) %p1) {
68+
load i8, ptr addrspace(5) %p
69+
load i8, ptr addrspace(9) %p1
70+
ret void
71+
}
72+
73+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_B_AB
74+
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(9)* %p1
75+
76+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_B_AB
77+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(6)* %p, i8 addrspace(9)* %p1
78+
define void @basic_withAS_compund_B_AB(ptr addrspace(6) %p, ptr addrspace(9) %p1) {
79+
load i8, ptr addrspace(6) %p
80+
load i8, ptr addrspace(9) %p1
81+
ret void
82+
}
83+
84+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_C_AB
85+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(7)* %p, i8 addrspace(9)* %p1
86+
87+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_C_AB
88+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(7)* %p, i8 addrspace(9)* %p1
89+
define void @basic_withAS_compund_C_AB(ptr addrspace(7) %p, ptr addrspace(9) %p1) {
90+
load i8, ptr addrspace(7) %p
91+
load i8, ptr addrspace(9) %p1
92+
ret void
93+
}
94+
95+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_AB_CD
96+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(9)* %p, i8 addrspace(14)* %p1
97+
98+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_compund_AB_CD
99+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(9)* %p, i8 addrspace(14)* %p1
100+
define void @basic_withAS_compund_AB_CD(ptr addrspace(9) %p, ptr addrspace(14) %p1) {
101+
load i8, ptr addrspace(9) %p
102+
load i8, ptr addrspace(14) %p1
103+
ret void
104+
}
105+
106+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_TM_noAS
107+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(15)* %p, i8* %p1
108+
109+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_TM_noAS
110+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8* %p1
111+
define void @basic_TM_noAS(ptr addrspace(15) %p, ptr %p1) {
112+
load i8, ptr addrspace(15) %p
113+
load i8, ptr %p1
114+
ret void
115+
}
116+
117+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_noAS_TM
118+
; ENABLED-AIE-AS-AA: NoAlias: i8* %p, i8 addrspace(15)* %p1
119+
120+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_noAS_TM
121+
; DISABLED-AIE-AS-AA: MayAlias: i8* %p, i8 addrspace(15)* %p1
122+
define void @basic_noAS_TM(ptr %p, ptr addrspace(15) %p1) {
123+
load i8, ptr %p
124+
load i8, ptr addrspace(15) %p1
125+
ret void
126+
}
127+
128+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_TM_TM
129+
; ENABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8 addrspace(15)* %p1
130+
131+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_TM_TM
132+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(15)* %p, i8 addrspace(15)* %p1
133+
define void @basic_withAS_TM_TM(ptr addrspace(15) %p, ptr addrspace(15) %p1) {
134+
load i8, ptr addrspace(15) %p
135+
load i8, ptr addrspace(15) %p1
136+
ret void
137+
}
138+
139+
; ENABLED-AIE-AS-AA-LABEL: Function: basic_withAS_A_TM
140+
; ENABLED-AIE-AS-AA: NoAlias: i8 addrspace(5)* %p, i8 addrspace(15)* %p1
141+
142+
; DISABLED-AIE-AS-AA-LABEL: Function: basic_withAS_A_TM
143+
; DISABLED-AIE-AS-AA: MayAlias: i8 addrspace(5)* %p, i8 addrspace(15)* %p1
144+
define void @basic_withAS_A_TM(ptr addrspace(5) %p, ptr addrspace(15) %p1) {
145+
load i8, ptr addrspace(5) %p
146+
load i8, ptr addrspace(15) %p1
147+
ret void
148+
}

0 commit comments

Comments
 (0)