This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Strenghten assumption about dynamic type changes (placement new)


On Thu, Jul 24, 2014 at 11:23 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> >  *shortptr = exp
>> >  <longer dependency chain with shortptr>
>> >  var = *shortptr
>> >  *intptr = exp
>> >  <longer dependency chain with intptr>
>> >  var = *intptr
>>
>> Yes (that is, you can't hoist the *intptr = exp store above the var = *shortptr
>> load with TBAA only).  You can probably still hoist the <longer dependency
>> chain with intptr>, it's not clear from your example.
>
> Well, this is placement new version of this, where of course the movement is not desirable.
> Obvioulsy the chains can not overlap:
> #include <new>
> #include <stdio.h>
> struct A {short a; short b; A(){a=1;}};
> struct B {int a; B(){a=2;}};
>
> struct A a;
> struct A *pa = &a;
> struct B *pb = reinterpret_cast<struct B *>(&a);
> int
> main()
> {
>   int sum;
>   struct A *ppa = pa;
>   struct B *ppb = pb;
>   if (!pa || !pb)
>     return 1;
>   ppa->~A();
>   new (ppa) A();
>   asm ("#asm1":"=m"(ppa->a):"m"(ppa->a));
>   sum = ppa->a*11;
>   new (ppb) B();
>
>   asm ("#asm2":"=m"(ppb->a):"m"(ppb->a));
>   sum += ppb->a*11;
>   printf ("%i\n",sum);
>   return 0;
> }
>
> Of course it makes us i.e. in
> t(short *a, short *b, int *c)
> {
>   int i;
>   for (i=0;i<1000000;i++)
>     c[i]=a[i]+b[i];
> }
>
> generate the fallback case when vectorizing where c is overlapping with a or b, while clang doesn't.

Yep.  I bet clang gets it wrong with placement new (but then for
PODs simply writing to a storage location ends lifetime of the old
object in there and starts lifetime of a new object, so placement new
is not needed to make an overlap valid as far as I read the standard(s)).

So I don't think omitting the runtime alias check is valid for the above
case.

Richard.

> Honza
>>
>> That said, being able to optimize union accesses with TBAA at all
>> is still nice (esp. for GCC).  Now, the C frontend still forces alias-set zero
>> for this case because of the RTL alias oracle disfunctionality which doesn't
>> treat a must-alias as an alias if it can TBAA disambiguate.
>>
>> Richard.
>>
>> > Honza


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]