mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +00:00
When merging to alias sets, if they are both must alias, the result is not
a must alias set unless all of the pointers in the resultant set are must aliased together. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18275 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
276636c93b
commit
cc8d524a24
@ -21,9 +21,9 @@
|
||||
#include <iostream>
|
||||
using namespace llvm;
|
||||
|
||||
/// mergeSetIn - Merge the specified alias set into this alias set...
|
||||
/// mergeSetIn - Merge the specified alias set into this alias set.
|
||||
///
|
||||
void AliasSet::mergeSetIn(AliasSet &AS) {
|
||||
void AliasSet::mergeSetIn(AliasSet &AS, AliasSetTracker &AST) {
|
||||
assert(!AS.Forward && "Alias set is already forwarding!");
|
||||
assert(!Forward && "This set is a forwarding set!!");
|
||||
|
||||
@ -31,6 +31,20 @@ void AliasSet::mergeSetIn(AliasSet &AS) {
|
||||
AccessTy |= AS.AccessTy;
|
||||
AliasTy |= AS.AliasTy;
|
||||
|
||||
if (AliasTy == MustAlias) {
|
||||
// Check that these two merged sets really are must aliases. Since both
|
||||
// used to be must-alias sets, we can just check any pointer from each set
|
||||
// for aliasing.
|
||||
AliasAnalysis &AA = AST.getAliasAnalysis();
|
||||
HashNodePair *L = getSomePointer();
|
||||
HashNodePair *R = AS.getSomePointer();
|
||||
|
||||
// If the pointers are not a must-alias pair, this set becomes a may alias.
|
||||
if (AA.alias(L->first, L->second.getSize(), R->first, R->second.getSize())
|
||||
!= AliasAnalysis::MustAlias)
|
||||
AliasTy = MayAlias;
|
||||
}
|
||||
|
||||
if (CallSites.empty()) { // Merge call sites...
|
||||
if (!AS.CallSites.empty())
|
||||
std::swap(CallSites, AS.CallSites);
|
||||
@ -179,10 +193,10 @@ AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,
|
||||
AliasSet *FoundSet = 0;
|
||||
for (iterator I = begin(), E = end(); I != E; ++I)
|
||||
if (!I->Forward && I->aliasesPointer(Ptr, Size, AA)) {
|
||||
if (FoundSet == 0) { // If this is the first alias set ptr can go into...
|
||||
if (FoundSet == 0) { // If this is the first alias set ptr can go into.
|
||||
FoundSet = I; // Remember it.
|
||||
} else { // Otherwise, we must merge the sets...
|
||||
FoundSet->mergeSetIn(*I); // Merge in contents...
|
||||
} else { // Otherwise, we must merge the sets.
|
||||
FoundSet->mergeSetIn(*I, *this); // Merge in contents.
|
||||
}
|
||||
}
|
||||
|
||||
@ -205,10 +219,10 @@ AliasSet *AliasSetTracker::findAliasSetForCallSite(CallSite CS) {
|
||||
AliasSet *FoundSet = 0;
|
||||
for (iterator I = begin(), E = end(); I != E; ++I)
|
||||
if (!I->Forward && I->aliasesCallSite(CS, AA)) {
|
||||
if (FoundSet == 0) { // If this is the first alias set ptr can go into...
|
||||
if (FoundSet == 0) { // If this is the first alias set ptr can go into.
|
||||
FoundSet = I; // Remember it.
|
||||
} else if (!I->Forward) { // Otherwise, we must merge the sets...
|
||||
FoundSet->mergeSetIn(*I); // Merge in contents...
|
||||
} else if (!I->Forward) { // Otherwise, we must merge the sets.
|
||||
FoundSet->mergeSetIn(*I, *this); // Merge in contents.
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user