https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106751
Segher Boessenkool <segher at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |segher at gcc dot gnu.org
--- Comment #7 from Segher Boessenkool <segher at gcc dot gnu.org> ---
For me (powerpc64-linux) it fails with
===
106751.c:10:1: error: flow control insn inside a basic block
(jump_insn 6 3 13 2 (parallel [
(asm_operands/v ("") ("") 0 []
[]
[
(label_ref:DI 9)
] 106751.c:5)
(clobber (reg:SI 98 ca))
]) "106751.c":5:3 -1
(expr_list:REG_UNUSED (reg:SI 98 ca)
(nil))
-> 9)
during RTL pass: loop2_invariant
===
That pass did
===
Set in insn 13 is invariant (0), cost 4, depends on
Decided to move invariant 0 -- gain 4
Invariant 0 moved without introducing a new temporary register
changing bb of uid 13
from 3 to 2
===
It moved the insn after a jump_insn, not a good idea:
===
(jump_insn 6 3 13 2 (parallel [
(asm_operands/v ("") ("") 0 []
[]
[
(label_ref:DI 9)
] 106751.c:5)
(clobber (reg:SI 98 ca))
]) "106751.c":5:3 -1
(expr_list:REG_UNUSED (reg:SI 98 ca)
(nil))
-> 9)
(insn 13 6 9 2 (set (reg:SI 119)
(const_int 0 [0])) "106751.c":9:28 562 {*movsi_internal1}
(nil))
;; succ: 3 [always] count:10631108 (estimated locally)
===
Maybe it does not see this is an unconditional jump insn?