http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60438
--- Comment #15 from linzj <manjian2006 at gmail dot com> --- dir = merge_dir (dir, old_insns_match_p (0, i1, i2)); if (dir == dir_none || (!dir_p && dir != dir_both)) break; { print_rtl_single (stdout, i1); print_rtl_single (stdout, i2); printf ("dir = %d\n",dir); } outputs: (insn 14 13 53 3 (parallel [ (set (reg/f:SI 7 sp) (plus:SI (reg/f:SI 7 sp) (const_int 16 [0x10]))) (clobber (reg:CC 17 flags)) ]) 1.cpp:14 241 {*addsi_1} (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_ARGS_SIZE (const_int 0 [0]) (nil)))) (insn 38 55 39 4 (parallel [ (set (reg/f:SI 7 sp) (plus:SI (reg/f:SI 7 sp) (const_int 16 [0x10]))) (clobber (reg:CC 17 flags)) ]) 241 {*addsi_1} (expr_list:REG_UNUSED (reg:CC 17 flags) (expr_list:REG_ARGS_SIZE (const_int 0 [0]) (nil)))) dir = 1 That's exactly what should not be merged.