[llvm-dev] RFC: Resolving TBAA issues
Daniel Berlin via llvm-dev
llvm-dev at lists.llvm.org
Sat Aug 19 09:00:39 PDT 2017
On Sat, Aug 19, 2017 at 6:29 AM, Ivan A. Kosarev via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Daniel, Hal,
>
> I'm trying to figure out what we would need to do in terms of the current
> approach, accepting its limitations,
We don't have to accept the limitations?
We already know it's pretty trivial to extend it, and we aren't against
extending it at all.
> to support unions, member arrays, aggregate accesses
and type identifiers and what I get looks suspiciously simple.
> Can you please check it out and let me know if I'm missing something?
>
>
> For aggregate accesses:
>
> The comment in TypeBasedAliasAnalysis.cpp suggests:
>
> // TODO: We need to check if AccessType of TagA encloses AccessType of
> // TagB to support aggregate AccessType. If yes, return true.
>
> Consider these two accesses:
>
> struct A { int i; };
> struct B { struct A a; } *b;
>
> struct X { int i; } *x;
>
> b->a
> x->i
>
> Following the rule in the comment, the accesses are allowed to overlap,
> which is wrong.
>
i don't believe this to be wrong in terms of the C/C++ TBAA rules.
C rule:
> An object shall have its stored value accessed only by an lvalue
> expression that has one of the following types:
>
> - a type compatible with the effective type of the object,
>
>
> - a qualified version of a type compatible with the effective type of
> the object,
>
>
> - a type that is the signed or unsigned type corresponding to the
> effective type of the object,
>
>
> - a type that is the signed or unsigned type corresponding to a
> qualified version of the effective type of the object,
>
>
> - an aggregate or union type that includes one of the aforementioned
> types among its members (including, recursively, a member of a subaggregate
> or contained union), or
>
>
> - a character type.
>
>
This is an aggregate type that includes a type compatible with the
effective type of the object. In particular,
x->i is an lvalue expression of type "int"
b->a is an lvalue expression of type "struct A"
"struct A" is an aggregate type that includes "int" among its members.
Therefore, the b->a object may access x->i by TBAA
These rules are not based on the name of the type, only the types contained
in the structs.
TBAA cannot distinguish types solely based on name.
C++ is similar:
3.10.10
> If a program attempts to access the stored value of an object through a
> glvalue of other than one of the
> following types the behavior is undefined:54
> — the dynamic type of the object,
> — a cv-qualified version of the dynamic type of the object,
> — a type similar (as defined in 4.4 ) to the dynamic type of the object,
> — a type that is the signed or unsigned type corresponding to the dynamic
> type of the object,
> — a type that is the signed or unsigned type corresponding to a
> cv-qualified version of the dynamic type
> of the object,
> — an aggregate or union type that includes one of the aforementioned types
> among its elements or nonstatic
> data members (including, recursively, an element or non-static data member
> of a subaggregate
> or contained union),
> — a type that is a (possibly cv-qualified) base class type of the dynamic
> type of the object,
> — a char or unsigned char type.
This is not going to end up with a different result in this case.
Do you agree?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170819/2158b238/attachment.html>
More information about the llvm-dev
mailing list