This is the mail archive of the gcc@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: Functions that are CSEable but not pure


On Thu, Oct 04, 2012 at 10:42:59AM +0200, Richard Guenther wrote:
> On Wed, Oct 3, 2012 at 9:00 PM, Jason Merrill <jason@redhat.com> 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


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