IMA vs tree-ssa

Dale Johannesen dalej@apple.com
Fri Apr 2 00:53:00 GMT 2004


On Apr 1, 2004, at 4:35 PM, Geoff Keating wrote:

> Dale Johannesen <dalej@apple.com> writes:
>
>> On Mar 8, 2004, at 3:32 PM, Joe Buck wrote:
>>> On Mon, Mar 08, 2004 at 11:57:00PM +0100, Gabriel Dos Reis wrote:
>>>>        [#2] All declarations that  refer  to  the  same  object  or
>>>>        function shall have compatible type; otherwise, the behavior
>>>>        is undefined.
>>> This would seem to suggest that in the situations where 
>>> non-transitive
>>> behavior would otherwise result (for example, an incomplete struct
>>> type is
>>> compatible with two distinct and incompatible definitions of that
>>> struct
>>> type), and this matters (for the purpose of aliasing analysis, for
>>> example), we have undefined behavior, so the compiler should be able 
>>> to
>>> act as though this situation does not arise and assume transitivity.
>>
>> Suppose we have 3 types T1, T2, Tcom such that T1 and T2
>> are not compatible, but Tcom is compatible with either T1 or T2.
>> Let's call the relationship between T1 and T2 "pseudo-compatible".
>> Then:
>>
>> Tcom x;
>> T1 * p = (T1 *)&x;
>> T2 * q = (T2 *)&x;
>>
>> foo()
>> {
>>     T1 x = *p;
>>     *q = ...
>> }
>
> Could you elaborate a bit on this example?  I don't believe you can 
> write
>
>      T1 x = *p;
>      *q = ...
>
> in this case, because one of *p or *q will be incomplete.

Indeed when I wrote this the only examples I could construct used 
multiple
files and IMA.   But see Joseph Myers' response for a single-file case.

>> This is not undefined behavior, and the standard says that p and q
>> don't alias in foo.
>
> It does, that it says that if you write
>
>   p = &x;
>   q = &y;
>
> then you can interchange those two assignments.  It does not, however,
> say that *p and *q don't alias.

Restricting p and q to be non-char, it does; *p and *q have 
non-compatible types.



More information about the Gcc mailing list