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.