@@ -37,26 +37,60 @@ void AMDGPUAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
37
37
AU.setPreservesAll ();
38
38
}
39
39
40
+ // Must match the table in getAliasResult.
41
+ AMDGPUAAResult::ASAliasRulesTy::ASAliasRulesTy (AMDGPUAS AS_) : AS(AS_) {
42
+ // These arrarys are indexed by address space value
43
+ // enum elements 0 ... to 5
44
+ static const AliasResult ASAliasRulesPrivIsZero[6 ][6 ] = {
45
+ /* Private Global Constant Group Flat Region*/
46
+ /* Private */ {MayAlias, NoAlias , NoAlias , NoAlias , MayAlias, NoAlias},
47
+ /* Global */ {NoAlias , MayAlias, NoAlias , NoAlias , MayAlias, NoAlias},
48
+ /* Constant */ {NoAlias , NoAlias , MayAlias, NoAlias , MayAlias, NoAlias},
49
+ /* Group */ {NoAlias , NoAlias , NoAlias , MayAlias, MayAlias, NoAlias},
50
+ /* Flat */ {MayAlias, MayAlias, MayAlias, MayAlias, MayAlias, MayAlias},
51
+ /* Region */ {NoAlias , NoAlias , NoAlias , NoAlias , MayAlias, MayAlias}
52
+ };
53
+ static const AliasResult ASAliasRulesGenIsZero[6 ][6 ] = {
54
+ /* Flat Global Region Group Constant Private */
55
+ /* Flat */ {MayAlias, MayAlias, MayAlias, MayAlias, MayAlias, MayAlias},
56
+ /* Global */ {MayAlias, MayAlias, NoAlias , NoAlias , NoAlias , NoAlias},
57
+ /* Region */ {NoAlias , NoAlias , MayAlias, NoAlias, NoAlias , MayAlias},
58
+ /* Group */ {MayAlias, NoAlias , NoAlias , MayAlias, NoAlias , NoAlias},
59
+ /* Constant */ {MayAlias, NoAlias , NoAlias , NoAlias , MayAlias, NoAlias},
60
+ /* Private */ {MayAlias, NoAlias , NoAlias , NoAlias , NoAlias , MayAlias}
61
+ };
62
+ assert (AS.MAX_COMMON_ADDRESS <= 5 );
63
+ if (AS.FLAT_ADDRESS == 0 ) {
64
+ assert (AS.GLOBAL_ADDRESS == 1 &&
65
+ AS.REGION_ADDRESS == 2 &&
66
+ AS.LOCAL_ADDRESS == 3 &&
67
+ AS.CONSTANT_ADDRESS == 4 &&
68
+ AS.PRIVATE_ADDRESS == 5 );
69
+ ASAliasRules = &ASAliasRulesGenIsZero;
70
+ } else {
71
+ assert (AS.PRIVATE_ADDRESS == 0 &&
72
+ AS.GLOBAL_ADDRESS == 1 &&
73
+ AS.CONSTANT_ADDRESS == 2 &&
74
+ AS.LOCAL_ADDRESS == 3 &&
75
+ AS.FLAT_ADDRESS == 4 &&
76
+ AS.REGION_ADDRESS == 5 );
77
+ ASAliasRules = &ASAliasRulesPrivIsZero;
78
+ }
79
+ }
80
+
81
+ AliasResult AMDGPUAAResult::ASAliasRulesTy::getAliasResult (unsigned AS1,
82
+ unsigned AS2) const {
83
+ if (AS1 > AS.MAX_COMMON_ADDRESS || AS2 > AS.MAX_COMMON_ADDRESS )
84
+ report_fatal_error (" Pointer address space out of range" );
85
+ return (*ASAliasRules)[AS1][AS2];
86
+ }
87
+
40
88
AliasResult AMDGPUAAResult::alias (const MemoryLocation &LocA,
41
89
const MemoryLocation &LocB) {
42
- // This array is indexed by the AMDGPUAS::AddressSpaces
43
- // enum elements PRIVATE_ADDRESS ... to FLAT_ADDRESS
44
- // see "llvm/Transforms/AMDSPIRUtils.h"
45
- static const AliasResult ASAliasRules[5 ][5 ] = {
46
- /* Private Global Constant Group Flat */
47
- /* Private */ {MayAlias, NoAlias , NoAlias , NoAlias , MayAlias},
48
- /* Global */ {NoAlias , MayAlias, NoAlias , NoAlias , MayAlias},
49
- /* Constant */ {NoAlias , NoAlias , MayAlias, NoAlias , MayAlias},
50
- /* Group */ {NoAlias , NoAlias , NoAlias , MayAlias, MayAlias},
51
- /* Flat */ {MayAlias, MayAlias, MayAlias, MayAlias, MayAlias}
52
- };
53
90
unsigned asA = LocA.Ptr ->getType ()->getPointerAddressSpace ();
54
91
unsigned asB = LocB.Ptr ->getType ()->getPointerAddressSpace ();
55
- if (asA > AMDGPUAS::AddressSpaces::FLAT_ADDRESS ||
56
- asB > AMDGPUAS::AddressSpaces::FLAT_ADDRESS)
57
- report_fatal_error (" Pointer address space out of range" );
58
92
59
- AliasResult Result = ASAliasRules[ asA][ asB] ;
93
+ AliasResult Result = ASAliasRules. getAliasResult ( asA, asB) ;
60
94
if (Result == NoAlias) return Result;
61
95
62
96
if (isa<Argument>(LocA.Ptr ) && isa<Argument>(LocB.Ptr )) {
@@ -75,8 +109,7 @@ bool AMDGPUAAResult::pointsToConstantMemory(const MemoryLocation &Loc,
75
109
bool OrLocal) {
76
110
const Value *Base = GetUnderlyingObject (Loc.Ptr , DL);
77
111
78
- if (Base->getType ()->getPointerAddressSpace () ==
79
- AMDGPUAS::AddressSpaces::CONSTANT_ADDRESS) {
112
+ if (Base->getType ()->getPointerAddressSpace () == AS.CONSTANT_ADDRESS ) {
80
113
return true ;
81
114
}
82
115
0 commit comments