[Bug rtl-optimization/78342] [7 Regression] ICE in rtl_verify_bb_insns, at cfgrtl.c:2657 (error: flow control insn inside a basic block)
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Nov 21 13:39:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78342
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-11-21
CC| |jakub at gcc dot gnu.org,
| |segher at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I'd say the bug is in combine, which turns:
(insn 58 78 109 6 (set (reg:SI 178 [ r2+-3 ])
(const_int 1 [0x1])) "pr78342.c":23 373 {*movsi_internal1}
(nil))
(insn 109 58 61 6 (trap_if (eq (reg:SI 178 [ r2+-3 ])
(const_int 1 [0x1]))
(const_int 0 [0])) -1
(expr_list:REG_DEAD (reg:SI 178 [ r2+-3 ])
(nil)))
;; succ: 7 [100.0%] (FALLTHRU)
into:
(note 58 78 109 6 NOTE_INSN_DELETED)
(insn 109 58 61 6 (trap_if (const_int 1 [0x1])
(const_int 0 [0])) 602 {trap}
(nil))
;; succ: 7 [100.0%] (FALLTHRU)
While trap_if (something other than const1_rtx) is considered normal insn,
trap_if (const1_rtx) is considered a noreturn insn like noreturn call, that has
to terminate a bb. So I think what is wrong is that the corresponding bb still
has a successor, that edge should have been removed and cfg cleaned up.
Possibly if the bb contains conditional trap_if in the middle of the bb and
combiner changes it, we should also split the bb. Are there any other RTL
passes that turn conditional trap_if into unconditional?
More information about the Gcc-bugs
mailing list