[fpc-pascal] FPC 2.7.1 | ARMHF/ARMV6 | Optimization breaks my code at -O2
Bruce Tulloch
pascal at causal.com
Mon May 27 09:42:43 CEST 2013
What are the optimizations made between -O1 and -O2 on this target?
Are optimizations at this level materially different when comparing ARM to
x86 output targets?
I ask because enabling -O2 breaks my code on ARM but runs fine all the way
up to -O3 on x86.
It's no doubt something I'm doing wrong which -O2 is exposing so I thought
I'd ask if anyone can suggest what types of error are likely with building
with -O2.
Prima facie is looks like the object reference ("this" accessed via
register r0) is corrupt when execution enters this TACTOR_UPDATE (via an
Inherited call). The disassembly, cpu dump and "this reference" below show
this but it's not clear to me why or how.
Any suggestions welcome!
Thanks, Bruce.
(gdb) disass
Dump of assembler code for function TACTOR__UPDATE:
0x0006f450 <+0>: push {r4, r5, r6, r7, r8, r9, lr}
0x0006f454 <+4>: sub sp, sp, #4
0x0006f458 <+8>: mov r4, r0
0x0006f45c <+12>: mov r5, r1
0x0006f460 <+16>: mov r6, r2
0x0006f464 <+20>: mov r0, #0
0x0006f468 <+24>: bl 0x3b4a4 <fpc_stackcheck>
0x0006f46c <+28>: cmp r6, #7
0x0006f470 <+32>: bne 0x6f504 <TACTOR__UPDATE+180>
0x0006f474 <+36>: ldr r0, [r4, #68] ; 0x44
0x0006f478 <+40>: cmp r0, #0
0x0006f47c <+44>: beq 0x6f4ec <TACTOR__UPDATE+156>
0x0006f480 <+48>: ldr r0, [r4, #100] ; 0x64
0x0006f484 <+52>: cmp r0, r5
0x0006f488 <+56>: bne 0x6f4ec <TACTOR__UPDATE+156>
0x0006f48c <+60>: ldrb r0, [r4, #86] ; 0x56
0x0006f490 <+64>: cmp r0, #0
0x0006f494 <+68>: beq 0x6f4ec <TACTOR__UPDATE+156>
0x0006f498 <+72>: mov r7, #0
0x0006f49c <+76>: sub r7, r7, #1
0x0006f4a0 <+80>: and r7, r7, #255 ; 0xff
0x0006f4a4 <+84>: add r7, r7, #1
0x0006f4a8 <+88>: and r7, r7, #255 ; 0xff
0x0006f4ac <+92>: and r0, r7, #255 ; 0xff
0x0006f4b0 <+96>: ldr r1, [r4, #68] ; 0x44
0x0006f4b4 <+100>: mov r2, #1
0x0006f4b8 <+104>: tst r1, r2, lsl r0
0x0006f4bc <+108>: beq 0x6f4dc <TACTOR__UPDATE+140>
0x0006f4c0 <+112>: mov r2, r7
0x0006f4c4 <+116>: mov r1, r4
0x0006f4c8 <+120>: mov r0, r4
0x0006f4cc <+124>: mov r3, r4
0x0006f4d0 <+128>: ldr r3, [r3]
0x0006f4d4 <+132>: ldr r3, [r3, #256] ; 0x100
0x0006f4d8 <+136>: blx r3
0x0006f4dc <+140>: cmp r7, #25
0x0006f4e0 <+144>: bcc 0x6f4a4 <TACTOR__UPDATE+84>
0x0006f4e4 <+148>: mov r0, #0
0x0006f4e8 <+152>: str r0, [r4, #68] ; 0x44
0x0006f4ec <+156>: ldr r0, [r4, #104] ; 0x68
0x0006f4f0 <+160>: cmp r0, r5
0x0006f4f4 <+164>: bne 0x6f51c <TACTOR__UPDATE+204>
0x0006f4f8 <+168>: mov r0, #0
0x0006f4fc <+172>: str r0, [r4, #60] ; 0x3c
0x0006f500 <+176>: b 0x6f51c <TACTOR__UPDATE+204>
0x0006f504 <+180>: cmp r6, #2
0x0006f508 <+184>: bne 0x6f51c <TACTOR__UPDATE+204>
0x0006f50c <+188>: mov r1, r5
0x0006f510 <+192>: mov r0, r4
0x0006f514 <+196>: mov r2, #0
0x0006f518 <+200>: bl 0x6faac <TACTOR__SUBSCRIBE>
0x0006f51c <+204>: cmp r6, #6
0x0006f520 <+208>: bne 0x6f570 <TACTOR__UPDATE+288>
0x0006f524 <+212>: mov r0, r4
0x0006f528 <+216>: bl 0x6f764 <TACTOR__GETPARENT>
0x0006f52c <+220>: cmp r5, r0
0x0006f530 <+224>: bne 0x6f570 <TACTOR__UPDATE+288>
=> 0x0006f534 <+228>: ldrb r0, [r5, #86] ; 0x56
0x0006f538 <+232>: cmp r0, #0
0x0006f53c <+236>: beq 0x6f558 <TACTOR__UPDATE+264>
0x0006f540 <+240>: mov r0, r4
0x0006f544 <+244>: mov r1, r4
0x0006f548 <+248>: ldr r1, [r1]
0x0006f54c <+252>: ldr r1, [r1, #240] ; 0xf0
0x0006f550 <+256>: blx r1
0x0006f554 <+260>: b 0x6f614 <TACTOR__UPDATE+452>
0x0006f558 <+264>: mov r0, r4
0x0006f55c <+268>: mov r1, r4
0x0006f560 <+272>: ldr r1, [r1]
0x0006f564 <+276>: ldr r1, [r1, #244] ; 0xf4
0x0006f568 <+280>: blx r1
0x0006f56c <+284>: b 0x6f614 <TACTOR__UPDATE+452>
0x0006f570 <+288>: mov r0, r4
0x0006f574 <+292>: bl 0x119614
<CLASSES$_$TCOMPONENT_$__$$_GETCOMPONENTCOUNT$$LONGINT>
0x0006f578 <+296>: cmp r0, #0
0x0006f57c <+300>: ble 0x6f614 <TACTOR__UPDATE+452>
0x0006f580 <+304>: mov r0, r4
0x0006f584 <+308>: bl 0x119614
<CLASSES$_$TCOMPONENT_$__$$_GETCOMPONENTCOUNT$$LONGINT>
0x0006f588 <+312>: subs r7, r0, #1
0x0006f58c <+316>: bvc 0x6f594 <TACTOR__UPDATE+324>
0x0006f590 <+320>: bl 0x3b2c8 <fpc_overflow>
0x0006f594 <+324>: mov r8, #0
0x0006f598 <+328>: cmp r7, r8
0x0006f59c <+332>: blt 0x6f614 <TACTOR__UPDATE+452>
0x0006f5a0 <+336>: sub r8, r8, #1
0x0006f5a4 <+340>: add r8, r8, #1
0x0006f5a8 <+344>: mov r1, r8
0x0006f5ac <+348>: mov r0, r4
(gdb) info reg
r0 0xe 14
r1 0xb58af980 3045783936
r2 0x0 0
r3 0xb2a70 731760
r4 0xb5ad1e70 3048021616
r5 0xb58af980 3045783936
r6 0xb 11
r7 0x4 4
r8 0x0 0
r9 0xb5ad1e70 3048021616
r10 0x4d0d84 5049732
r11 0xbeffeadc 3204442844
r12 0xbeffea70 3204442736
sp 0xbeffea70 0xbeffea70
lr 0x6f578 456056
pc 0x6f580 0x6f580 <TACTOR__UPDATE+304>
cpsr 0x20000010 536870928
(gdb) p this
$19 = (TACTOR) 0xe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20130527/7bbe7c8d/attachment.html>
More information about the fpc-pascal
mailing list