public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/29286]  New: placement new does not provide required side-effects
@ 2006-09-29 14:14 rguenth at gcc dot gnu dot org
  2006-09-29 14:15 ` [Bug libstdc++/29286] " rguenth at gcc dot gnu dot org
                   ` (180 more replies)
  0 siblings, 181 replies; 190+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2006-09-29 14:14 UTC (permalink / raw)
  To: gcc-bugs

Placement new is specified to end life-time of the object starting life-time of
a new one.  The current implementation messes up with aliasing though, so
stores are re-ordered:

#include <new>
struct Foo { long i; };
struct Bar { void *p; };
long foo(int n)
{
  Foo *f = new Foo;
  f->i = 1;
  for (int i=0; i<n; ++i)
    {
      Bar *b = new (f) Bar;
      b->p = 0;
      f = new (f) Foo;
      f->i = i;
    }
  return f->i;
}

Produces .099t.optimized:

long int foo(int) (n)
{
  struct Foo * f;
  void * D.2530;

<bb 2>:
  D.2530 = operator new (8);
  f = (struct Foo *) D.2530;
  f->i = 1;
  if (n > 0) goto <L7>; else goto <L2>;

<L7>:;
  f->i = (long int) ((unsigned int) n - 1);
  ((struct Bar *) f)->p = 0B;

<L2>:;
  return f->i;

}

where the stores to Bar::p and Foo:i are reordered.  Until .147r.bbro
everything looks like above on RTL level, too:

...
;; Start of basic block 3, registers live: 1 [dx] 3 [bx] 7 [sp]
(note:HI 21 19 22 3 [bb 3] NOTE_INSN_BASIC_BLOCK)

(note:HI 22 21 48 3 NOTE_INSN_DELETED)

(insn 48 22 24 3 (set (reg:DI 0 ax [63])
        (zero_extend:DI (subreg:SI (plus:DI (reg:DI 3 bx [orig:61 n ] [61])
                    (const_int -1 [0xffffffffffffffff])) 0))) 195 {*lea_1_zext}
(nil)
    (expr_list:REG_DEAD (reg:DI 3 bx [orig:61 n ] [61])
        (nil)))

(insn:HI 24 48 25 3 (set (mem/s:DI (reg/v/f:DI 1 dx [orig:58 f ] [58]) [3
<variable>.i+0 S8 A64])
        (reg:DI 0 ax [63])) 81 {*movdi_1_rex64} (insn_list:REG_DEP_TRUE 23
(nil))
    (expr_list:REG_DEAD (reg:DI 0 ax [63])
        (nil)))

(insn:HI 25 24 26 3 (set (mem/s/f:DI (reg/v/f:DI 1 dx [orig:58 f ] [58]) [5
<variable>.p+0 S8 A64])
        (const_int 0 [0x0])) 81 {*movdi_1_rex64} (nil)
    (nil))
;; End of basic block 3, registers live:
 1 [dx] 7 [sp]
...

but now (unfortunately) scheduling reorders them back (on x86_64), so the
assembly looks good again:

_Z3fooi:
.LFB15:
        pushq   %rbx
.LCFI0:
        movl    %edi, %ebx
        movl    $8, %edi
        call    _Znwm
        testl   %ebx, %ebx
        movq    %rax, %rdx
        movq    $1, (%rax)
        jle     .L2
        leal    -1(%rbx), %eax
        movq    $0, (%rdx)
        movq    %rax, (%rdx)
.L2:
        popq    %rbx
        movq    (%rdx), %rax
        ret

But with -O2 -fno-schedule-insns2 we finally get wrong-code for this:

_Z3fooi:
.LFB15:
        pushq   %rbx
.LCFI0:
        movl    %edi, %ebx
        movl    $8, %edi
        call    _Znwm
        movq    %rax, %rdx
        movq    $1, (%rax)
        testl   %ebx, %ebx
        jle     .L2
        leal    -1(%rbx), %eax
        movq    %rax, (%rdx)
        movq    $0, (%rdx)
.L2:
        movq    (%rdx), %rax
        popq    %rbx
        ret


-- 
           Summary: placement new does not provide required side-effects
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: wrong-code, alias
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29286


^ permalink raw reply	[flat|nested] 190+ messages in thread

end of thread, other threads:[~2010-06-20  0:01 UTC | newest]

