[ScopedNoAliasAA] Remove an unneccesary set

We are trying to prove that one group of operands is a subset of
another.  We did this by populating two Sets and determining that every
element within one was inside the other.

However, this is unnecessary.  We can simply construct a single set and
test if each operand is within it.

llvm-svn: 278641
This commit is contained in:
David Majnemer 2016-08-15 00:13:04 +00:00
parent 97fcf4be9b
commit 5ec9c58f13
2 changed files with 13 additions and 22 deletions

View File

@ -42,8 +42,6 @@ public:
private:
bool mayAliasInScopes(const MDNode *Scopes, const MDNode *NoAlias) const;
void collectMDInDomain(const MDNode *List, const MDNode *Domain,
SmallPtrSetImpl<const MDNode *> &Nodes) const;
};
/// Analysis pass providing a never-invalidated alias analysis result.

View File

@ -127,15 +127,6 @@ ModRefInfo ScopedNoAliasAAResult::getModRefInfo(ImmutableCallSite CS1,
return AAResultBase::getModRefInfo(CS1, CS2);
}
void ScopedNoAliasAAResult::collectMDInDomain(
const MDNode *List, const MDNode *Domain,
SmallPtrSetImpl<const MDNode *> &Nodes) const {
for (const MDOperand &MDOp : List->operands())
if (const MDNode *MD = dyn_cast<MDNode>(MDOp))
if (AliasScopeNode(MD).getDomain() == Domain)
Nodes.insert(MD);
}
bool ScopedNoAliasAAResult::mayAliasInScopes(const MDNode *Scopes,
const MDNode *NoAlias) const {
if (!Scopes || !NoAlias)
@ -151,19 +142,21 @@ bool ScopedNoAliasAAResult::mayAliasInScopes(const MDNode *Scopes,
// We alias unless, for some domain, the set of noalias scopes in that domain
// is a superset of the set of alias scopes in that domain.
for (const MDNode *Domain : Domains) {
SmallPtrSet<const MDNode *, 16> NANodes, ScopeNodes;
collectMDInDomain(NoAlias, Domain, NANodes);
collectMDInDomain(Scopes, Domain, ScopeNodes);
if (!ScopeNodes.size())
continue;
SmallPtrSet<const MDNode *, 16> NANodes;
for (const MDOperand &MDOp : NoAlias->operands())
if (const MDNode *MD = dyn_cast<MDNode>(MDOp))
if (AliasScopeNode(MD).getDomain() == Domain)
NANodes.insert(MD);
// To not alias, all of the nodes in ScopeNodes must be in NANodes.
// To not alias, all of the nodes in Scopes must be in NANodes.
bool FoundAll = true;
for (const MDNode *SMD : ScopeNodes)
if (!NANodes.count(SMD)) {
FoundAll = false;
break;
}
for (const MDOperand &MDOp : Scopes->operands())
if (const MDNode *SMD = dyn_cast<MDNode>(MDOp))
if (AliasScopeNode(SMD).getDomain() == Domain)
if (!NANodes.count(SMD)) {
FoundAll = false;
break;
}
if (FoundAll)
return false;