http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52727
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rth at gcc dot gnu.org --- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-03-27 16:49:37 UTC --- Looks like a problem during CSA. Before *.csa we have (insn 18 is a stack adjustment after a call): (insn 18 17 19 2 (parallel [ (set (reg/f:SI 7 sp) (plus:SI (reg/f:SI 7 sp) (const_int 4 [0x4]))) (clobber (reg:CC 17 flags)) ]) pr52727.ii:29 251 {*addsi_1} (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_ARGS_SIZE (const_int 0 [0]) (nil)))) ... (insn 205 27 206 2 (set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8]) (reg:SI 0 ax [115])) pr52727.ii:31 43 {*pushsi2} (expr_list:REG_DEAD (reg:SI 0 ax [115]) (nil))) (insn 206 205 207 2 (set (reg:DF 8 st [112]) (plus:DF (float:DF (mem:SI (reg/f:SI 7 sp) [0 S4 A8])) (reg:DF 8 st [112]))) pr52727.ii:31 765 {*fop_df_2_i387} (nil)) (insn 207 206 171 2 (set (reg/f:SI 7 sp) (plus:SI (reg/f:SI 7 sp) (const_int 4 [0x4]))) pr52727.ii:31 245 {*leasi_2} (nil)) but then CSA decides to remove insn 18 and adjust insn 205, so that it no longer pushes the value, but stores it to *sp. Unfortunately it means REG_ARGS_SIZE is dropped, there is no REG_ARGS_SIZE note on insn 207. Insns 205/206/207 were introduced during split2. Not sure what to do though, adding REG_ARGS_SIZE notes in the ix86_free_from_memory and ix86_force_to_memory would mean we'd have to find out what the current REG_ARGS_SIZE depth at that point is. And to solve this in csa pass, we'd need to find out that if we are removing stack deallocation with REG_ARGS_SIZE note against later stack allocation without REG_ARGS_SIZE, there must be some following stack deallocation on which we would force REG_ARGS_SIZE note. Richard?