[Bug c/29140] optimization -O2/-O3/-Os generate wrong instruction order

mingqiao dot wu at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Sep 20 01:23:00 GMT 2006



------- Comment #3 from mingqiao dot wu at gmail dot com  2006-09-20 01:22 -------
(In reply to comment #2)
> You are violating C aliasing rules here (try -Wstrict-aliasing):
>    return *(CTLFLOAT*)&bits;

Yes, -O2 turns on -fstrict-aliasing, and I saw many warnings like "warning:
dereferencing type-punned pointer will break strict-aliasing rules" without
specifying -Wstrict-aliasing explicitly because -Wall include it. I added
-Wstrict-aliasing to CFLAGS. The disassembly result is different but still not
correct. At 5e8 line, r3 is the latest value to return, but 574 line regard r2
is the return value. I noticed this warning did not appear in gcc-3.4.3. How
should I re-write such code to use -O2 correctly with gcc-4.1.1? Thanks.

00000560 <_CTL_Fixed2Float>:
 560:   e92d4010        stmdb   sp!, {r4, lr}
 564:   e2504000        subs    r4, r0, #0      ; 0x0
 568:   e24dd008        sub     sp, sp, #8      ; 0x8
 56c:   03a02000        moveq   r2, #0  ; 0x0
 570:   1a000002        bne     580 <_CTL_Fixed2Float+0x20>
 574:   e1a00002        mov     r0, r2
 578:   e28dd008        add     sp, sp, #8      ; 0x8
 57c:   e8bd8010        ldmia   sp!, {r4, pc}
 580:   e0240fc4        eor     r0, r4, r4, asr #31
 584:   e0400fc4        sub     r0, r0, r4, asr #31
 588:   ebfffffe        bl      0 <E3D_CLZ>
 58c:   e270200a        rsbs    r2, r0, #10     ; 0xa
 590:   42623000        rsbmi   r3, r2, #0      ; 0x0
 594:   41a00314        movmi   r0, r4, lsl r3
 598:   51a00254        movpl   r0, r4, asr r2
 59c:   e3500000        cmp     r0, #0  ; 0x0
 5a0:   03a035fe        moveq   r3, #1065353216 ; 0x3f800000
 5a4:   058d3004        streq   r3, [sp, #4]
 5a8:   0a00000c        beq     5e0 <_CTL_Fixed2Float+0x80>
 5ac:   e2823084        add     r3, r2, #132    ; 0x84
 5b0:   e20330ff        and     r3, r3, #255    ; 0xff
 5b4:   e1a02b83        mov     r2, r3, lsl #23
 5b8:   b2603000        rsblt   r3, r0, #0      ; 0x0
 5bc:   a1a03100        movge   r3, r0, lsl #2
 5c0:   b1a03103        movlt   r3, r3, lsl #2
 5c4:   e58d2004        str     r2, [sp, #4]
 5c8:   a3c304ff        bicge   r0, r3, #-16777216      ; 0xff000000
 5cc:   b3822102        orrlt   r2, r2, #-2147483648    ; 0x80000000
 5d0:   b3c304ff        biclt   r0, r3, #-16777216      ; 0xff000000
 5d4:   a3c00502        bicge   r0, r0, #8388608        ; 0x800000
 5d8:   b58d2004        strlt   r2, [sp, #4]
 5dc:   b3c00502        biclt   r0, r0, #8388608        ; 0x800000
 5e0:   e59d3004        ldr     r3, [sp, #4]
 5e4:   e59d2004        ldr     r2, [sp, #4]
 5e8:   e1833000        orr     r3, r3, r0
 5ec:   e58d3004        str     r3, [sp, #4]
 5f0:   eaffffdf        b       574 <_CTL_Fixed2Float+0x14>


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29140



More information about the Gcc-bugs mailing list