------- Comment #1 from amodra at bigpond dot net dot au 2008-06-27 01:52 ------- (insn 9 8 11 1 (set (reg/v/f:SI 119 [ p ]) (mem/u/c:SI (plus:SI (reg:SI 30 30) (const:SI (minus:SI (symbol_ref/u:SI ("*.LC2") [flags 0x2]) (symbol_ref:SI ("*.LCTOC1"))))) [5 S4 A8])) -1 (nil) (expr_list:REG_EQUAL (symbol_ref:SI ("myprint") [flags 0x1] <function_decl 0x40164300 myprint>) (nil)))
[snip] (call_insn 12 11 13 1 (parallel [ (call (mem:SI (reg/v/f:SI 119 [ p ]) [0 S4 A8]) (const_int 0 [0x0])) (use (const_int 0 [0x0])) (clobber (scratch:SI)) ]) -1 (nil) (nil) (expr_list:REG_DEP_TRUE (use (reg:SI 3 3)) (nil))) The first instruction is a GOT load of the function address, the second an indirect call. No problem there. Indirect calls for -msecure-plt don't need the GOT pointer to be valid. The trouble occurrs when combine substitutes the first insn into the second to get: (call_insn 12 11 13 0 (parallel [ (call (mem:SI (symbol_ref:SI ("myprint") [flags 0x1] <function_decl 0x40164300 myprint>) [0 S4 A8]) (const_int 0 [0x0])) (use (const_int 0 [0x0])) (clobber (scratch:SI)) ]) 402 {*call_nonlocal_sysv} (insn_list:REG_DEP_TRUE 11 (nil)) (expr_list:REG_UNUSED (scratch:SI) (expr_list:REG_DEAD (reg:SI 3 3) (nil))) (expr_list:REG_DEP_TRUE (use (reg:SI 3 3)) (nil))) Note that lack of anything marking r30 as used. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36634