[gnu.gcc.bug] gcc 1.28 optimization problem on m68k

karl@mstar.UUCP (Karl Fox) (09/23/88)

The following program is improperly optimized by gcc-1.28, using
config-m68k.h, m68k.md, output-m68k.h and our own test tm.h that
includes tm-m68k.h:

    % cat x.c
    int a = 0xE4;

    main()
        {
        register int b = a;

        printf("0x%X %d\n", b, (b & 0xF) + ((b >> 4) & 0xF));
        }

With -O, it prints "0xE4 2".  Without -O, it prints "0xE4 18", the
correct result.  Looking at the assembler shows that it assumed that
((b & 0xF) + ((b >> 4) & 0xF)) == (((b >> 4) + b) & 0xF):

    % gcc -v -O -S x.c
    gcc version 1.28
     /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dmasscomp -Dmc500 -Dunix -Dm68k -D_ATT -D__OPTIMIZE__ x.c /tmp/cca12047.cpp
    GNU CPP version 1.28
     /usr/local/lib/gcc-cc1 /tmp/cca12047.cpp -quiet -dumpbase x.c -O -version -o x.s
    GNU C version 1.28 (68k, MIT syntax) compiled by GNU C version 1.28.
    % cat x.s
    #NO_APP
    .globl _a
    .data
            .even
    _a:
            .long 228
    .text
    LC0:
            .ascii "0x%X %d\12\0"
            .even
    .globl _main
    _main:
            link a6,#0
            move.l d2,sp@-
            move.l _a,d0
            move.l d0,d1
            asr.l #4,d1
            add.l d0,d1
            moveq #15,d2
            and.l d2,d1
            move.l d1,sp@-
            move.l d0,sp@-
            pea LC0
            jbsr _printf
            move.l a6@(-4),d2
            unlk a6
            rts
-- 
Karl Fox, Morning Star Technologies ...!{att,osu-cis,pyramid}!mstar!karl