https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71118
Uroš Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-05-15 CC| |segher at gcc dot gnu.org, | |ubizjak at gmail dot com Component|target |rtl-optimization Summary|[5 Regression] ftois |[5,6,7 Regression] ftois |instruction not emitted for |instruction not emitted for |float -> int bitcast |float -> int bitcast Ever confirmed|0 |1 --- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> --- Looks like a regression in the combine pass. When compiling f2i, 4.9 is able to combine: (insn 2 4 3 2 (set (reg/v:SF 72 [ f ]) (reg:SF 48 $f16 [ f ])) ftois.c:11 220 {*movsf} (expr_list:REG_DEAD (reg:SF 48 $f16 [ f ]) (nil))) (note 3 2 6 2 NOTE_INSN_FUNCTION_BEG) (insn 6 3 11 2 (set (reg:DI 74 [ f ]) (sign_extend:DI (subreg:SI (reg/v:SF 72 [ f ]) 0))) ftois.c:13 2 {*extendsidi2_1} (expr_list:REG_DEAD (reg/v:SF 72 [ f ]) (nil))) to: Trying 2 -> 6: Successfully matched this instruction: (set (reg:DI 74 [ f ]) (sign_extend:DI (subreg:SI (reg:SF 48 $f16 [ f ]) 0))) ... (insn 6 3 11 2 (set (reg:DI 74 [ f ]) (sign_extend:DI (subreg:SI (reg:SF 48 $f16 [ f ]) 0))) ftois.c:13 2 {*extendsidi2_1} (expr_list:REG_DEAD (reg:SF 48 $f16 [ f ]) (nil))) However, gcc version 5+ chickens out for some reason: Trying 2 -> 6: starting the processing of deferred insns ending the processing of deferred insns ... (insn 2 4 3 2 (set (reg/v:SF 71 [ f ]) (reg:SF 48 $f16 [ f ])) ftois.c:11 220 {*movsf} (expr_list:REG_DEAD (reg:SF 48 $f16 [ f ]) (nil))) (note 3 2 6 2 NOTE_INSN_FUNCTION_BEG) (insn 6 3 11 2 (set (reg:DI 73 [ f ]) (sign_extend:DI (subreg:SI (reg/v:SF 71 [ f ]) 0))) ftois.c:13 2 {*extendsidi2_1} (expr_list:REG_DEAD (reg/v:SF 71 [ f ]) (nil))) Confirmed as a rtl-optimization problem, combine expert CC'd.