------- Comment #140 from mark at codesourcery dot com 2007-05-23 21:07 -------
Subject: Re: [4.0/4.1/4.2/4.3 Regression] placement
new does not change the dynamic type as it should
rguenth at gcc dot gnu dot org wrote:
> <quote>
> Gaby's claim is that given an arbitrary
> pointer "p", saying:
>
> (int *)p = 3;
>
> is the same as saying:
>
> *(new (p) int) = 3;
>
> That makes life for the optimizers much, much harder.
> </quote>
>
> I say so as well (that those are the same), but I don't agree that this
> makes life for optimizers much harder.
Placement new is rare; assignments to pointers are everywhere.
Note that the first case does not need to use an explicit cast. In a
function:
void f(int *p) {
*p = 3;
}
under Gaby's interpretation, we cannot be sure that "p" points to an
"int" before this function, so we can't be sure the write to "*p"
doesn't clobber memory of other types. TBAA is one of the few ways to
disambiguate pointers in the absence of whole-program optimization, and
this model really undermines TBAA.
Frankly, I'm surprised that you are taking this position. This is a
change to the compiler that can only hurt high-performance C++
applications, which is an area I know you care about. I know that
you're unhappy about how Ian's patches might hurt programs that use
placement-new in an inner loop, but this model will impose the same
penalties on programs that write to pointers in an inner loop.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286