[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