http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50970
--- Comment #7 from Mikael Pettersson <mikpe at it dot uu.se> 2011-11-19 17:42:53 UTC --- Created attachment 25859 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25859 reduced test case Reduced test case. Running this on i686 shows a single call to func3 >/mnt/scratch/install47/bin/g++ -O2 -Wall pr50970.cc ; ./a.out TestClass::func3 from 0x8048553 but on ARM we see two calls from different locations: >/mnt/scratch/install47/bin/g++ -march=armv5te -mtune=arm10tdmi -O2 -Wall >pr50970.cc ; ./a.out TestClass::func3 from 0x8554 TestClass::func3 from 0x8590 Looking at the code for testFunction void TestClass::testFunction() { if ((this->*_myFunc3)() == 0) ; } we see not one but two indirect method calls (the blx insns): _ZN9TestClass12testFunctionEv: .fnstart .LFB16: @ args = 0, pretend = 0, frame = 16 @ frame_needed = 0, uses_anonymous_args = 0 stmfd sp!, {r4, lr} .save {r4, lr} ldr r1, [r0, #4] .pad #16 sub sp, sp, #16 tst r1, #1 ldrne r2, [r0, r1, asr #1] ldrne r3, [r0, #0] ldreq r3, [r0, #0] addeq r1, r0, r1, asr #1 addne r1, r0, r1, asr #1 ldrne r3, [r2, r3] mov r4, r0 mov r0, sp blx r3 ldr r3, [sp, #0] cmp r3, #0 beq .L14 .L7: add sp, sp, #16 ldmfd sp!, {r4, pc} .L14: ldr r1, [r4, #4] add r0, sp, #8 tst r1, #1 ldrne r2, [r4, r1, asr #1] ldrne r3, [r4, #0] ldreq r3, [r4, #0] addeq r1, r4, r1, asr #1 addne r1, r4, r1, asr #1 ldrne r3, [r2, r3] blx r3 b .L7