------- Additional Comments From steven at gcc dot gnu dot org 2005-06-09 09:20 ------- Here is the initial RTL for the call to foo: (call_insn 44 20 45 (call_placeholder 40 31 22 27 (cond [ (const_string "normal") (sequence [ (insn 40 0 39 (set (reg:SI 63) (reg/v:SI 58 [ n ])) -1 (nil) (nil)) (insn 39 40 41 (parallel [ (set (reg/v:SI 58 [ n ]) (plus:SI (reg/v:SI 58 [ n ]) (const_int 1 [0x1]))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) (insn 41 39 42 (set (reg:SI 62) (reg:SI 63)) -1 (nil) (nil)) (insn 42 41 43 (set (reg:SI 5 di) (reg:SI 62)) -1 (nil) (nil)) (call_insn 43 42 0 (call (mem:QI (symbol_ref:DI ("foo") [flags 0x3] <function_decl 0x2a9592b9c0 foo>) [0 S1 A8]) (const_int 0 [0x0])) -1 (nil) (nil) (expr_list (use (reg:SI 5 di)) (nil))) ]) (const_string "tail_call") (sequence [ (note 31 0 32 NOTE_INSN_DELETED) (note 32 31 34 NOTE_INSN_DELETED) (insn 34 32 33 (set (reg:SI 61) (reg/v:SI 58 [ n ])) -1 (nil) (nil)) (insn 33 34 35 (parallel [ (set (reg/v:SI 58 [ n ]) (plus:SI (reg/v:SI 58 [ n ]) (const_int 1 [0x1]))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) (insn 35 33 36 (set (reg:SI 60) (reg:SI 61)) -1 (nil) (nil)) (insn 36 35 37 (set (reg:SI 5 di) (reg:SI 60)) -1 (nil) (nil)) (call_insn/j 37 36 38 (call (mem:QI (symbol_ref:DI ("foo") [flags 0x3] <function_decl 0x2a9592b9c0 foo>) [0 S1 A8]) (const_int 0 [0x0])) -1 (nil) (nil) (expr_list (use (reg:SI 5 di)) (nil))) (barrier 38 37 0) ]) (const_string "tail_recursion") (sequence [ (note 22 0 23 NOTE_INSN_DELETED) (note 23 22 25 NOTE_INSN_DELETED) (insn 25 23 26 (set (reg:SI 59) (reg/v:SI 58 [ n ])) -1 (nil) (nil)) (insn 26 25 24 (set (reg/v:SI 58 [ n ]) (reg:SI 59)) -1 (nil) (nil)) (insn 24 26 28 (parallel [ (set (reg/v:SI 58 [ n ]) (plus:SI (reg/v:SI 58 [ n ]) (const_int 1 [0x1]))) (clobber (reg:CC 17 flags)) ]) -1 (nil) (nil)) (jump_insn 28 24 29 (set (pc) (label_ref 27)) -1 (nil) (nil)) (barrier 29 28 30) (barrier 30 29 0) ]) ])) -1 (nil) (nil) (nil)) You have to set debug_call_placeholder_verbose = 1 in print-rtl.c to see what is going on.
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21964