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

--- Comment #1 from foom at fuhm dot net 2012-05-16 04:10:59 UTC ---
Asm generated. Note that at no point is anything ever actually written to the
stack, only read from it:

0000000000000000 <main>:
   0:    83 3d 00 00 00 00 09     cmpl   $0x9,0x0(%rip)        # 7 <main+0x7>
   7:    48 8d 44 24 e8           lea    -0x18(%rsp),%rax
   c:    48 8d 54 24 d8           lea    -0x28(%rsp),%rdx
  11:    48 0f 4f c2              cmovg  %rdx,%rax
  15:    8b 00                    mov    (%rax),%eax
  17:    c3                       retq   


Making what ought to be a no-op change to the program, using class "A" instead
of "B", thus:
int main() {
    A a = A(10);
    a = std::min(a, A(data));
    return int(a);
}
causes the following, correctly working, asm to be generated. This is the same
output generated by adding "-fno-strict-aliasing" to the compile line for the
original program. See that it now does write values onto the stack locations
being read from.

(It also seems rather crazy to me that gcc doesn't optimize such a simple
program to use purely registers and no stack addresses, but I suppose that's a
different bug.)

0000000000000000 <main>:
   0:    8b 15 00 00 00 00        mov    0x0(%rip),%edx        # 6 <main+0x6>
   6:    48 8d 44 24 e8           lea    -0x18(%rsp),%rax
   b:    48 8d 4c 24 d8           lea    -0x28(%rsp),%rcx
  10:    c7 44 24 d8 0a 00 00     movl   $0xa,-0x28(%rsp)
  17:    00 
  18:    83 fa 09                 cmp    $0x9,%edx
  1b:    89 54 24 e8              mov    %edx,-0x18(%rsp)
  1f:    48 0f 4f c1              cmovg  %rcx,%rax
  23:    8b 00                    mov    (%rax),%eax
  25:    c3                       retq

Reply via email to