On Thu, Oct 04, 2012 at 10:42:59AM +0200, Richard Guenther wrote:
> On Wed, Oct 3, 2012 at 9:00 PM, Jason Merrill <[email protected]> wrote:
> If the result is not needed, are we allowed to remove a call to this
> function?
No. Unless you know the same function has been already called.
> So - what's wrong with using pure? That it doesn't "feel" correct?
No, it can modify memory.
Consider:
a.h:
extern int g;
struct S
{
S () { __atomic_add_fetch (&g, 1, __ATOMIC_RELAXED); s = 7; }
int s;
};
extern thread_local S s;
liba.C:
#include "a.h"
thread_local S s;
libb.C:
#include "a.h"
int g;
void
foo (S *&p, S *&q, int &a, int &b)
{
a = g;
p = &s; // this runs S::S() in the current thread
b = g;
q = &s;
}
I think the plan was for these functions not to return any value,
so that they could be aliases for all thread_local vars defined in the same
TU. Then you really can't DCE the first call, you can the second call.
If it returns void, CSEable is probably a bad word.
Even if it returns value and the value is unused, it still needs to be
called the first time in a function, and can modify anything the ctor(s)
can modify.
Jakub