https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64652
Bug ID: 64652 Summary: [SH] ICE when using -mdiv=call-fp Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: olegendo at gcc dot gnu.org Target: sh*-*-* Compiling the following example: int test (int a, int b, int c, int d) { return (a / b) + c + d; } with -O2 -m4 -ml -mdiv=call-fp results in: sh_tmp.cpp: In function 'test': sh_tmp.cpp:672:1: error: unrecognizable insn: } ^ (insn 50 30 12 (set (reg:SI 146 pr) (unspec:SI [ (reg:SI 154 fpscr0) ] UNSPEC_SFUNC)) sh_tmp.cpp:671 -1 (nil)) sh_tmp.cpp:672:1: internal compiler error: in num_delay_slots, at config/sh/sh.md:537 It looks like the SH mach pass expects the first "use" to be the GP reg that holds the sfunc address. Changing the order of the uses seems to fix the problem: Index: gcc/config/sh/sh.md =================================================================== --- gcc/config/sh/sh.md (revision 219623) +++ gcc/config/sh/sh.md (working copy) @@ -2402,8 +2402,8 @@ (clobber (reg:SI R4_REG)) (clobber (reg:SI R5_REG)) (clobber (reg:SI FPSCR_STAT_REG)) - (use (reg:SI FPSCR_MODES_REG)) - (use (match_operand:SI 1 "arith_reg_operand" "r"))] + (use (match_operand:SI 1 "arith_reg_operand" "r")) + (use (reg:SI FPSCR_MODES_REG))] "TARGET_FPU_DOUBLE && ! TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc") @@ -2674,8 +2674,8 @@ (clobber (reg:DF DR0_REG)) (clobber (reg:DF DR2_REG)) (clobber (reg:SI FPSCR_STAT_REG)) - (use (reg:SI FPSCR_MODES_REG)) - (use (match_operand:SI 1 "arith_reg_operand" "r"))] + (use (match_operand:SI 1 "arith_reg_operand" "r")) + (use (reg:SI FPSCR_MODES_REG))] "TARGET_FPU_DOUBLE && ! TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc")