http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47862
--- Comment #1 from Pat Haugen <pthaugen at gcc dot gnu.org> 2011-02-24 21:54:00 UTC --- Looks like the bogus spill/restore insns are being inserted via caller-save.c routines since IRA assigned volatile regs to pseudos which are live across a call. 190.sched1 dump for the example above (pseudo 352). (insn 180 177 182 12 (set (reg:V2DF 352 [ vect_var_.59 ]) (mult:V2DF (reg:V2DF 343 [ vect_var_.53 ]) (reg:V2DF 350 [ vect_cst_.60 ]))) spill.c:21 766 {*vsx_mulv2df3} (nil)) ... call expd2() (insn 185 184 186 12 (set (reg:V2DF 79 2) (reg:V2DF 352 [ vect_var_.59 ])) spill.c:21 756 {*vsx_movv2df} (expr_list:REG_DEAD (reg:V2DF 352 [ vect_var_.59 ]) (nil))) 191.ira dump, along with some additional info I dumped in caller-save:insert_one_insn() to show insn being inserted Popping a139(r352,l0) -- assign reg 43 (vector save) Inserting insn ... (set (mem/c:DI (plus:DI (reg/f:DI 113 sfp) (const_int 144 [0x90])) [9 S8 A64]) (reg:DI 43 11)) (vector restore) Inserting insn ... (set (reg:DI 43 11) (mem/c:DI (plus:DI (reg/f:DI 113 sfp) (const_int 144 [0x90])) [9 S8 A64])) ... before ... (insn 185 184 186 12 (set (reg:V2DF 79 2) (reg:V2DF 43 11 [orig:352 vect_var_.59 ] [352])) spill.c:21 756 {*vsx_movv2df} (expr_list:REG_DEAD (reg:V2DF 43 11 [orig:352 vect_var_.59 ] [352]) (nil))) ---final ira dump (insn 180 177 182 12 (set (reg:V2DF 43 11 [orig:352 vect_var_.59 ] [352]) (mult:V2DF (reg:V2DF 103 26 [orig:343 vect_var_.53 ] [343]) (reg:V2DF 44 12 [orig:350 vect_cst_.60 ] [350]))) spill.c:21 766 {*vsx_mulv2df3} (nil)) (insn 323 322 324 12 (set (mem/c:DI (plus:DI (reg/f:DI 1 1) (const_int 144 [0x90])) [9 S8 A64]) (reg:DI 43 11)) spill.c:21 405 {*movdi_internal64} (nil)) ... call expd2() (insn 326 184 185 12 (set (reg:DI 43 11) (mem/c:DI (plus:DI (reg/f:DI 1 1) (const_int 144 [0x90])) [9 S8 A64])) spill.c:21 405 {*movdi_internal64} (nil)) (insn 185 326 186 12 (set (reg:V2DF 79 2) (reg:V2DF 43 11 [orig:352 vect_var_.59 ] [352])) spill.c:21 756 {*vsx_movv2df} (nil))