2011/6/24 Richard Henderson <r...@redhat.com>:
> On 06/23/2011 01:15 PM, Denis Chertykov wrote:
>>>   text    data     bss     dec     hex filename
>>>  10032      25       0   10057    2749 bld-avr-orig/gcc/z.o
>>>   5816      25       0    5841    16d1 bld-avr-new/gcc/z.o
>>
>> Richard, can you send me this z.c file ?
>> Right now I'm notice that new code is worse.
>
> That's gcc.c-torture/compile/950612-1.c.
>

I have founded that postreload optimizations can't handle results of
new L_R_A code.
I think that it's can be handled by CSE (postreload).

This is a fragment from 950612-1.c:

---------- you can skip it I have a short version below -------
(insn 5186 23 5187 2 (set (reg:HI 30 r30)
        (const_int 128 [0x80])) c950612-1.c:20 9 {*movhi}
     (nil))

(insn 5187 5186 5189 2 (set (reg:HI 30 r30)
        (plus:HI (reg:HI 30 r30)
            (reg/f:HI 28 r28))) c950612-1.c:20 21 {*addhi3}
     (expr_list:REG_EQUIV (plus:HI (reg/f:HI 28 r28)
            (const_int 128 [0x80]))
        (nil)))

(insn 5189 5187 2451 2 (set (mem/c:HI (plus:HI (reg:HI 30 r30)
                (const_int 1 [0x1])) [8 %sfp+129 S2 A8])
        (reg:HI 18 r18)) c950612-1.c:20 9 {*movhi}
     (nil))

(note 2451 5189 2537 2 NOTE_INSN_DELETED)

(note 2537 2451 1651 2 NOTE_INSN_DELETED)

(note 1651 2537 3180 2 NOTE_INSN_DELETED)

(note 3180 1651 5191 2 NOTE_INSN_DELETED)

(insn 5191 3180 5192 2 (set (reg:HI 30 r30)
        (const_int 128 [0x80])) c950612-1.c:132 9 {*movhi}
     (nil))

(insn 5192 5191 5071 2 (set (reg:HI 30 r30)
        (plus:HI (reg:HI 30 r30)
            (reg/f:HI 28 r28))) c950612-1.c:132 21 {*addhi3}
     (expr_list:REG_EQUIV (plus:HI (reg/f:HI 28 r28)
            (const_int 128 [0x80]))
        (nil)))

(insn 5071 5192 5073 2 (set (mem/c:HI (plus:HI (reg:HI 30 r30)
                (const_int 3 [0x3])) [8 %sfp+131 S2 A8])
        (reg/v/f:HI 8 r8 [orig:211 pc ] [211])) c950612-1.c:132 9 {*movhi}
     (nil))
------------------------------------------------------

Insns 5186,5187 equal to 5191,5192 and 5191,5192 can be removed, but
reload_cse_regs_1 operate only on one insn.

5186 Z=128
5187 Z=Y+128       ; REG_EQUIV Z=Y+128
5189 HI:[Z+1]=HI:R18
...(deleted insns)
5191 Z=128
5192 Z=Y+128       ; REG_EQUIV Z=Y+128

(5191,5192) really a one three addressing add Z=Y+128.
Insns (5191,5192) exists because AVR havn't 3 addressing add.
Insn 5191 destroy REG_EQUIV (it's right), but reload_cse_regs_1 can't
optimize insns 5191,5192.

Right now I have only one idea:
1. create peephole2 for joining such insns (5191,5192);
2. inside machine dependent pass rerun postreload and may be gcse2;
3. split joined insns to originals.

Denis.

Reply via email to