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.

Reply via email to