optimization/7247: copy constructor missing when inlining enabled for i386

Jason Merrill jason@redhat.com
Thu Jul 11 14:06:00 GMT 2002


>>>>> "H" == H J Lu <hjl@lucon.org> writes:

> Jason, it looks like your patch doesn't catch this one.

No, as the bug isn't related to the NRVO; this testcase doesn't have any
returns which would be affected.  Rather, it seems to be a dependency
tracking bug.  I can reproduce the bug by adding 'inline' to the definition
of incidence_matrix and compiling with -O -fschedule-insns2.  Without
-fschedule-insns2, the code leading up to the dump_op calls looks like

        movl    -96(%ebp), %eax
        movl    -92(%ebp), %edx
        movl    %eax, -52(%ebp)
        movl    %edx, -48(%ebp)
        leal    -96(%ebp), %eax
        movl    %eax, (%esp)
        call    pm::dump_op(pm::double_zero const&)
        leal    -52(%ebp), %eax
        movl    %eax, (%esp)
        call    pm::dump_op(pm::double_zero const&)

so the epsilon value is properly copied before it is dumped.  But with
scheduling, it looks like

        movl    -96(%ebp), %eax
        movl    %eax, -52(%ebp)
        leal    -96(%ebp), %eax
        movl    %eax, (%esp)
        call    pm::dump_op(pm::double_zero const&)
        leal    -52(%ebp), %eax
        movl    %eax, (%esp)
        call    pm::dump_op(pm::double_zero const&)

Which suggests that the scheduler incorrectly decides that the second word
wasn't used by the call and optimizes away the copy.  This bug, or a
similar one, seems still to be present in the trunk, though to see it you
also need to move the definition of the double_zero constructor outside the
class, so it is not inlined.

Jason



More information about the Gcc-bugs mailing list