From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31833 invoked by alias); 9 Jun 2009 17:11:26 -0000 Received: (qmail 31615 invoked by uid 48); 9 Jun 2009 17:11:13 -0000 Date: Tue, 09 Jun 2009 17:11:00 -0000 Message-ID: <20090609171113.31614.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug c++/40389] optimizer bug (possibly) In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "jakub at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-06/txt/msg00564.txt.bz2 ------- Comment #2 from jakub at gcc dot gnu dot org 2009-06-09 17:11 ------- Confirmed. Shorter testcase: template struct S { V *f, *l; __attribute__ ((noinline)) S (void) { f = 0, l = 0; } void foo (V *x) { if (x->p != 0) x->p->n = x->n; else f = x->n; if (x->n != 0) x->n->p = x->p; else l = x->p; } __attribute__ ((noinline)) void bar (V *x) { x->n = 0; x->p = l; if (l != 0) l->n = x; else f = x; l = x; } }; struct H; struct A { S k; }; struct H { A *a; H *p, *n; __attribute__ ((noinline)) H (void) { p = 0, n = 0, a = 0; } __attribute__ ((noinline)) H (A *b) : a (b) { p = 0; n = 0; if (a != 0) a->k.bar (this); } __attribute__ ((noinline)) H (const H &h) : a (h.a) { p = 0; n = 0; if (a != 0) a->k.bar (this); } ~H (void) { if (a != 0) a->k.foo (this); } H &operator= (const H &o) { if (a != 0 || &o == this) __builtin_abort (); a = o.a; if (a != 0) a->k.bar (this); return *this; } }; __attribute__ ((noinline)) H baz (void) { return H (new A); } H g; int main (void) { g = baz (); if (g.a->k.f != &g) __builtin_abort (); return 0; } doesn't fail with -O -fno-tree-sra, fails with -O. I've added a few noinline attributes to make the debugging easier. Seems values from baz returned object are cached in local variables across the bar call which modifies them. Likely gcc doesn't consider this object as having address taken, even when it is returned by invisible reference. -- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2009-06-09 17:11:13 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40389