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

Mikael Pettersson <mikpe at it dot uu.se> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rmansfield at qnx dot com

--- Comment #9 from Mikael Pettersson <mikpe at it dot uu.se> 2011-11-20 
16:36:19 UTC ---
It's caused by Ryan Mansfield's PR c++/29066 patch in r119403:
http://gcc.gnu.org/ml/gcc-cvs/2006-12/msg00020.html

Interestingly that bug was about comparisons of pointers to member functions on
ARM EABI, but on this PR's test case, which does a call via a pointer to a
member function, it causes a double-call instead:

--- pr50970.s-r119402   2011-11-20 16:56:45.000000000 +0100
+++ pr50970.s-r119403   2011-11-20 17:08:00.000000000 +0100
@@ -67,26 +67,45 @@
 _ZN9TestClass12testFunctionEv:
        .fnstart
 .LFB18:
-       @ args = 0, pretend = 0, frame = 8
+       @ args = 0, pretend = 0, frame = 16
        @ frame_needed = 0, uses_anonymous_args = 0
-       str     lr, [sp, #-4]!
-       .save {lr}
+       stmfd   sp!, {r4, lr}
+       .save {r4, lr}
 .LCFI2:
        ldr     r1, [r0, #4]
-       .pad #12
-       sub     sp, sp, #12
+       .pad #16
+       sub     sp, sp, #16
 .LCFI3:
+       mov     r4, r0
        tst     r1, #1
        ldrne   r2, [r0, r1, asr #1]
        ldrne   r3, [r0, #0]
-       addne   r1, r0, r1, asr #1
        ldreq   r3, [r0, #0]
-       addeq   r1, r0, r1, asr #1
+       addne   r1, r0, r1, asr #1
        ldrne   r3, [r2, r3]
+       addeq   r1, r0, r1, asr #1
+       add     r0, sp, #8
+       blx     r3
+       ldr     r3, [sp, #8]
+       cmp     r3, #0
+       beq     .L22
+.L20:
+       add     sp, sp, #16
+       ldmfd   sp!, {r4, pc}
+.L22:
+       ldr     r0, [r4, #4]
+       tst     r0, #1
+       movne   r3, r0, asr #1
+       ldrne   r1, [r4, r3]
+       ldrne   r2, [r4, #0]
+       addne   r0, r4, r3
+       addeq   r0, r4, r0, asr #1
+       ldrne   r3, [r1, r2]
+       ldreq   r3, [r4, #0]
+       mov     r1, r0
        mov     r0, sp
        blx     r3
-       add     sp, sp, #12
-       ldmfd   sp!, {pc}
+       b       .L20
 .LFE18:
        .fnend
        .size   _ZN9TestClass12testFunctionEv, .-_ZN9TestClass12testFunctionEv

For the above revisions I also needed to backport r119543 and r121574 to avoid
build errors.  YMMV.

Reply via email to