Thread overview: 190+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-29 14:14 [Bug libstdc++/29286] New: placement new does not provide required side-effects rguenth at gcc dot gnu dot org
2006-09-29 14:15 ` [Bug libstdc++/29286] " rguenth at gcc dot gnu dot org
2006-09-29 14:17 ` [Bug libstdc++/29286] [4.2 Regression] " rguenth at gcc dot gnu dot org
2006-09-29 14:30 ` pcarlini at suse dot de
2006-09-29 14:38 ` rguenth at gcc dot gnu dot org
2006-09-29 14:52 ` pcarlini at suse dot de
2006-09-29 15:49 ` pinskia at gcc dot gnu dot org
2006-09-29 15:51 ` [Bug libstdc++/29286] [4.2 Regression] placement new does not change the dynamic type as it should pinskia at gcc dot gnu dot org
2006-09-29 16:08 ` pcarlini at suse dot de
2006-09-29 16:19 ` pinskia at gcc dot gnu dot org
2006-09-29 16:23 ` pcarlini at suse dot de
2006-09-29 16:25 ` rguenth at gcc dot gnu dot org
2006-09-29 16:25 ` rguenth at gcc dot gnu dot org
2006-09-29 16:58 ` [Bug libstdc++/29286] [4.0/4.1/4.2 " pinskia at gcc dot gnu dot org
2006-09-29 17:01 ` pinskia at gcc dot gnu dot org
2006-10-01 18:39 ` mmitchel at gcc dot gnu dot org
2006-10-01 23:05 ` mmitchel at gcc dot gnu dot org
2006-10-02  9:32 ` mrs at apple dot com
2006-10-02 17:48 ` mmitchel at gcc dot gnu dot org
2006-10-02 19:28 ` mrs at apple dot com
2006-10-03 16:03 ` ian at airs dot com
2006-10-03 16:13 ` mark at codesourcery dot com
2006-10-03 23:44 ` ian at airs dot com
2006-10-04  5:39 ` mark at codesourcery dot com
2006-10-24  6:53   ` Gabriel Dos Reis
2006-10-09  8:22 ` rguenth at gcc dot gnu dot org
2006-10-24  6:53 ` [Bug libstdc++/29286] [4.0/4.1/4.2/4.3 " gdr at integrable-solutions dot net
2006-12-29 20:28 ` dberlin at gcc dot gnu dot org
2007-01-01  0:41 ` mark at codesourcery dot com
2007-01-02  3:01   ` Daniel Berlin
2007-01-02  3:01 ` dberlin at dberlin dot org
2007-01-02  3:24 ` mark at codesourcery dot com
2007-05-02 15:57 ` ian at airs dot com
2007-05-02 16:11 ` pinskia at gcc dot gnu dot org
2007-05-02 16:14 ` pinskia at gcc dot gnu dot org
2007-05-02 20:41 ` mark at codesourcery dot com
2007-05-03 19:33 ` ian at airs dot com
2007-05-03 20:45 ` pcarlini at suse dot de
2007-05-03 20:49 ` pinskia at gcc dot gnu dot org
2007-05-03 20:59 ` rguenth at gcc dot gnu dot org
2007-05-03 21:25 ` pcarlini at suse dot de
2007-05-04  2:47 ` mark at codesourcery dot com
2007-05-04  3:54 ` bangerth at dealii dot org
2007-05-04  6:37 ` ian at airs dot com
2007-05-04  8:41 ` pcarlini at suse dot de
2007-05-04 10:45 ` rguenth at gcc dot gnu dot org
2007-05-04 11:04 ` pcarlini at suse dot de
2007-05-04 11:08 ` pcarlini at suse dot de
2007-05-04 12:03 ` rguenth at gcc dot gnu dot org
2007-05-04 14:31 ` rguenth at gcc dot gnu dot org
2007-05-04 15:55 ` ian at airs dot com
2007-05-04 15:57 ` rguenth at gcc dot gnu dot org
2007-05-11 23:22 ` ian at airs dot com
2007-05-12  0:36 ` dberlin at dberlin dot org
2007-05-12  9:48 ` rguenth at gcc dot gnu dot org
2007-05-12 11:11 ` rguenth at gcc dot gnu dot org
2007-05-12 13:29 ` dberlin at dberlin dot org
2007-05-12 18:41 ` ian at airs dot com
2007-05-12 18:44 ` ian at airs dot com
2007-05-12 21:48 ` rguenth at gcc dot gnu dot org
2007-05-13 10:04 ` rguenth at gcc dot gnu dot org
2007-05-14  3:45 ` ian at airs dot com
2007-05-14  4:00 ` dberlin at dberlin dot org
2007-05-14  8:25 ` rguenth at gcc dot gnu dot org
2007-05-14 11:44   ` Daniel Berlin
2007-05-14 11:44 ` dberlin at dberlin dot org
2007-05-14 15:20 ` rguenth at gcc dot gnu dot org
2007-05-14 15:38 ` dberlin at dberlin dot org
2007-05-14 16:42 ` ian at airs dot com
2007-05-14 17:14 ` ian at airs dot com
2007-05-14 21:25 ` mmitchel at gcc dot gnu dot org
2007-05-14 21:36 ` ian at airs dot com
2007-05-14 21:37 ` pinskia at gcc dot gnu dot org
2007-05-14 21:40 ` dberlin at dberlin dot org
2007-05-16  5:33 ` ian at airs dot com
2007-05-16  9:57 ` rguenth at gcc dot gnu dot org
2007-05-16 12:06 ` rguenth at gcc dot gnu dot org
2007-05-16 13:49 ` rguenth at gcc dot gnu dot org
2007-05-16 14:02 ` rguenth at gcc dot gnu dot org
2007-05-16 14:37 ` rguenth at gcc dot gnu dot org
2007-05-16 16:08 ` rguenth at gcc dot gnu dot org
2007-05-16 17:02 ` ian at airs dot com
2007-05-16 23:42 ` mark at codesourcery dot com
2007-05-18  6:15 ` ian at airs dot com
2007-05-18  6:25 ` ian at airs dot com
2007-05-18  6:27 ` mark at codesourcery dot com
2007-05-18  8:46 ` rguenth at gcc dot gnu dot org
2007-05-18  8:47 ` rguenth at gcc dot gnu dot org
2007-05-18 13:26 ` gdr at cs dot tamu dot edu
2007-05-18 13:30 ` gdr at cs dot tamu dot edu
2007-05-18 13:46 ` rguenth at gcc dot gnu dot org
2007-05-18 16:25 ` ian at airs dot com
2007-05-18 16:28 ` ian at airs dot com
2007-05-18 21:04   ` Gabriel Dos Reis
2007-05-18 16:36 ` ian at airs dot com
2007-05-18 16:44 ` mark at codesourcery dot com
2007-05-18 17:38 ` ian at airs dot com
2007-05-18 21:12   ` Gabriel Dos Reis
2007-05-18 17:46 ` pcarlini at suse dot de
2007-05-18 17:55 ` pinskia at gcc dot gnu dot org
2007-05-18 18:01 ` mark at codesourcery dot com
2007-05-18 18:03 ` ian at airs dot com
2007-05-18 19:55 ` rguenth at gcc dot gnu dot org
2007-05-18 20:12 ` pcarlini at suse dot de
2007-05-18 20:17 ` mark at codesourcery dot com
2007-05-18 20:27 ` pcarlini at suse dot de
2007-05-18 20:38 ` pcarlini at suse dot de
2007-05-18 21:04 ` gdr at cs dot tamu dot edu
2007-05-18 21:12 ` gdr at cs dot tamu dot edu
2007-05-18 21:16 ` gdr at cs dot tamu dot edu
2007-05-18 21:17 ` gdr at cs dot tamu dot edu
2007-05-18 21:44 ` pcarlini at suse dot de
2007-05-22  9:50 ` rguenth at gcc dot gnu dot org
2007-05-22 15:05 ` mark at codesourcery dot com
2007-05-22 15:54   ` Gabriel Dos Reis
2007-05-22 15:20 ` rguenther at suse dot de
2007-05-22 15:55 ` gdr at cs dot tamu dot edu
2007-05-22 16:20 ` mark at codesourcery dot com
2007-05-22 16:25   ` Gabriel Dos Reis
2007-05-22 16:25 ` gdr at cs dot tamu dot edu
2007-05-22 16:38 ` mark at codesourcery dot com
2007-05-22 16:46   ` Gabriel Dos Reis
2007-05-22 16:47 ` gdr at cs dot tamu dot edu
2007-05-22 16:54 ` mark at codesourcery dot com
2007-05-22 17:02 ` gdr at cs dot tamu dot edu
2007-05-22 17:11 ` dberlin at dberlin dot org
2007-05-22 17:13 ` dberlin at dberlin dot org
2007-05-22 17:20 ` gdr at cs dot tamu dot edu
2007-05-22 17:34 ` mark at codesourcery dot com
2007-05-22 17:41 ` gdr at cs dot tamu dot edu
2007-05-22 17:55 ` mark at codesourcery dot com
2007-05-22 19:13 ` gdr at cs dot tamu dot edu
2007-05-22 19:42 ` mrs at apple dot com
2007-05-22 19:53 ` gdr at cs dot tamu dot edu
2007-05-23  8:35 ` rguenther at suse dot de
2007-05-23 13:23 ` gdr at cs dot tamu dot edu
2007-05-23 13:43 ` rguenther at suse dot de
2007-05-23 14:24 ` ian at airs dot com
2007-05-23 14:38 ` rguenther at suse dot de
2007-05-23 15:00 ` gdr at cs dot tamu dot edu
2007-05-23 15:43 ` ian at airs dot com
2007-05-23 15:55 ` rguenther at suse dot de
2007-05-23 18:03 ` dberlin at dberlin dot org
2007-05-23 18:44 ` mark at codesourcery dot com
2007-05-23 18:54 ` rguenth at gcc dot gnu dot org
2007-05-23 18:57 ` rguenth at gcc dot gnu dot org
2007-05-23 19:10 ` mark at codesourcery dot com
2007-05-23 19:46 ` rguenth at gcc dot gnu dot org
2007-05-23 19:57 ` rguenth at gcc dot gnu dot org
2007-05-23 20:01 ` joseph at codesourcery dot com
2007-05-23 20:07 ` mark at codesourcery dot com
2007-05-23 20:13 ` mark at codesourcery dot com
2007-05-23 20:16 ` rguenther at suse dot de
2007-05-23 20:27 ` mark at codesourcery dot com
2007-05-23 20:48 ` rguenther at suse dot de
2007-05-23 21:02 ` dberlin at dberlin dot org
2007-05-23 21:13 ` mark at codesourcery dot com
2007-05-23 22:42 ` gdr at cs dot tamu dot edu
2007-05-23 22:50 ` gdr at cs dot tamu dot edu
2007-05-23 22:56 ` gdr at cs dot tamu dot edu
2007-05-23 22:58 ` gdr at cs dot tamu dot edu
2007-05-23 23:58 ` gdr at cs dot tamu dot edu
2007-05-24  0:07 ` gdr at cs dot tamu dot edu
2007-05-24  8:04 ` rguenther at suse dot de
2007-05-24  9:08 ` rguenther at suse dot de
2007-05-24  9:11 ` rguenther at suse dot de
2007-05-24  9:29 ` gdr at cs dot tamu dot edu
2007-05-24  9:33 ` rguenther at suse dot de
2007-05-24  9:47 ` gdr at cs dot tamu dot edu
2007-05-25 23:22 ` ian at airs dot com
2007-05-27 14:57 ` rguenther at suse dot de
2007-05-28 11:14 ` rguenther at suse dot de
2007-05-28 11:24 ` dberlin at dberlin dot org
2007-05-28 17:30 ` ian at airs dot com
2007-05-30 23:19 ` ian at airs dot com
2007-06-04 14:02 ` rguenth at gcc dot gnu dot org
2007-06-05 16:20 ` rguenth at gcc dot gnu dot org
2007-06-05 20:48 ` ian at airs dot com
2007-06-05 21:17 ` rguenther at suse dot de
2007-06-06  5:33 ` ian at airs dot com
2007-06-06  8:41 ` rguenther at suse dot de
2007-06-08  7:50 ` ian at airs dot com
2007-06-08 13:47 ` rguenther at suse dot de
2007-06-09  9:48 ` rguenth at gcc dot gnu dot org
2007-06-09  9:55 ` pcarlini at suse dot de
2007-06-09 12:03 ` bkoz at gcc dot gnu dot org
2007-06-09 19:29 ` mark at codesourcery dot com
2007-06-12 17:48 ` ian at gcc dot gnu dot org
2007-06-12 18:11 ` ian at airs dot com
2010-06-20  0:01 ` schaub-johannes at web dot de

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).