https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85300
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |segher at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- This breaks during combine. We have: (gdb) p debug_rtx (i3) (insn 68 67 69 7 (set (reg:SI 89 [ _3 ]) (fix:SI (reg/v:SF 90 [ a ]))) "pr85300.c":4 174 {fix_truncsfsi_sse} (expr_list:REG_DEAD (reg/v:SF 90 [ a ]) (nil))) (gdb) p debug_rtx (i2) (insn 63 62 64 7 (set (reg/v:SF 90 [ a ]) (float:SF (reg:SI 88 [ _2 ]))) "pr85300.c":8 203 {*floatsisf2_mixed} (expr_list:REG_DEAD (reg:SI 88 [ _2 ]) (nil))) (gdb) p debug_rtx (i1) (insn 62 61 63 7 (set (reg:SI 88 [ _2 ]) (const_int 256 [0x100])) "pr85300.c":8 86 {*movsi_internal} (nil)) and first subst it so that we get: (set (reg:SI 89 [ _3 ]) (fix:SI (float:SF (reg:SI 88 [ _2 ])))) and then subst r88 for 256 and get: (set (reg:SI 89 [ _3 ]) (const_int 256 [0x100])) That is fine. But, during that substitution we also modify the i2 pattern, making it invalid: (insn 63 62 64 7 (set (reg/v:SF 90 [ a ]) (float:SF (const_int 256 [0x100]))) "pr85300.c":8 203 {*floatsisf2_mixed} (expr_list:REG_DEAD (reg:SI 88 [ _2 ]) (nil))) because the FLOAT rtx was shared between PATTERN (i2) and newpat.