Simplify and improve scoped-noalias metadata semantics
authorHal Finkel <hfinkel@anl.gov>
Fri, 25 Jul 2014 15:50:02 +0000 (15:50 +0000)
committerHal Finkel <hfinkel@anl.gov>
Fri, 25 Jul 2014 15:50:02 +0000 (15:50 +0000)
commit6f5c609076f8858a3c3b1b79cc05eebf81830c95
treec190bca2d60438914a1bf9a4f15605b88cb39267
parentdeb8e3091302f7f62fadc939575f561c7d44f9d0
Simplify and improve scoped-noalias metadata semantics

In the process of fixing the noalias parameter -> metadata conversion process
that will take place during inlining (which will be committed soon, but not
turned on by default), I have come to realize that the semantics provided by
yesterday's commit are not really what we want. Here's why:

void foo(noalias a, noalias b, noalias c, bool x) {
  *q = x ? a : b;
  *c = *q;
}

Generically, we know that *c does not alias with *a and with *b (so there is an
'and' in what we know we're not), and we know that *q might be derived from *a
or from *b (so there is an 'or' in what we know that we are). So we do not want
the semantics currently, where any noalias scope matching any alias.scope
causes a NoAlias return. What we want to know is that the noalias scopes form a
superset of the alias.scope list (meaning that all the things we know we're not
is a superset of all of things the other instruction might be).

Making that change, however, introduces a composibility problem. If we inline
once, adding the noalias metadata, and then inline again adding more, and we
append new scopes onto the noalias and alias.scope lists each time. But, this
means that we could change what was a NoAlias result previously into a MayAlias
result because we appended an additional scope onto one of the alias.scope
lists. So, instead of giving scopes the ability to have parents (which I had
borrowed from the TBAA implementation, but seems increasingly unlikely to be
useful in practice), I've given them domains. The subset/superset condition now
applies within each domain independently, and we only need it to hold in one
domain. Each time we inline, we add the new scopes in a new scope domain, and
everything now composes nicely. In addition, this simplifies the
implementation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213948 91177308-0d34-0410-b5e6-96231b3b80d8
docs/LangRef.rst
include/llvm/IR/MDBuilder.h
lib/Analysis/ScopedNoAliasAA.cpp
lib/IR/MDBuilder.cpp
test/Analysis/ScopedNoAliasAA/basic-domains.ll [new file with mode: 0644]
test/Analysis/ScopedNoAliasAA/basic.ll
test/Analysis/ScopedNoAliasAA/basic2.ll