https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106892
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> --- -fno-gcse-lm fixes the testcase. The only difference from the bisected revision is (insn 56 55 57 15 (set (mem:SI (plus:DI (mult:DI (reg:DI 102) (const_int 4 [0x4])) - (reg/f:DI 99)) [1 f S4 A32]) + (reg/f:DI 99)) [1 f[_137]+0 S4 A32]) (reg:SI 105)) "t.c":19:21 -1 (nil)) and PRE then does -PRE GCSE of j, 23 basic blocks, 3800 bytes needed, 0 substs, 0 insns created +scanning new insn with uid = 106. +deleting insn with uid = 54. +PRE: redundant insn 54 (expression 5) in bb 15, reaching reg is 107 +PRE: edge (14,15), copy expression 5 +scanning new insn with uid = 107. +PRE GCSE of j, 23 basic blocks, 3848 bytes needed, 1 substs, 1 insns created it looks like RTL PRE hoists (insn 54 50 55 15 (set (reg:SI 106 [ MEM[(int *)_20 + 16B] ]) (mem:SI (plus:DI (reg/f:DI 86 [ _20 ]) (const_int 16 [0x10])) [1 MEM[(int *)_20 + 16B]+0 S4 A32])) "t.c":19:21 67 {*movsi_internal} (nil)) out of the loop, across (insn 56 55 57 15 (set (mem:SI (plus:DI (mult:DI (reg:DI 102) (const_int 4 [0x4])) (symbol_ref:DI ("f") [flags 0x2] <var_decl 0x7fb59de26e10 f>)) [1 f[_137]+0 S4 A32]) (reg:SI 105)) "t.c":19:21 67 {*movsi_internal} (expr_list:REG_DEAD (reg:SI 105) (expr_list:REG_DEAD (reg:DI 102) (expr_list:REG_DEAD (reg/f:DI 99) (nil))))) I will see why exactly.