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

Jens Maurer <jens.maurer at gmx dot net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #22164|0                           |1
        is obsolete|                            |

--- Comment #2 from Jens Maurer <jens.maurer at gmx dot net> 2010-10-26 
21:09:14 UTC ---
Created attachment 22165
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22165
file to reproduce the bug, now with all aliasing and memory allocation removed

Thanks for your comment.  I've uploaded a new test file that removes all memory
allocations and never ever stores something in this->data, so no aliasing
issues should arise.

Instead of "delete[]", I'm now calling an external function "h".  As usual,
I've removed the .cfi notes from the assembly quotes below.

bad compile:

$ g++  -S playground2.cxx -fverbose-asm -O2

    125         call    g(C const&, C&) #
    126 .LEHE0:
    127         movq    24(%rsp), %rdi  # c2.b_array.data, D.3401
    128         testq   %rdi, %rdi      # D.3401
    129         je      .L9     #,
    130 .LEHB1:
    131         call    h(char*)        #
    132 .LEHE1:
    133 .L9:
    134         movq    16(%rsp), %rdi  # c2.s.adr,
    135 .LEHB2:
    136         call    h(char*)        #
    137 .LEHE2:
    138         addq    $48, %rsp       #,
    141         popq    %rbx    #
    143         ret


good compile:

$ g++  -S playground2.cxx -fverbose-asm -O2 -fno-ipa-cp

    130         call    g(C const&, C&) #
    131 .LEHE0:
    132         movq    8(%rsp), %rbx   # c2.b_array.data, p
    133         testq   %rbx, %rbx      # p
    134         je      .L9     #,
    135         movq    16(%rsp), %r12  # c2.b_array.size, D.3387
    136         testq   %r12, %r12      # D.3387
    137         je      .L10    #,
    138         xorl    %ebp, %ebp      # i
    139         jmp     .L14    #
    140         .p2align 4,,10
    141         .p2align 3
    142 .L22:
    143         addq    $24, %rbx       #, p
    144 .L14:
    145         movq    (%rbx), %rdi    # p->char_array.data, D.3401
    146         testq   %rdi, %rdi      # D.3401
    147         je      .L12    #,
    148 .LEHB1:
    149         call    h(char*)        #
    150 .L12:
    151         addq    $1, %rbp        #, i
    152         cmpq    %rbp, %r12      # i, D.3387
    153         ja      .L22    #,
    154         movq    8(%rsp), %rbx   # c2.b_array.data, p
    155 .L10:
    156         movq    %rbx, %rdi      # p,
    157         call    h(char*)        #
    158 .LEHE1:
    159 .L9:
    160         movq    (%rsp), %rdi    # c2.s.adr,
    161 .LEHB2:
    162         call    h(char*)        #
    163 .LEHE2:
    164         addq    $32, %rsp       #,
    167         popq    %rbx    #
    169         popq    %rbp    #
    171         popq    %r12    #
    173         ret


As can be seen, the destructors on B::char_array are being called (as evidenced
by the loop calling "h"), as opposed to the bad compile, where this does not
happen.  The compile turns good under the same modifications as before.

Reply via email to