[Bug target/50970] Function pointer dereferenced twice in if statement on Arm cpu
mikpe at it dot uu.se
gcc-bugzilla@gcc.gnu.org
Sun Nov 20 18:18:00 GMT 2011
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.
More information about the Gcc-bugs
mailing list