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.