https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67573
--- Comment #3 from Kazumoto Kojima <kkojima at gcc dot gnu.org> --- I've wrongly cut&paste call_value_pcrel. It's (define_insn_and_split "call_value_pcrel" [(set (match_operand 0 "" "=rf") (call (mem:SI (match_operand:SI 1 "symbol_ref_operand" "")) (match_operand 2 "" ""))) (use (reg:SI FPSCR_MODES_REG)) (use (reg:SI PIC_REG)) (clobber (reg:SI PR_REG)) (clobber (match_scratch:SI 3 "=&r"))] ... I think that the last clobber should be (clobber (match_scratch:SI 3 "=&r"))] i.e. the scratch register is early clobbered. With that change, it looks the wrong code go away. I'll come up with the tested patch for all similar *call_*pcrel insns.