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.