------- Additional Comments From pinskia at gcc dot gnu dot org 2005-08-10 00:05 ------- Confirmed, the rtl dumps at .combinea are almost the same except for: -(insn 45 44 46 3 (set (reg:SI 70 [ <variable>.savelines ]) - (mem/s:SI (plus:SI (reg/v/f:SI 59 [ screen ]) - (const_int 4012 [0xfac])) [5 <variable>.savelines+0 S4 A32])) 35 {*movsi_1} (nil) - (nil)) +(insn 39 38 40 3 (set (reg:SI 65 [ <variable>.num_ptrs ]) + (mem/s:SI (plus:SI (reg/f:SI 63 [ term ]) + (const_int 4028 [0xfbc])) [4 <variable>.num_ptrs+0 S4 A32])) 34 {*movsi_1} (insn_list: REG_DEP_TRUE 38 (nil)) + (expr_list:REG_DEAD (reg/f:SI 63 [ term ]) + (nil))) -(insn 46 45 47 3 (parallel [ - (set (reg:SI 71) - (mult:SI (mem/s:SI (plus:SI (reg/f:SI 68 [ term ]) - (const_int 4028 [0xfbc])) [5 <variable>.num_ptrs+0 S4 A32]) - (reg:SI 70 [ <variable>.savelines ]))) +(insn 40 39 41 3 (parallel [ + (set (reg:SI 64) + (mult:SI (reg:SI 65 [ <variable>.num_ptrs ]) + (mem/s:SI (plus:SI (reg/v/f:SI 59 [ screen ]) + (const_int 4012 [0xfac])) [4 <variable>.savelines+0 S4 A32]))) (clobber (reg:CC 17 flags)) - ]) 173 {*mulsi3_1} (insn_list:REG_DEP_TRUE 43 (insn_list:REG_DEP_TRUE 45 (nil))) - (expr_list:REG_DEAD (reg/f:SI 68 [ term ]) + ]) 182 {*mulsi3_1} (insn_list:REG_DEP_TRUE 39 (nil)) + (expr_list:REG_DEAD (reg:SI 65 [ <variable>.num_ptrs ]) (expr_list:REG_UNUSED (reg:CC 17 flags) - (expr_list:REG_DEAD (reg:SI 70 [ <variable>.savelines ]) - (nil))))) + (nil))))
Which is because we expand the multiply (from tree to rtl) as: (insn 38 36 39 (set (reg/f:SI 63) (mem/f/i:SI (symbol_ref:SI ("term") [flags 0x40] <var_decl 0xb7cf60b0 term>) [9 term+0 S4 A32])) -1 (nil) (nil)) (insn 39 38 40 (set (reg:SI 65) (mem/s:SI (plus:SI (reg/f:SI 63) (const_int 4028 [0xfbc])) [4 <variable>.num_ptrs+0 S4 A32])) -1 (nil) (nil)) (insn 40 39 41 (parallel [ (set (reg:SI 64) (mult:SI (reg:SI 65) (mem/s:SI (plus:SI (reg/v/f:SI 59 [ screen ]) (const_int 4012 [0xfac])) [4 <variable>.savelines+0 S4 A32]))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) before we actually expanded the load of the screen->savelines seperately: (insn 43 41 44 (set (reg/f:SI 68) (mem/f/i:SI (symbol_ref:SI ("term") [flags 0x40] <var_decl 0xb7cc8a8c term>) [9 term+0 S4 A32])) -1 (nil) (nil)) (insn 44 43 45 (set (reg:SI 69) (mem/s:SI (plus:SI (reg/f:SI 68) (const_int 4028 [0xfbc])) [5 <variable>.num_ptrs+0 S4 A32])) -1 (nil) (nil)) (insn 45 44 46 (set (reg:SI 70) (mem/s:SI (plus:SI (reg/v/f:SI 59 [ screen ]) (const_int 4012 [0xfac])) [5 <variable>.savelines+0 S4 A32])) -1 (nil) (nil)) (insn 46 45 47 (parallel [ (set (reg:SI 71) (mult:SI (reg:SI 69) (reg:SI 70))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) This is either a target problem for the expansion or a middle-end problem while expand, I am going to say a target issue. I think this was caused by: 2005-07-30 Jan Hubicka <[EMAIL PROTECTED]> * expr.c (expand_expr_real_1): Do not load mem targets into register. * i386.c (ix86_fixup_binary_operands): Likewise. (ix86_expand_unary_operator): Likewise. (ix86_expand_fp_absneg_operator): Likewise. * optabs.c (expand_vec_cond_expr): Validate dest. -- What |Removed |Added ---------------------------------------------------------------------------- CC| |hubicka at gcc dot gnu dot | |org Status|UNCONFIRMED |NEW Component|rtl-optimization |target Ever Confirmed| |1 GCC build triplet|i686-pc-linux-gnu | GCC host triplet|i686-pc-linux-gnu | Keywords| |missed-optimization Last reconfirmed|0000-00-00 00:00:00 |2005-08-10 00:05:55 date| | Summary|extra move generated on x86 |[4.1 Regression] extra move | |generated on x86 Target Milestone|--- |4.1.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23302